Partilhar via


Dispositivos e tipos de dados

[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.]

Esta seção descreve o trabalho com dispositivos de áudio de forma de onda e inclui informações sobre como abri-los, fechá-los e consultá-los quanto aos seus recursos. Ele também descreve como manter o controle dos 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 de áudio em forma de onda para reprodução. Esta 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 em forma de onda. A menos que você queira abrir um dispositivo de saída de áudio de forma de onda específico em um sistema, você deve usar o sinalizador WAVE_MAPPER para o identificador de dispositivo quando você abre 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 de saída auxiliares presentes no sistema.
waveInGetNumDevs Recupera o número de dispositivos de entrada de áudio em forma de onda presentes no sistema.
waveOutGetNumDevs Recupera o número de dispositivos de saída de áudio em forma de onda 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 num sistema. Os identificadores de dispositivos variam de zero a um a menos do que o número de dispositivos presentes. Por exemplo, se houver dois dispositivos de saída de áudio em forma de onda 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 seguintes funções 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 de áudio de forma de onda especificado.
waveOutGetDevCaps Recupera os recursos de um dispositivo de saída de áudio de forma de onda 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 dwFormats membro da estrutura WAVEOUTCAPS. Os dispositivos de áudio em forma de onda podem suportar formatos não padrão. Para determinar se um determinado formato (padrão ou não padrão) é suportado por um dispositivo, você pode chamar a função waveOutOpen com o sinalizador WAVE_FORMAT_QUERY. Este sinalizador não abre o dispositivo. Você especifica o formato em questão na estrutura deWAVEFORMATEX apontada pelo parâmetro pwfx passado para waveOutOpen.

Os dispositivos de saída de áudio em forma de onda variam nas capacidades suportadas. O dwSupport membro da estrutura de WAVEOUTCAPS indica se um dispositivo suporta recursos como alterações de volume e 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 que são exclusivos para cada tipo de dispositivo. O local da memória é preenchido com uma alça de dispositivo. Use esta alça 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:

Não existem 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 em forma de onda porque não há transferência contínua de dados associada a eles. Todas as funções de áudio auxiliares usam identificadores de dispositivo para identificar dispositivos.

Waveform-Audio Tipos de dados de saída

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

Tipo Descrição
HWAVEOUT Manipule um dispositivo de saída de áudio em forma de onda aberta.
WAVEFORMATEX Estrutura que especifica os formatos de dados suportados por um determinado dispositivo de entrada de áudio em forma de onda. Esta estrutura também é usada para dispositivos de entrada de áudio em forma de onda.
WAVEHDR Estrutura usada como cabeçalho para um bloco de dados de entrada de áudio em forma de onda. Esta estrutura também é usada para dispositivos de entrada de áudio em forma de onda.
WAVEOUTCAPS Estrutura usada para consultar os recursos de um determinado dispositivo de saída de áudio em forma de onda.

 

Especificando Waveform-Audio formatos de dados

Quando você chamar a função waveOutOpen para abrir um driver de dispositivo para reprodução ou para consultar se o driver suporta um formato de dados específico, use o parâmetro pwfx para especificar um ponteiro para uma estrutura deWAVEFORMATEXque contém o formato de dados de áudio de forma de onda solicitado. WAVEFORMATEX substitui o WAVEFORMAT e estruturas PCMWAVEFORMAT.

Para dados de áudio separados em mais de dois canais ou com um tamanho de amostra que não seja um múltiplo de 8, você deve usar WAVEFORMATEXTENSIBLE. Esta estrutura simplesmente configura os bytes extras apontados pelo cbSize membro de WAVEFORMATEX para fornecer informações extras sobre o formato. WAVEFORMATEXTENSIBLE pode ser 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.

Escrevendo dados Waveform-Audio

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

Use a estrutura de 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. Este bloco de dados deve ser preparado antes de ser utilizado; Para obter informações sobre como preparar um bloco de dados, consulte Audio Data Blocks.

Depois de enviar um bloco de dados para um dispositivo de saída usando waveOutWrite, você deve esperar até que o driver de dispositivo termine com o bloco de dados antes de liberá-lo. Se você estiver enviando vários blocos de dados, deverá monitorar a conclusão dos blocos de dados para saber quando enviar blocos adicionais. Para obter mais informações sobre blocos de dados, consulte Audio Data Blocks.

PCM Waveform-Audio formato de dados

O lpData membro do estrutura de WAVEHDR aponta para as amostras de dados de áudio de forma de onda. Para dados PCM de 8 bits, cada amostra é representada por um único byte de dados não assinado. Para dados PCM de 16 bits, cada amostra é representada 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 PCM.

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

 

Embalagem de dados PCM

A ordem dos bytes de dados varia entre os formatos de 8 bits e 16 bits e entre os 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 PCM.

Formato de áudio de forma de onda PCM Descrição
mono de 8 bits Cada amostra é de 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 amostra tem 2 bytes. A amostra 1 é seguida pelas amostras 2, 3, 4 e assim por diante. Para cada amostra, o primeiro byte é o canal 0 (o canal esquerdo) e o segundo byte é o canal 1 (o canal direito).
mono de 16 bits Cada amostra tem 2 bytes. A amostra 1 é seguida pelas amostras 2, 3, 4 e assim por diante. Para cada exemplo, o primeiro byte é o byte de ordem baixa do canal 0 e o segundo byte é o byte de ordem alta do canal 0.
Estéreo de 16 bits Cada amostra tem 4 bytes. A amostra 1 é seguida pelas amostras 2, 3, 4 e assim por diante. Para cada amostra, o primeiro byte é o byte de ordem baixa do canal 0 (canal esquerdo); o segundo byte é o byte de alta ordem do canal 0; o terceiro byte é o byte de ordem baixa do canal 1 (canal direito); e o quarto byte é o byte de alta ordem do canal 1.
Outros Cada exemplo está contido em um bloco que é um múltiplo de 4 bytes, mas os exemplos podem ser não-byte-alinhado. A disposição dos canais é especificada por uma máscara. Para obter mais informações, consulte WAVEFORMATEXTENSIBLE.

 

Fechando dispositivos de saída Waveform-Audio

Depois que a reprodução de áudio em forma de onda estiver 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 não quiser esperar que a reprodução termine 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. Certifique-se de usar a função dewaveOutUnprepareHeaderpara limpar a preparação em todos os blocos de dados antes de fechar o dispositivo.