我有一个问题,我无法解决。我的应用程序应该能够在运行时切换默认音频设备。为实现这一目标,我使用的是DirectXTK的XAudio2。
我将IMMNotificationClient实现到我的音频类中,以便能够对默认设备更改做出反应。
例如,当默认设备更改时,我停止当前的源语音,重置音频引擎并再次启动源语音。一切都按预期工作。
然而,当我的默认设备是USB声卡并且在源语音播放期间我将其拔出时,应用程序会冻结。
原因是停止语音时源语音挂起。有时也会在刷新源缓冲区时。似乎在源语音正在使用音频设备时,源语音不再被停止。
有人遇到同样的问题并且能解决这个问题吗?
这是我用来重置音频引擎的功能。
HRESULT DX::XAudioEngine::ResetAudioDevice()
{
HRESULT hr = S_OK;
this->m_retryAudio = TRUE;
if (SUCCEEDED(hr) && m_pSourceVoice)
{
hr = m_pSourceVoice->Stop();
}
if (SUCCEEDED(hr))
{
hr = m_pSourceVoice->FlushSourceBuffers();
}
if (m_audEngine && m_pSourceVoice)
{
// Get the source voice back from the smart pointer
IXAudio2SourceVoice* ptmpSrcVoice = nullptr;
ptmpSrcVoice = m_pSourceVoice.release();
// Destroy the voice
ptmpSrcVoice->DestroyVoice();
}
m_audEngine->Reset(&m_waveFormat, NULL);
// Create source voice
IXAudio2SourceVoice* ptmpSrcVoice = nullptr;
m_audEngine->AllocateVoice(
(WAVEFORMATEX*)&m_waveFormat,
SoundEffectInstance_Default,
false,
&ptmpSrcVoice
);
// Add source voice to smart pointer
m_pSourceVoice.reset(ptmpSrcVoice);
// Set the input volume
if (this->m_inputVolume != 1.0f) {
hr = m_pSourceVoice->SetVolume(this->m_inputVolume);
}
hr = m_pSourceVoice->Start(0);
this->m_retryAudio = FALSE;
return hr;
}