当用户在 Windows 上切换他们的播放设备时,我的音频播放就会waveOutWrite()
停止。有没有办法让它在其他设备上继续?
我WAVE_MAPPER
在waveOutOpen()
.
这是我要求的 WaveOutOpen() 代码:
WAVEFORMATEX waveFormat;
waveFormat.wFormatTag = WAVE_FORMAT_PCM; // Uncompressed sound format
waveFormat.nChannels = 2;
waveFormat.wBitsPerSample = 16;
waveFormat.nSamplesPerSec = 44100;
waveFormat.nBlockAlign = waveFormat.nChannels * ( waveFormat.wBitsPerSample / 8 );
waveFormat.nAvgBytesPerSec = waveFormat.nSamplesPerSec * waveFormat.nBlockAlign;
waveFormat.cbSize = 0;
// Open the audio device
MMRESULT mmresult = waveOutOpen( &waveOut, WAVE_MAPPER, &waveFormat, DWORD( WaveOutCallback ), (UINT) this, CALLBACK_FUNCTION );
if( mmresult != MMSYSERR_NOERROR )
{
printf( "Sound card cannot be opened (code %s).\n\n", std::to_string( mmresult ).c_str() );
return;
}
soundCardOpened = true;
更新:
打开声卡后,一直调用回调函数,我之前调用WaveOutCallback()
过,uMsg参数设置为MM_WOM_DONE
。这工作正常。但是,一旦我将声音设备切换到蓝牙扬声器,它就会停止播放音频并停止调用此回调函数。
void CALLBACK WaveOutCallback( HWAVEOUT hwo, UINT uMsg, DWORD_PTR dwInstance, DWORD_PTR dwParam1, DWORD_PTR dwParam2 )
{
printf( "WaveOutCallback %i %i\n", uMsg, rand() );
if( uMsg != WOM_DONE )
return;
// Audio is managed here (includes a call to WaveOutWrite())
ManageAudio();
}
蓝牙扬声器正在使用其他应用程序工作。
更新 2
我已经阅读了waveOutWrite()
发送WOM_DONE
到waveOutProc过程的内容,该过程在我的代码中被调用WaveOutCallback()
(如上所示)。
在我看来,一旦我切换设备,WOM_DONE
就不再为最后一个输出缓冲区调用。实际上,在最后WOM_DONE
一条消息之后,回调不再打印消息。
更新 3
我可能需要将我的waveOutWrite()
呼叫移到 之外waveOutProc()
,如以下参考中所述?
应用程序不应从回调函数内部调用任何系统定义的函数,除了
EnterCriticalSection
,LeaveCriticalSection
,midiOutLongMsg
,midiOutShortMsg
,OutputDebugString
,PostMessage
,PostThreadMessage
,SetEvent
,timeGetSystemTime
,timeGetTime
,timeKillEvent
, 和timeSetEvent
. 调用其他波函数会导致死锁。
https://docs.microsoft.com/en-us/previous-versions/dd743869(v=vs.85)