XAudio2 - 删除活动音频设备时源语音挂起

时间:2018-02-01 09:19:41

标签: c++ windows directx xaudio2 directxtk

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

0 个答案:

没有答案