CreateMasteringVoice随机抛出HRESULT:0x88890017


m_audioEngine->CreateMasteringVoice(
&m_masteringVoice,
XAUDIO2_DEFAULT_CHANNELS,
sampleRate,
0,
NULL
)
);

m_audioEngine->CreateSourceVoice(
&implData->sourceVoice,
format,
0,
XAUDIO2_DEFAULT_FREQ_RATIO,
reinterpret_cast<IXAudio2VoiceCallback*>(&implData->callbackHander),
nullptr,
nullptr
)
);

当我戴上耳机时,上面的一个代码似乎总是运行良好。

如果我在没有耳机的情况下开始游戏,有时(并非总是)上述功能会失败它总是抛出相同的HRESULT:0x88890017

有什么想法吗?

如果我直接在这之后放一个断点,它似乎不会抛出错误。。。此任务是否异步运行?

编辑------------------------------

我的IXAudio2SourceVoice不断随机丢失

是什么导致它失去自我?

这就是我的程序崩溃的原因。。。

只有当耳机未插入时(创建XAudio2对象时)才会丢失

这是什么意思

此错误代码被称为"*AUDCLNT_E_CPUUSAGE_EXCEEDED*",当音频引擎处理音频数据包的时间过长时会出现此错误代码。这种情况通常发生在音频引擎的CPU使用量超过特定的侵入时。如果音频引擎的CPU使用率超过此阈值,它将无法创建新的流。

解决:用户

CPU的使用受到各种因素的影响,比如CPU的处理能力,比如你正在使用的频道数量,以及你在系统级别上启用的音频设备增强功能。一些可能的解决方案是确保有一个合适的CPU(检查最低系统要求规范),在应用程序/游戏设置中降低使用的频道数量,或者在操作系统中禁用一些系统级音频设备增强功能。对于后者,请检查任务管理器的CPU使用情况,如果其中一个可疑进程是"audiodg.exe",请进入"声音"控制面板,依次双击每个播放设备,进入"增强功能"选项卡,并选中"禁用所有增强功能"框。这将降低所需的CPU使用率,并解决您的问题。

解决:编码器

请记住,音频代码执行的操作越多,所需的CPU周期就越多。如果你有一个IXAudio2设备,它是由链中的大量效果处理器、1000个SubmixVoices和数百个SourceVoices创建的,那就像是在找麻烦。在你把手指指向CPU或系统级音频设备增强之前,一定要确保这不仅仅是你的代码效率低下。

您的大朋友是IXAudio2::GetPerformanceData,它将查询设备并为您填写XAUDIO2_PERFORMANCE_DATA结构。这将为您提供有关所使用的CPU周期的一些信息。很有可能你可以在这个错误真正发生之前拦截它。当你检测到大量CPU使用时,或者当错误实际发生时,这不一定是你的游戏/引擎/框架失败的原因。您可以重试。或者您可以调整SubmixVoices的数量。或者您可以选择不创建SourceVoice。或者,您可以暂时挂起音频/切换到空设备,并将所有这些通知用户。

您可以设置一个事件或回调来通知用户音频引擎中CPU的大量使用。这使应用程序能够通知用户CPU使用量过大,并通知用户降低设置中的通道数量(或者,您可以让应用程序自动调整)或关闭一些系统级音频设备增强功能。

最新更新