Поделиться через


Обратные вызовы XAudio2

XAudio2 может вызывать функции, предоставляемые клиентом, чтобы уведомить его асинхронно о некоторых событиях, происходящих в потоке обработки звука. Эти обратные вызовы могут быть глобальными или конкретными для заданного исходного голоса. Чтобы получить глобальные обратные вызовы подсистемы, клиент должен предоставить экземпляр класса, реализующего интерфейс IXAudio2EngineCallback при инициализации XAudio2. Для получения обратных вызовов исходного голосового вызова клиент должен предоставить экземпляр класса, реализующего интерфейс IXAudio2VoiceCallback при создании исходных голосов. Дополнительные сведения см. в разделе IXAudio2EngineCallback и IXAudio2VoiceCallback.

Необходимо тщательно реализовать обратные вызовы, чтобы избежать возникновения разрывов звука. При выполнении обратного вызова XAudio2 не может создавать звук. Задержки более чем в нескольких миллисекундах могут вызвать проблему звука. Задержки этого характера также создают выходные данные отладчика. Это означает потенциальные проблемы с производительностью. Как минимум, функции обратного вызова не должны выполнять следующие действия.

  • Доступ к жесткому диску или другому постоянному хранилищу
  • Создание дорогостоящих или блокирующих вызовов API
  • Синхронизация с другими частями клиентского кода
  • Требуется значительное использование ЦП

Если для разработки клиента требуется обратный вызов для активации таких действий, как перечисленные ранее, обратный вызов должен сигнализировать другому потоку клиента для выполнения этой работы. Это можно сделать с помощью простого механизма SetEvent или более сложных механизмов, таких как неблокировка очереди команд, потребляемой другим потоком.

IXAudio2EngineCallback

Класс IXAudio2EngineCallback содержит методы, уведомляющие клиента о событиях, происходящих в подсистеме XAudio2. Эти методы должны быть реализованы клиентом XAudio2. XAudio2 вызывает эти методы с помощью указателя интерфейса, предоставленного клиентом, с помощью метода IXAudio2::RegisterForCallbacks. Все эти методы возвращают void, а не HRESULT.

IXAudio2VoiceCallback

Класс IXAudio2VoiceCallback содержит методы, которые уведомляют клиента о том, когда определенные события происходят в определенном исходном голосе XAudio2. XAudio2 вызывает эти методы с помощью указателя интерфейса, предоставленного клиентом в IXAudio2::CreateSourceVoice. Как и IXAudio2EngineCallback, эти методы должны быть реализованы клиентом XAudio2 и возвращать void, а не HRESULT.

Как упоминалось ранее, важно, чтобы предоставляемые клиентом реализации этих обратных вызовов возвращались как можно быстрее, предпочтительно в миллисекундах. Обратные вызовы выполняются в потоке обработки звука, и все обработка прерывается до тех пор, пока обратный вызов не возвращается. Задержка обратного вызова может легко вызвать проблему с звуком.

обратных вызовов

Руководство по программированию XAudio2

How to: Use Source VoiceBacks

Практическое руководство. Использование обратных вызовов подсистемы

Практическое руководство. Потоковая передача звука с диска