Depurando falhas de áudio no XAudio2
Falhas podem ocorrer no XAudio2, este tópico aborda como elas são relatadas e algumas abordagens para corrigi-las.
Esta visão geral aborda os seguintes tópicos:
- Causas de problemas de saída de áudio ou falhas
- Como o XAudio2 relata problemas
- Abordagens para corrigir problemas
- Tópicos relacionados
Causas de problemas de saída de áudio ou falhas
Falhas podem ocorrer na saída XAudio2 por vários motivos.
- Uma voz de origem XAudio2 está faminta. O cliente não está enviando áudio novo para ele com rapidez suficiente. Você obtém o silêncio porque ele não tem dados a serem reproduzidos.
- XAudio2 como um todo é sobrecarregado. Leva mais tempo que X ms para produzir X ms de áudio. Você recebe listas suspensas porque o XAudio2 não pode produzir dados tão rápido quanto o dispositivo de áudio precisa. Você pode estar executando muitas vozes ou efeitos por vez, fazendo muito trabalho em retornos de chamada XAudio2 ou fazendo chamadas à API XAudio2 com muita frequência.
- O thread de processamento de áudio está parando porque a implementação do cliente de algum retorno de chamada XAudio2 está fazendo coisas que podem bloquear o thread. Por exemplo, ele pode estar acessando o disco, sincronizando com outros threads ou chamando outras funções que podem bloquear. Use um thread em segundo plano de prioridade mais baixa que o retorno de chamada pode sinalizar para executar essas tarefas.
- O sistema como um todo está sobrecarregado. Outros threads em execução com a mesma prioridade ou prioridade mais alta do que o XAudio2 estão fazendo muito trabalho. Eles estão competindo com o thread de áudio por tempo de CPU.
Como o XAudio2 relata problemas
O XAudio2 pode comunicar falhas no build de depuração de várias maneiras.
Se uma voz estiver passando fome, XAudio2 mostrará uma mensagem nesta forma.
XAudio2: WARNING: Voice at 0xNNNNNNNN starved: no more source buffers are available, but no end-of-stream marker was received
Se o thread de áudio for executado por muito tempo, XAudio2 mostrará uma mensagem neste formulário.
XAudio2: WARNING: Spent Xms in audio thread; XAudio2 possibly overloaded
Normalmente, essa mensagem ocorre com a próxima mensagem.
Se o driver de áudio não puder ser alimentado com novos dados de áudio a tempo, XAudio2 mostrará uma mensagem neste formulário.
XAudio2: WARNING: Glitch at output sample X
Chamar IXAudio2::GetPerformanceData fornece dados de desempenho XAudio2, incluindo o número total de falhas desde que o mecanismo XAudio2 foi iniciado.
Abordagens para corrigir problemas
As possíveis maneiras de reduzir falhas de áudio incluem o seguinte.
No caso de falta de voz: aumente a quantidade de dados de áudio enfileirados em uma voz. Você pode usar IXAudio2SourceVoice::GetState para descobrir o número de buffers enfileirados a qualquer momento. Se você ainda vir erros de falta de voz, mas não puder ouvir nenhuma falha, verifique se está configurando XAUDIO2_BUFFER. Sinaliza para XAUDIO2_END_OF_STREAM no buffer final de um som. Isso informa ao XAudio2 que não espere que mais buffers estejam necessariamente disponíveis assim que este for concluído.
Nos outros casos:
- Reduza o número de vozes e efeitos ativos no grafo, especialmente efeitos caros, como reverb.
- Desabilite vozes e efeitos que você não está usando.
- Use os sinalizadores XAUDIO2_VOICE_NOSRC e XAUDIO2_VOICE_NOPITCH em IXAudio2::CreateSourceVoice, sempre que possível. A conversão de taxa de exemplo é cara.
- Reduza a taxa de exemplo de vozes individuais. Por exemplo, uma voz de submixagem que hospeda um efeito reverb pode ter uma taxa de exemplo menor do que a voz de origem enviada a ela. Sons como explosões e tiros que não precisam de alta fidelidade também podem ser registrados em taxas de exemplo mais baixas.
- Verifique se as implementações de retorno de chamada funcionam o mínimo possível e nunca bloqueiam.
- Faça menos chamadas para XAudio2. Os parâmetros de áudio geralmente não precisam ser atualizados para cada quadro de vídeo. Cada 30 ms ou mais é suficiente. Você deve eliminar chamadas redundantes, como configurar volume várias vezes em sucessão rápida.
- Reduza o uso geral da CPU do jogo.
Tópicos relacionados