CreateMasteringVoice随机抛出HRESULT:0x88890017

时间:2014-02-25 22:23:56

标签: c++ windows-8 directx-11 xaudio2

    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对象时)它才会自行丢失

1 个答案:

答案 0 :(得分:3)

这是什么意思?

此错误代码称为“* 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使用情况,并通知用户降低设置中的通道数量(或者您可以让应用程序自动调整内容)或关闭某些系统级音频设备增强功能