2

当用户在 Windows 上切换他们的播放设备时,我的音频播放就会waveOutWrite()停止。有没有办法让它在其他设备上继续?

WAVE_MAPPERwaveOutOpen().

这是我要求的 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_DONEwaveOutProc过程的内容,该过程在我的代码中被调用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)

4

0 回答 0