1

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

0 回答 0