Я создаю аудиоплеер, который воспроизводит файлы «.wav», и у меня возникла проблема с функцией обратного вызова, вызываемой из waveOutOpen () API.
Открытие выходного аудиоустройства для воспроизведения:
MMRESULT mRes = waveOutOpen(m_hWO,WAVE_MAPPER,&wFmt,(DWORD)&waveOutProc,(DWORD)this, CALLBACK_FUNCTION);
Реализация функции обратного вызова:
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;
}
}
Проблема в том, что MM_WOM_DONE никогда не возникает, и функция обратного вызова никогда не вызывается после завершения воспроизведения файла. Если вместо функции обратного вызова необходимо использовать поток, может кто-нибудь дать мне простой пример того, как использовать поток обратного вызова (не найден в сети).
Также документация waveOutReset () предполагает, что он закрывает все буферы и возвращает систему, поэтому для обработки кнопки Stop в моем приложении я использовал функцию waveOutReset (), но это привело к зависанию приложения. Почему это происходит? Есть ли альтернативный способ остановить воспроизведение, когда буфер все еще находится в очереди на воспроизведение.