Retorno de chamadas XAudio2

O XAudio2 pode chamar funções fornecidas pelo cliente para notificá-lo de forma assíncrona de determinados eventos que ocorrem no thread de processamento de áudio. Esses retornos de chamada podem ser globais ou específicos de uma determinada voz de origem. Para receber retornos de chamada do mecanismo global, o cliente deve fornecer uma instância de uma classe implementando a interface IXAudio2EngineCallback ao inicializar o XAudio2. Para receber retornos de chamada de voz de origem, o cliente deve fornecer uma instância de uma classe implementando a interface IXAudio2VoiceCallback ao criar vozes de origem. Para obter mais detalhes, consulte IXAudio2EngineCallback e IXAudio2VoiceCallback.

Você deve implementar retornos de chamada cuidadosamente para evitar causar interrupções no áudio. Sempre que um retorno de chamada estiver em execução, o XAudio2 não poderá gerar nenhum áudio. Atrasos de mais de alguns milissegundos podem causar um problema de áudio. Atrasos dessa natureza também geram saída do depurador. Isso indica possíveis problemas de desempenho. No mínimo, as funções de retorno de chamada não devem fazer o seguinte:

  • Acessar o disco rígido ou outro armazenamento permanente
  • Fazer chamadas à API caras ou de bloqueio
  • Sincronizar com outras partes do código do cliente
  • Exigir um uso significativo da CPU

Se o design do cliente exigir um retorno de chamada para disparar ações como aquelas listadas anteriormente, o retorno de chamada deverá sinalizar um thread de cliente diferente para fazer o trabalho. Você pode fazer isso com um mecanismo SetEvent simples ou mecanismos mais sofisticados, como uma fila de comandos sem bloqueio consumida por outro thread.

IXAudio2EngineCallback

A classe IXAudio2EngineCallback contém métodos que notificam o cliente quando determinados eventos ocorrem no mecanismo XAudio2. Esses métodos devem ser implementados pelo cliente XAudio2. XAudio2 chama esses métodos por meio de um ponteiro de interface fornecido pelo cliente usando o método IXAudio2::RegisterForCallbacks . Todos esses métodos retornam void, em vez de um HRESULT.

IXAudio2VoiceCallback

A classe IXAudio2VoiceCallback contém métodos que notificam o cliente quando determinados eventos ocorrem em uma voz de origem XAudio2 específica. XAudio2 chama esses métodos por meio de um ponteiro de interface fornecido pelo cliente em IXAudio2::CreateSourceVoice. Assim como acontece com IXAudio2EngineCallback, esses métodos devem ser implementados pelo cliente XAudio2 e retornar void em vez de um HRESULT.

Conforme mencionado anteriormente, é crucial que as implementações fornecidas pelo cliente desses retornos de chamada retornem o mais rápido possível, preferencialmente dentro de um milissegundo. Os retornos de chamada são executados no thread de processamento de áudio e todo o processamento é interrompido até que o retorno de chamada retorne. Um atraso em um retorno de chamada pode facilmente causar um problema de áudio.

Retornos de chamada

Guia de Programação em XAudio2

Como: Usar retornos de chamadas de voz de origem

Como: Usar retornos de chamadas de dispositivo

Como: Fazer o streaming de um som do disco