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
- Usando uma função de retorno de chamada para processar mensagens de driver
- Usando um retorno de chamada de evento para processar mensagens de driver
- Usando uma janela ou thread para processar mensagens de driver
- Gerenciando blocos de dados por sondagem