1
    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 对象时)

4

1 回答 1

4

这是什么意思?

此错误代码称为“*AUDCLNT_E_CPUUSAGE_EXCEEDED*”,当音频引擎处理音频数据包的时间过长时会发生。这通常发生在音频引擎的 CPU 使用率超过某个阈值时。如果其 CPU 使用率超过此阈值,音频引擎将无法创建新流。

解决:用户

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

解决方案:编码器

请记住,您的音频代码执行的越多,所需的 CPU 周期就越多。如果您的 IXAudio2 设备在链中包含大量效果处理器、1000 个 SubmixVoice 和数百个 SourceVoice,那就像是自找麻烦。在您将手指指向 CPU 或系统级音频设备增强功能之前,请确保不仅仅是您的代码效率低下。

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

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

于 2014-03-06T18:23:05.757 回答