Partilhar via


Blocos de dados de áudio

[O recurso associado a esta página, Waveform Audio, é um recurso legado. Foi substituído por WASAPI e Audio Graphs. WASAPI e Audio Graphs foram otimizados para Windows 10 e Windows 11. A Microsoft recomenda vivamente que o novo código utilize WASAPI e Audio Graphs em vez de Waveform Audio, sempre que possível. A Microsoft sugere que o código existente que usa as APIs herdadas seja reescrito para usar as novas APIs, se possível.]

O funções waveInAddBuffer e waveOutWrite exigem que os aplicativos aloquem blocos de dados para passar aos drivers de dispositivo para fins de gravação ou reprodução. Ambas as funções usam o estrutura de WAVEHDR para descrever seu bloco de dados.

Antes de usar uma dessas funções para passar um bloco de dados para um driver de dispositivo, você deve alocar memória para o bloco de dados e a estrutura de cabeçalho que descreve o bloco de dados. Os cabeçalhos podem ser preparados e despreparados usando as seguintes funções.

Função Descrição
waveInPrepareHeader Prepara um bloco de dados de entrada de áudio em forma de onda.
waveInUnprepareHeader Limpa a preparação em um bloco de dados de entrada de áudio em forma de onda.
waveOutPrepareHeader Prepara um bloco de dados de saída de áudio de forma de onda.
waveOutUnprepareHeader Limpa a preparação em um bloco de dados de saída de áudio em forma de onda.

 

Antes de passar um bloco de dados de áudio para um driver de dispositivo, você deve preparar o bloco de dados passando-o para waveInPrepareHeader ou waveOutPrepareHeader. Quando o driver de dispositivo terminar com o bloco de dados e retorná-lo, você deve limpar essa preparação passando o bloco de dados para waveInUnprepareHeader ou waveOutUnprepareHeader antes que qualquer memória alocada possa ser liberada.

A menos que os dados de entrada e saída de áudio em forma de onda sejam pequenos o suficiente para estarem contidos em um único bloco de dados, os aplicativos devem fornecer continuamente ao driver de dispositivo blocos de dados até que a reprodução ou gravação seja concluída.

Mesmo que um único bloco de dados seja usado, um aplicativo deve ser capaz de determinar quando um driver de dispositivo é concluído com o bloco de dados para que o aplicativo possa liberar a memória associada ao bloco de dados e à estrutura do cabeçalho. Há várias maneiras de determinar quando um driver de dispositivo é concluído com um bloco de dados:

  • Especificando uma função de retorno de chamada para receber uma mensagem enviada pelo driver quando terminar com um bloco de dados
  • Usando um retorno de chamada de evento
  • Especificando uma janela ou thread para receber uma mensagem enviada pelo driver quando terminar com um bloco de dados
  • Ao sondar o bit de WHDR_DONE no dwFlags membro do estrutura de WAVEHDR enviada com cada bloco de dados

Se um aplicativo não obter um bloco de dados para o driver de dispositivo quando necessário, pode haver uma lacuna audível na reprodução ou uma perda de informações gravadas recebidas. Isso requer pelo menos um esquema de buffer duplo — permanecendo pelo menos um bloco de dados à frente do driver de dispositivo.

Os tópicos a seguir descrevem maneiras de determinar quando um driver de dispositivo é concluído com um bloco de dados:

Usando uma função de retorno de chamada para processar mensagens de driver