Обратные вызовы в 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.
Как упоминалось ранее, крайне важно, чтобы предоставляемые клиентом реализации этих обратных вызовов возвращали как можно быстрее, предпочтительно в течение миллисекунда. Обратные вызовы выполняются в потоке обработки звука, и вся обработка прерывается до возврата обратного вызова. Задержка обратного вызова может легко вызвать проблемы со звуком.
Связанные темы