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 *» и возникает, когда ядро обрабатывает слишком много времени для обработки аудиопакетов. Это обычно происходит, когда использование процессора звуковым движком превышает определенный порог. Звуковой движок не сможет создавать новые потоки, если его загрузка ЦП превысит этот порог.
Разрешение: пользователь
Использование ЦП зависит от различных факторов, таких как вычислительная мощность вашего ЦП, количество используемых вами каналов и, например, улучшения аудиоустройства, которые вы включили на системном уровне. Некоторыми возможными решениями являются обеспечение достойного процессора (проверьте спецификацию минимальных системных требований), в настройках приложения / игры уменьшите количество используемых каналов или отключите некоторые усовершенствования аудиоустройства системного уровня в вашей операционной системе. Для последнего проверьте ваш диспетчер задач на использование процессора, и если один из подозрительных процессов — «audiodg.exe», перейдите на панель управления звуком, дважды щелкните каждое из ваших воспроизводящих устройств по очереди, перейдите на вкладку «Улучшения», и установите флажок «отключить все улучшения». Это должно снизить требуемое использование процессора и решить вашу проблему.
Разрешение: Кодер
Имейте в виду, что чем больше ваш аудиокод делает, тем больше циклов ЦП ему потребуется. Если у вас есть устройство IXAudio2, созданное с кучей процессоров эффектов в цепочке, 1000 SubmixVoices и сотни SourceVoices, это все равно что напрашиваться на неприятности. Прежде чем указывать пальцем на процессор или на усовершенствования аудиоустройства системного уровня, убедитесь, что не только ваш код неэффективен.
Ваш большой друг здесь — IXAudio2 :: GetPerformanceData, который запросит устройство и заполнит для вас XAUDIO2_PERFORMANCE_DATA-структуру. Это дает вам некоторую информацию об используемых циклах процессора. Скорее всего, вы можете перехватить эту ошибку до того, как она произойдет. Когда вы обнаруживаете интенсивное использование ЦП или когда ошибка действительно возникает, это не обязательно является причиной сбоя в вашей игре / движке / фреймворке. Вы можете повторить попытку. Или вы можете настроить количество SubmixVoices. Или вы можете не создавать SourceVoice. Или вы можете временно приостановить аудио / переключение на нулевое устройство и сообщить пользователю обо всем этом.
Вы можете настроить событие или обратный вызов, чтобы проинформировать пользователя о высокой загрузке ЦП в аудио движке. Это позволяет приложению информировать пользователя об интенсивной загрузке ЦП и информировать пользователя о снижении количества каналов в настройках (в качестве альтернативы вы можете настроить приложение на автоматическую настройку) или отключить некоторые усовершенствования аудиоустройства системного уровня. ,
Других решений пока нет …