Probleme mit waveInProc



  • Hallo,

    ich schreibe gerade eine Applikation, die Daten von einer Soundkarte via WaveIn aufnehmen soll. Leider habe ich gerade einige Probleme mit waveInProc.

    Ich rufe waveInOpen mit CALLBACK_FUNCTION waveInProc auf.
    Die Callback-Funktion habe ich angelegt und diese wird, sobald
    der übergebene Puffer von der Soundkarte gefüllt wurde, auch
    korrekt aufgerufen.

    Leider habe ich in meiner CALLBACK_FUNCTION keinen Zugriff auf
    meine Member-Variablen, die ja auch meine WAVEHDR-Daten und Co enthält. 😞
    (Ich will ja die Daten von der Soundkarte wieder zurückbekommen).
    Ein Aufruf einer anderen Memberfunktion führt auch zu keinem Ergebnis.

    Meine Frage nun: Wie bewerkstellige ich, dass ich wie unten angegebenen Beispiel in WaveIn1SendBuffer Zugriff auf string1 und natürlich auch alle anderen Member-Variablen habe?

    Danke im voraus

    Gruß
    kk3003

    public:
    CString string1;
    string1 = "test";
    
    [...]
    
    // Open the wave device
    void CTestDlg::WaveInOpen()
    {
    waveInOpen( &hWaveIn1, m_cWaveInDevices1.GetCurSel(), &waveIn1format, (ULONG)waveIn1Proc, 0L, CALLBACK_FUNCTION );
    
    waveInPrepareHeader(hWaveIn1, &waveIn1Header1, sizeof(WAVEHDR));
    
    waveInAddBuffer(hWaveIn1, &waveIn1Header1, sizeof(WAVEHDR));
    
    waveInStart(hWaveIn1);
    
    }
    
    void CALLBACK waveIn1Proc(HWAVEIN hWaveIn1, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2)
    {
    	switch(uMsg)
    	{
    		case WIM_CLOSE:
    			break;
    
    		case WIM_DATA:
    			{
    				// pointer to mainDlg
    				CTestDlg *pDlg=(CTestDlg*)dwInstance;
    
    				pDlg->WaveIn1SendBuffer();
    
    			}
    			break;
    
    		case WIM_OPEN:
    			break;
    
    		default:
    			break;
    	}
    }
    
    void CTestDlg::WaveIn1SendBuffer()
    {
    MessageBox( string1 ); // ----> Hier kommt ein Access Violation Error :(
    }
    


  • weil du 0L übergibst?!



  • Hallo,

    danke schon mal für die prompte Antwort.

    MMRESULT waveInOpen(
      LPHWAVEIN       phwi,      
      UINT_PTR       uDeviceID,  
      LPWAVEFORMATEX pwfx,       
      DWORD_PTR      dwCallback, 
      DWORD_PTR      dwCallbackInstance, 
      DWORD          fdwOpen     
    );
    
    /*
    
    dwCallbackInstance
    
    User-instance data passed to the callback mechanism. This parameter is not used with the window callback mechanism.
    
    */
    

    Das "0L" steht doch dann für dwInstance. Da ich aber nur eine Instanz habe, sollte doch 0L Ok sein? 😕

    Danke für Info

    Gruß´
    kk3003



  • du musst this übergeben



  • 👍 👍 👍 👍 👍

    Perfekt. Man wird echt betriebsblind, wenn es nicht gleich auf das zweite Mal klappt und man nur rumstochert! 🙂

    waveInOpen( &hWaveIn1, m_cWaveInDevices1.GetCurSel(), &waveIn1format, (ULONG)waveIn1Proc, (ULONG)this, CALLBACK_FUNCTION );
    

    Das klappt problemlos!

    Danke nochmal.

    Gruß
    kk3003


Anmelden zum Antworten