0

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

例外箱

我不知道为什么,我已经设置了所有基本代码(初始化、掌握语音、音频组件、清除所有缓冲区并使用 ->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; }
}
4

2 回答 2

2

关于 XAudio2 需要记住的一个关键点是,很多功能都是异步的,并且应用程序开发人员负责保持源音频内存“活动”,直到 XAudio2 完成它。因此,您必须非常小心生命周期和关闭。

你可能想看看DirectX Tool Kit for Audio,它有一个基本的音频管理器和 XAudio2 的播放系统。

您描述的问题听起来很像 XAudio 2.7 的终身问题:有关详细信息和解决方法,请参阅此博客文章

支持 Windows Vista 没有太多价值,但 Windows 7 Service Pack 1 仍然需要使用 XAudio 2.7 和旧版 DirectX SDK旧版 DirectSetup REDIST。如果您的最低版本是 Windows 8.x 或 Windows 10,那么您可以指望 XAudio 2.8 或 2.9 作为操作系统的一部分提供。有关此处的详细信息,请参阅此博客文章

更新现在有一种方法可以在 Windows 7 上使用最新的 XAudio 2.9。请参阅Microsoft Docs

于 2019-05-11T21:09:58.373 回答
1

因此,我最终查看了 DirectX SDK 示例,发现 XAudio2 的初始化(和 deinit)需要另外两行,这在整个互联网上的所有 XAudio2 教程中基本上都没有提到

您需要调用“CoInitializeEx(0, COINIT_MULTITHREADED);” 在“XAudio2Create();”之前 和“CoUninitialize();” 发布 XAudio2 后。

于 2019-05-21T05:00:29.477 回答