我正在开发基于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; }
}
答案 0 :(得分:0)
要记住的关于XAudio2的关键一点是,许多功能都是异步的,并且应用程序开发人员负责使源音频内存保持“活动”状态,直到XAudio2完成为止。因此,您必须非常小心使用寿命和关闭时间。
您可能想看看DirectX Tool Kit for Audio,它具有用于XAudio2的基本音频管理器和播放系统。
您所描述的问题听起来很像XAudio 2.7的一生问题:有关详细信息和解决方法,请参见this blog post。
对Windows Vista的支持没有太多价值,但是Windows 7 Service Pack 1仍然需要使用XAudio 2.7和legacy DirectX SDK和legacy DirectSetup REDIST。如果最低版本是Windows 8.x或Windows 10,则可以依靠XAudio 2.8或2.9作为操作系统的一部分提供。有关此处的详细信息,请参见this blog post。
答案 1 :(得分:0)
因此,我最终查看了DirectX SDK示例,发现XAudio2的初始化(和取消初始化)还需要另外两行,而在整个Internet上所有XAudio2教程中基本上都没有提到 。
您需要调用“ CoInitializeEx(0,COINIT_MULTITHREADED);”在“ XAudio2Create();”之前和“ CoUninitialize();”释放XAudio2之后。