Dispositivi e tipi di dati

[La funzionalità associata a questa pagina , Waveform Audio, è una funzionalità legacy. È stato sostituito da WASAPI e grafici audio. WasAPI e grafici audio sono stati ottimizzati per Windows 10 e Windows 11. Microsoft consiglia vivamente che il nuovo codice usi grafici WASAPI e Audio anziché Waveform Audio, quando possibile. Microsoft suggerisce che il codice esistente che usa le API legacy venga riscritto per usare le nuove API, se possibile.

Questa sezione descrive l'uso dei dispositivi waveform-audio e include informazioni su come aprire, chiudere ed eseguire query sulle relative funzionalità. Descrive anche come tenere traccia dei dispositivi in un sistema usando handle di dispositivo e identificatori di dispositivo.

Apertura di dispositivi di output Waveform-Audio

Usare la funzione waveOutOpen per aprire un dispositivo di output audio waveform per la riproduzione. Questa funzione apre il dispositivo associato all'identificatore di dispositivo specificato e restituisce un handle del dispositivo aperto scrivendo l'handle di una posizione di memoria specificata.

Alcuni computer multimediali hanno più dispositivi di output audio waveform. A meno che non si voglia aprire un dispositivo di output waveform-audio specifico in un sistema, è consigliabile usare il flag WAVE_MAPPER per l'identificatore del dispositivo quando si apre un dispositivo. La funzione waveOutOpen sceglie il dispositivo nel sistema che è in grado di riprodurre meglio il formato di dati specificato.

Esecuzione di query su dispositivi audio

Windows fornisce le funzioni seguenti per determinare il numero di dispositivi di un determinato tipo disponibili in un sistema.

Funzione Descrizione
auxGetNumDevs Recupera il numero di dispositivi di output ausiliari presenti nel sistema.
waveInGetNumDevs Recupera il numero di dispositivi di input audio waveform presenti nel sistema.
waveOutGetNumDevs Recupera il numero di dispositivi di output audio waveform presenti nel sistema.

 

I dispositivi audio sono identificati da un identificatore di dispositivo. L'identificatore del dispositivo viene determinato in modo implicito dal numero di dispositivi presenti in un sistema. Gli identificatori del dispositivo variano da zero a uno minore del numero di dispositivi presenti. Ad esempio, se in un sistema sono presenti due dispositivi di output audio waveform, gli identificatori di dispositivo validi sono 0 e 1.

Dopo aver determinato il numero di dispositivi di un determinato tipo presenti in un sistema, è possibile usare una delle funzioni seguenti per eseguire query sulle funzionalità di ogni dispositivo.

Funzione Descrizione
auxGetDevCaps Recupera le funzionalità di un dispositivo di output ausiliario specificato.
waveInGetDevCaps Recupera le funzionalità di un dispositivo di input audio waveform specificato.
waveOutGetDevCaps Recupera le funzionalità di un dispositivo di output audio waveform specificato.

 

Ognuna di queste funzioni riempie una struttura con informazioni sulle funzionalità di un dispositivo specificato. Nella tabella seguente sono elencate le strutture che corrispondono a ognuna di queste funzioni.

Funzione Struttura
auxGetDevCaps AUXCAPS
waveInGetDevCaps WAVEINCAPS
waveOutGetDevCaps WAVEOUTCAPS

 

I formati standard sono elencati nel membro dwFormats della struttura WAVEOUTCAPS . I dispositivi waveform-audio possono supportare formati non standard. Per determinare se un formato specifico (standard o non standard) è supportato da un dispositivo, è possibile chiamare la funzione waveOutOpen con il flag WAVE_FORMAT_QUERY. Questo flag non apre il dispositivo. Specificare il formato in questione nella struttura WAVEFORMATEX a cui punta il parametro pwfx passato a waveOutOpen.

I dispositivi di output waveform-audio variano in base alle funzionalità supportate. Il membro dwSupport della struttura WAVEOUTCAPS indica se un dispositivo supporta tali funzionalità, ad esempio modifiche al volume e all'inclinazione.

Handle di dispositivo e identificatori di dispositivo

Ogni funzione che apre un dispositivo audio specifica un identificatore di dispositivo, un puntatore a una posizione di memoria e alcuni parametri univoci per ogni tipo di dispositivo. La posizione di memoria viene riempita con un handle del dispositivo. Usa questo handle del dispositivo per identificare il dispositivo audio aperto quando chiama altre funzioni audio.

La differenza tra identificatori e handle per i dispositivi audio è sottile ma importante:

  • Gli identificatori di dispositivo vengono determinati in modo implicito dal numero di dispositivi presenti in un sistema. Questo numero viene ottenuto usando la funzione auxGetNumDevs, waveInGetNumDevs o waveOutGetNumDevs .
  • Gli handle di dispositivo vengono restituiti quando i driver di dispositivo vengono aperti usando la funzione waveInOpen o waveOutOpen .

Non esistono funzioni che aprono o chiudono dispositivi audio ausiliari. I dispositivi audio ausiliari non devono essere aperti e chiusi come dispositivi audio waveform perché non vi è alcun trasferimento dati continuo associato. Tutte le funzioni audio ausiliarie usano identificatori di dispositivo per identificare i dispositivi.

tipi di dati di output Waveform-Audio

I tipi di dati seguenti sono definiti per le funzioni di output audio waveform.

Tipo Descrizione
HWAVEOUT Gestire in un dispositivo di output audio waveform aperto.
WAVEFORMATEX Struttura che specifica i formati di dati supportati da un particolare dispositivo di input audio waveform. Questa struttura viene usata anche per i dispositivi di input audio waveform.
WAVEHDR Struttura usata come intestazione per un blocco di dati di input waveform-audio. Questa struttura viene usata anche per i dispositivi di input waveform-audio.
WAVEOUTCAPS Struttura usata per eseguire query sulle funzionalità di un particolare dispositivo di output waveform-audio.

 

Specifica dei formati di dati Waveform-Audio

Quando si chiama la funzione waveOutOpen per aprire un driver di dispositivo per la riproduzione o per eseguire una query se il driver supporta un formato di dati specifico, usare il parametro pwfx per specificare un puntatore a una struttura WAVEFORMATEX contenente il formato di dati waveform-audio richiesto. WAVEFORMATEX sostituisce le strutture WAVEFORMAT e PCMWAVEFORMAT .

Per i dati audio separati in più di due canali o con dimensioni di esempio che non sono più di 8, è consigliabile usare WAVEFORMATEXTENSIBLE. Questa struttura configura semplicemente i byte aggiuntivi a cui punta il membro cbSize di WAVEFORMATEX per fornire informazioni aggiuntive sul formato. WAVEFORMATEXTENSIBLE può essere eseguito come WAVEFORMATEX.

Esistono anche due formati degli Appunti che è possibile usare per rappresentare i dati audio: CF_WAVE e CF_RIFF. Usare il formato CF_WAVE per rappresentare i dati in uno dei formati standard, ad esempio 11 kHz o 22 kHz PCM. Usare il formato CF_RIFF per rappresentare formati di dati più complessi che non possono essere rappresentati come file audio waveform standard.

Scrittura di dati Waveform-Audio

Dopo aver aperto correttamente un driver di dispositivo di output waveform-audio, è possibile iniziare a riprodurre un suono. Windows fornisce la funzione waveOutWrite per l'invio di blocchi di dati ai dispositivi di output waveform-audio.

Usare la struttura WAVEHDR per specificare il blocco di dati waveform-audio che si invia usando waveOutWrite. Questa struttura contiene un puntatore a un blocco di dati bloccato, la lunghezza del blocco di dati e alcuni flag. Questo blocco di dati deve essere preparato prima di usarlo; per informazioni sulla preparazione di un blocco dati, vedere Blocchi dati audio.

Dopo aver inviato un blocco di dati a un dispositivo di output usando waveOutWrite, è necessario attendere il completamento del driver del dispositivo con il blocco dati prima di liberarlo. Se si inviano più blocchi di dati, è necessario monitorare il completamento dei blocchi di dati per sapere quando inviare blocchi aggiuntivi. Per altre informazioni sui blocchi di dati, vedere Blocchi dati audio.

Formato dati Waveform-Audio PCM

Il membro lpData della struttura WAVEHDR punta agli esempi di dati waveform-audio. Per i dati PCM a 8 bit, ogni esempio è rappresentato da un singolo byte di dati senza segno. Per i dati PCM a 16 bit, ogni esempio è rappresentato da un valore con segno a 16 bit. La tabella seguente riepiloga i valori massimi, minimi e midpoint per i dati waveform-audio PCM.

Formato dati Valore massimo Valore minimo Valore midpoint
PCM a 8 bit 255 (0xFF) 0 128 (0x80)
PCM a 16 bit 32.767 (0x7FFF) –32.768 (0x8000) 0

 

Imballaggio dei dati PCM

L'ordine dei byte di dati varia tra formati a 8 bit e a 16 bit e tra formati mono e stereo. L'elenco seguente descrive la compressione dei dati per i diversi formati di dati waveform-audio PCM.

Formato waveform-audio PCM Descrizione
Mono a 8 bit Ogni esempio è 1 byte che corrisponde a un singolo canale audio. L'esempio 1 è seguito da esempi 2, 3, 4 e così via.
Stereo a 8 bit Ogni esempio è 2 byte. L'esempio 1 è seguito da esempi 2, 3, 4 e così via. Per ogni esempio, il primo byte è channel 0 (il canale sinistro) e il secondo byte è channel 1 (il canale destro).
Mono a 16 bit Ogni esempio è 2 byte. L'esempio 1 è seguito da esempi 2, 3, 4 e così via. Per ogni esempio, il primo byte è il byte a basso ordine del canale 0 e il secondo byte è il byte elevato del canale 0.
Stereo a 16 bit Ogni esempio è di 4 byte. L'esempio 1 è seguito da esempi 2, 3, 4 e così via. Per ogni esempio, il primo byte è il byte a basso ordine del canale 0 (canale sinistro); il secondo byte è il byte superiore del canale 0; il terzo byte è il byte a basso ordine del canale 1 (canale destro); e il quarto byte è il byte elevato del canale 1.
Altro Ogni esempio è contenuto in un blocco che è un multiplo di 4 byte, ma gli esempi possono essere non allineati a byte. La disposizione dei canali è specificata da una maschera. Per altre informazioni, vedere WAVEFORMATEXTENSIBLE.

 

Chiusura di dispositivi di output Waveform-Audio

Al termine della riproduzione waveform-audio, chiamare waveOutClose per chiudere il dispositivo di output. Se waveOutClose viene chiamato mentre viene riprodotto un file waveform-audio, l'operazione di chiusura ha esito negativo e la funzione restituisce un codice di errore che indica che il dispositivo non è stato chiuso. Se non si vuole attendere che la riproduzione venga terminata prima di chiudere il dispositivo, chiamare la funzione waveOutReset prima della chiusura. Questa operazione termina la riproduzione e consente la chiusura del dispositivo. Assicurarsi di usare la funzione waveOutUnprepareHeader per pulire la preparazione in tutti i blocchi di dati prima di chiudere il dispositivo.