DirectX SDK 2010 年 6 月:XAudio2 在每次应用程序退出时崩溃

DirectX SDK June 2010 : XAudio2 crashes on every app exit

我正在开发基于 Direct3D 9 和 XAudio 2.7 的 C++ 游戏引擎。每次退出测试游戏时,我都会遇到同样的问题:XAudio 崩溃。我确定是这个特定组件导致了问题,因为当我删除对初始化的调用时,游戏退出时没有任何问题。

Exception box

我不知道为什么,我已经设置了所有基本代码(初始化、掌握语音、音频组件、清除所有缓冲区并使用 ->Release(); 关闭),尝试使用和不使用 XAudio 3D ...

如果您已经遇到过,欢迎您提供帮助。 谢谢

我是 运行 Windows 10 Pro 64 位

代码:

AudioEngineXA2::AudioEngineXA2()
{
    m_xaudio2 = 0;
    m_xa2MasteringVoice = 0;

    m_x3d = 0;
}

void AudioEngineXA2::initialize()
{
    if ( XAudio2Create( &m_xaudio2, 0 ) < 0 || m_xaudio2->CreateMasteringVoice( &m_xa2MasteringVoice ) < 0 )
    {
        cout << "XAudio2 initialization failed!" << endl;
        return;
    }

    //X3DAudioInitialize( SPEAKER_STEREO, X3DAUDIO_SPEED_OF_SOUND, (unsigned char*) m_x3d );

    // Uncommenting this part doesn't help either
    /*XAUDIO2_DEVICE_DETAILS* devdet = 0;
    m_xaudio2->GetDeviceDetails(0, devdet);

    float* matrix = new float[devdet->OutputFormat.Format.nChannels];
    DSPSettings.SrcChannelCount = 1;
    DSPSettings.DstChannelCount = devdet->OutputFormat.Format.nChannels;
    DSPSettings.pMatrixCoefficients = matrix;*/
}

void AudioEngineXA2::cleanup()
{
    m_xa2MasteringVoice->DestroyVoice();

    m_xaudio2->StopEngine();
    m_xaudio2->Release();
    //if ( m_x3d ) { delete[] m_x3d; m_x3d = 0; }
}

关于 XAudio2 要记住的一个关键事情是很多功能是异步的,应用程序开发人员负责保持源音频内存 'alive' 直到 XAudio2 完成它。因此,您必须非常小心生命周期和关机。

You might want to take a look at DirectX Tool Kit for Audio which has a basic audio manager and playback system for XAudio2.

您描述的问题听起来很像 XAudio 2.7 的这个生命周期问题:有关详细信息和解决方法,请参阅 this blog post

支持 Windows Vista 的价值不大,但是 Windows 7 Service Pack 1 仍然需要使用 XAudio 2.7 和 legacy DirectX SDK and the legacy DirectSetup REDIST. If your minimum was Windows 8.x or Windows 10, then you could count on XAudio 2.8 or 2.9 being available as part of the OS. For the details here, see this blog post

更新 现在可以在 Windows 7 上使用最新的 XAudio 2.9。参见 Microsoft Docs

所以我最终查看了 DirectX SDK 示例,发现 XAudio2 的初始化(和取消初始化)需要另外两行 基本上在 none 在整个互联网上的所有 XAudio2 教程中.

您需要在 "XAudio2Create();" 之前调用 "CoInitializeEx( 0, COINIT_MULTITHREADED );" 并在释放 XAudio2 之后调用 "CoUninitialize();"。