Dispositivos e tipos de dados

[O recurso associado a esta página, Waveform Audio, é um recurso herdado. Ele foi substituído por WASAPI e Grafos de Áudio. WASAPI e Grafos de Áudio 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.]

Esta seção descreve como trabalhar com dispositivos de áudio de forma de onda e inclui informações sobre como abri-los, fechá-los e consultá-los para obter seus recursos. Ele também descreve como controlar os dispositivos em um sistema usando identificadores de dispositivo e identificadores de dispositivo.

Abrindo dispositivos de saída Waveform-Audio

Use a função waveOutOpen para abrir um dispositivo de saída waveform-audio para reprodução. Essa função abre o dispositivo associado ao identificador de dispositivo especificado e retorna um identificador do dispositivo aberto gravando o identificador de um local de memória especificado.

Alguns computadores multimídia têm vários dispositivos de saída de áudio de forma de onda. A menos que você deseje abrir um dispositivo de saída de áudio de forma de onda específico em um sistema, use o sinalizador WAVE_MAPPER para o identificador do dispositivo quando abrir um dispositivo. A função waveOutOpen escolhe o dispositivo no sistema que é mais capaz de reproduzir o formato de dados especificado.

Consultando dispositivos de áudio

O Windows fornece as seguintes funções para determinar quantos dispositivos de um determinado tipo estão disponíveis em um sistema.

Função Descrição
auxGetNumDevs Recupera o número de dispositivos auxiliares de saída presentes no sistema.
waveInGetNumDevs Recupera o número de dispositivos de entrada waveform-audio presentes no sistema.
waveOutGetNumDevs Recupera o número de dispositivos de saída waveform-audio presentes no sistema.

 

Os dispositivos de áudio são identificados por um identificador de dispositivo. O identificador do dispositivo é determinado implicitamente a partir do número de dispositivos presentes em um sistema. Os identificadores de dispositivo variam de zero a um a menos do que o número de dispositivos presentes. Por exemplo, se houver dois dispositivos de saída waveform-audio em um sistema, os identificadores de dispositivo válidos serão 0 e 1.

Depois de determinar quantos dispositivos de um determinado tipo estão presentes em um sistema, você pode usar uma das funções a seguir para consultar os recursos de cada dispositivo.

Função Descrição
auxGetDevCaps Recupera os recursos de um dispositivo de saída auxiliar especificado.
waveInGetDevCaps Recupera os recursos de um dispositivo de entrada waveform-audio especificado.
Waveoutgetdevcaps Recupera os recursos de um dispositivo de saída waveform-audio especificado.

 

Cada uma dessas funções preenche uma estrutura com informações sobre os recursos de um dispositivo especificado. A tabela a seguir lista as estruturas que correspondem a cada uma dessas funções.

Função Estrutura
auxGetDevCaps AUXCAPS
waveInGetDevCaps WAVEINCAPS
Waveoutgetdevcaps WAVEOUTCAPS

 

Os formatos padrão são listados no membro dwFormats da estrutura WAVEOUTCAPS . Os dispositivos waveform-audio podem dar suporte a formatos não padrão. Para determinar se um formato específico (padrão ou não) é compatível com um dispositivo, você pode chamar a função waveOutOpen com o sinalizador WAVE_FORMAT_QUERY. Esse sinalizador não abre o dispositivo. Especifique o formato em questão na estrutura WAVEFORMATEX apontada pelo parâmetro pwfx passado para waveOutOpen.

Os dispositivos de saída waveform-audio variam nos recursos aos quais dão suporte. O membro dwSupport da estrutura WAVEOUTCAPS indica se um dispositivo dá suporte a recursos como alterações de volume e de tom.

Identificadores de dispositivo e identificadores de dispositivo

Cada função que abre um dispositivo de áudio especifica um identificador de dispositivo, um ponteiro para um local de memória e alguns parâmetros exclusivos para cada tipo de dispositivo. O local de memória é preenchido com um identificador de dispositivo. Use esse identificador de dispositivo para identificar o dispositivo de áudio aberto ao chamar outras funções de áudio.

A diferença entre identificadores e identificadores para dispositivos de áudio é sutil, mas importante:

  • Os identificadores de dispositivo são determinados implicitamente a partir do número de dispositivos presentes em um sistema. Esse número é obtido usando a função auxGetNumDevs, waveInGetNumDevs ou waveOutGetNumDevs .
  • Os identificadores de dispositivo são retornados quando os drivers de dispositivo são abertos usando a função waveInOpen ou waveOutOpen .

Não há funções que abram ou fechem dispositivos de áudio auxiliares. Os dispositivos de áudio auxiliares não precisam ser abertos e fechados como dispositivos de áudio de forma de onda porque não há nenhuma transferência de dados contínua associada a eles. Todas as funções auxiliares de áudio usam identificadores de dispositivo para identificar dispositivos.

tipos de dados de saída Waveform-Audio

Os tipos de dados a seguir são definidos para funções de saída waveform-audio.

Type Descrição
HWAVEOUT Manipule para um dispositivo de saída de áudio de forma de onda aberta.
WAVEFORMATEX Estrutura que especifica os formatos de dados compatíveis com um dispositivo de entrada waveform-audio específico. Essa estrutura também é usada para dispositivos de entrada waveform-audio.
WAVEHDR Estrutura usada como um cabeçalho para um bloco de dados de entrada waveform-audio. Essa estrutura também é usada para dispositivos de entrada waveform-audio.
WAVEOUTCAPS Estrutura usada para consultar os recursos de um dispositivo de saída waveform-audio específico.

 

Especificando formatos de dados Waveform-Audio

Quando você chamar a função waveOutOpen para abrir um driver de dispositivo para reprodução ou para consultar se o driver dá suporte a um formato de dados específico, use o parâmetro pwfx para especificar um ponteiro para uma estrutura WAVEFORMATEX que contém o formato de dados waveform-audio solicitado. WAVEFORMATEX substitui as estruturas WAVEFORMAT e PCMWAVEFORMAT .

Para dados de áudio separados em mais de dois canais ou que têm um tamanho de exemplo que não é um múltiplo de 8, você deve usar WAVEFORMATEXTENSIBLE. Essa estrutura simplesmente configura os bytes extras apontados pelo membro cbSize de WAVEFORMATEX para fornecer informações extras sobre o formato. WAVEFORMATEXTENSIBLE pode ser convertido como WAVEFORMATEX.

Há também dois formatos de área de transferência que você pode usar para representar dados de áudio: CF_WAVE e CF_RIFF. Use o formato CF_WAVE para representar dados em um dos formatos padrão, como PCM de 11 kHz ou 22 kHz. Use o formato CF_RIFF para representar formatos de dados mais complexos que não podem ser representados como arquivos de áudio de forma de onda padrão.

Gravando dados de Waveform-Audio

Depois de abrir com êxito um driver de dispositivo de saída de áudio de forma de onda, você pode começar a reproduzir um som. O Windows fornece a função waveOutWrite para enviar blocos de dados para dispositivos de saída waveform-audio.

Use a estrutura WAVEHDR para especificar o bloco de dados waveform-audio que você está enviando usando waveOutWrite. Essa estrutura contém um ponteiro para um bloco de dados bloqueado, o comprimento do bloco de dados e alguns sinalizadores. Esse bloco de dados deve ser preparado antes de usá-lo; para obter informações sobre como preparar um bloco de dados, consulte Blocos de Dados de Áudio.

Depois de enviar um bloco de dados para um dispositivo de saída usando waveOutWrite, você deve aguardar até que o driver do dispositivo seja concluído com o bloco de dados antes de liberá-lo. Se você estiver enviando vários blocos de dados, deverá monitorar a conclusão de blocos de dados para saber quando enviar blocos adicionais. Para obter mais informações sobre blocos de dados, consulte Blocos de Dados de Áudio.

Formato de dados de Waveform-Audio do PCM

O membro lpData da estrutura WAVEHDR aponta para os exemplos de dados de áudio de forma de onda. Para dados pcm de 8 bits, cada exemplo é representado por um único byte de dados não assinado. Para dados pcm de 16 bits, cada exemplo é representado por um valor assinado de 16 bits. A tabela a seguir resume os valores máximo, mínimo e de ponto médio para dados de áudio de forma de onda do PCM.

Formato de dados Valor máximo Valor mínimo Valor do ponto médio
PCM de 8 bits 255 (0xFF) 0 128 (0x80)
PCM de 16 bits 32.767 (0x7FFF) –32.768 (0x8000) 0

 

Empacotamento de dados do PCM

A ordem dos bytes de dados varia entre formatos de 8 e 16 bits e entre formatos mono e estéreo. A lista a seguir descreve o empacotamento de dados para os diferentes formatos de dados de áudio de forma de onda do PCM.

Formato de áudio de forma de onda do PCM Descrição
Mono de 8 bits Cada exemplo é 1 byte que corresponde a um único canal de áudio. A amostra 1 é seguida pelas amostras 2, 3, 4 e assim por diante.
Estéreo de 8 bits Cada exemplo é de 2 bytes. A amostra 1 é seguida pelas amostras 2, 3, 4 e assim por diante. Para cada exemplo, o primeiro byte é o canal 0 (o canal esquerdo) e o segundo byte é o canal 1 (o canal direito).
Mono de 16 bits Cada exemplo é de 2 bytes. A amostra 1 é seguida pelas amostras 2, 3, 4 e assim por diante. Para cada exemplo, o primeiro byte é o byte de baixa ordem do canal 0 e o segundo byte é o byte de alta ordem do canal 0.
Estéreo de 16 bits Cada exemplo é de 4 bytes. A amostra 1 é seguida pelas amostras 2, 3, 4 e assim por diante. Para cada exemplo, o primeiro byte é o byte de baixa ordem do canal 0 (canal esquerdo); o segundo byte é o byte de alta ordem do canal 0; o terceiro byte é o byte de baixa ordem do canal 1 (canal direito); e o quarto byte é o byte de alta ordem do canal 1.
Outras pessoas Cada exemplo está contido em um bloco que é um múltiplo de 4 bytes, mas os exemplos podem não estar alinhados a bytes. A organização dos canais é especificada por uma máscara. Para obter mais informações, consulte WAVEFORMATEXTENSIBLE.

 

Fechando dispositivos de saída de Waveform-Audio

Depois que a reprodução waveform-audio for concluída, chame waveOutClose para fechar o dispositivo de saída. Se waveOutClose for chamado enquanto um arquivo waveform-audio estiver sendo reproduzido, a operação de fechamento falhará e a função retornará um código de erro indicando que o dispositivo não foi fechado. Se você não quiser esperar a reprodução terminar antes de fechar o dispositivo, chame a função waveOutReset antes de fechar. Isso encerra a reprodução e permite que o dispositivo seja fechado. Use a função waveOutUnprepareHeader para limpo a preparação em todos os blocos de dados antes de fechar o dispositivo.