2012-04-03 8 views
0

Ich baue einen Audio-Player, der '. WAV' Dateien spielt und ich habe ein Problem mit der Callback-Funktion von waveOutOpen() API aufgerufen.Callback-Funktion in waveOutOpen() API

das Ausgangsaudiogerät für die Wiedergabe Öffnungs:

MMRESULT mRes = waveOutOpen(m_hWO,WAVE_MAPPER,&wFmt,(DWORD)&waveOutProc,(DWORD)this, CALLBACK_FUNCTION); 

Implementierung von Callback-Funktion:

void CPlayWave::waveOutProc(HWAVEOUT m_hWO,UINT uMsg,DWORD dwInstance, DWORD dwParam1, DWORD dwParam2) 
{ 
    MMRESULT mmRes; 
    CPlayWave *pPW = (CPlayWave*)dwInstance; 
    switch(uMsg) 
    { 
    case MM_WOM_DONE:  //playback finished 
     mmRes = waveOutUnprepareHeader(m_hWO, &pPW->m_WHdr, sizeof(WAVEHDR)); 
     if(mmRes!=MMSYSERR_NOERROR) 
     { 
      //error handling 
      ..... 
     } 
     mmRes = waveOutClose(m_hWO); 
     if(mmRes!=MMSYSERR_NOERROR) 
     { 
      //error handling 
      ..... 
     } 
     AfxMessageBox("Finished playing the file"); 
     m_bPlay = FALSE;  //boolean flag used for pausing 
     break; 
    case WIM_DATA: 
     //for recording completion 
     break; 
    } 
} 

Das Problem ist die MM_WOM_DONE nie auftritt und die Callback-Funktion wird nie nach der Wiedergabe der angerufene Datei ist abgeschlossen. Wenn ein Thread anstelle der Callback-Funktion verwendet werden soll, kann mir jemand ein einfaches Beispiel geben, wie man einen Callback-Thread verwendet (nicht im Netz gefunden).

Auch schlägt die waveOutReset() -Dokumentation vor, dass alle Puffer geschlossen und zum System zurückgekehrt werden. Um die Stop-Schaltfläche in meiner Anwendung zu bearbeiten, habe ich die waveOutReset() -Funktion verwendet, die die Anwendung jedoch einfriert. Warum passiert dies? Gibt es eine alternative Methode, die Wiedergabe zu stoppen, während sich der Puffer für die Wiedergabe noch in der Warteschlange befindet?

Antwort

1

Callback-Funktion kann wahrscheinlich nicht eine Methode Ihrer Klasse CPlayWave selbst sein. Es muss eine einfache Funktion außerhalb Ihrer Klasse mit dem angeforderten Prototyp sein.

void CALLBACK waveOutProc(HWAVEOUT m_hWO, UINT uMsg, DWORD_PTR dwInstance, DWORD_PTR dwParam1, DWORD_PTR dwParam2) { 
    ... 
} 

Es muss natürlich deklariert/definiert sein, bevor Sie waveOutOpen() aufrufen. Außerdem ist der Funktionsname der Zeiger selbst und das Und-Zeichen & wird nicht benötigt. Daher sollte waveOutOpen() aufgerufen werden:

MMRESULT mRes = waveOutOpen(m_hWO, WAVE_MAPPER, &wFmt, (DWORD_PTR) waveOutProc, (DWORD_PTR) this, CALLBACK_FUNCTION | WAVE_ALLOWSYNC);