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?