Blocos de dados de áudio

[O recurso associado a esta página, Waveform Audio, é um recurso herdado. Ele foi substituído por WASAPI e Audio Graphs. WASAPI e Audio Graphs foram otimizados para Windows 10 e Windows 11. A Microsoft recomenda fortemente que o novo código use WASAPI e Audio Graphs em vez de Waveform Audio, quando 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.]

As funções waveInAddBuffer e waveOutWrite exigem que os aplicativos aloquem blocos de dados para passar para os drivers de dispositivo para fins de gravação ou reprodução. Ambas as funções usam a estrutura 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 funções a seguir.

Função Descrição
Waveinprepareheader Prepara um bloco de dados de entrada de áudio de forma de onda.
waveInUnprepareHeader Limpa a preparação em um bloco de dados de entrada de áudio de 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 de 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 do dispositivo for concluído com o bloco de dados e o retornar, você deverá limpo 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 de forma de onda sejam pequenos o suficiente para serem 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 de 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 ela for concluída 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 ela for concluída com um bloco de dados
  • Sondando o WHDR_DONE bit no membro dwFlags da estrutura WAVEHDR enviada com cada bloco de dados

Se um aplicativo não receber um bloco de dados para o driver de dispositivo quando necessário, poderá haver uma lacuna audível na reprodução ou uma perda de informações registradas de entrada. Isso requer pelo menos um esquema de buffer duplo , permanecendo pelo menos um bloco de dados à frente do driver do 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