我有一个我无法解决的问题。我的应用程序应该能够在运行时切换默认音频设备。为了实现这一点,我使用了 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;
}