Blocchi di dati audio

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

Le funzioni waveInAddBuffer e waveOutWrite richiedono alle applicazioni di allocare blocchi di dati da passare ai driver di dispositivo per scopi di registrazione o riproduzione. Entrambe queste funzioni usano la struttura WAVEHDR per descrivere il blocco di dati.

Prima di usare una di queste funzioni per passare un blocco di dati a un driver di dispositivo, è necessario allocare memoria per il blocco di dati e la struttura di intestazione che descrive il blocco di dati. Le intestazioni possono essere preparate e non preparate usando le funzioni seguenti.

Funzione Descrizione
waveInPrepareHeader Prepara un blocco di dati di input audio waveform.
waveInUnprepareHeader Pulisce la preparazione in un blocco di dati di input audio waveform.
waveOutPrepareHeader Prepara un blocco di dati di output audio waveform.
waveOutUnprepareHeader Pulisce la preparazione in un blocco di dati di output audio waveform.

 

Prima di passare un blocco di dati audio a un driver di dispositivo, è necessario preparare il blocco di dati passandolo a waveInPrepareHeader o waveOutPrepareHeader. Al termine del driver di dispositivo con il blocco di dati e lo restituisce, è necessario pulire questa preparazione passando il blocco di dati a waveInUnprepareHeader o waveOutUnprepareHeader prima che qualsiasi memoria allocata possa essere liberata.

A meno che i dati di input e output audio waveform siano sufficientemente piccoli da essere contenuti in un singolo blocco di dati, le applicazioni devono fornire continuamente al driver di dispositivo blocchi di dati fino al completamento della riproduzione o della registrazione.

Anche se viene usato un singolo blocco di dati, un'applicazione deve essere in grado di determinare quando un driver di dispositivo viene completato con il blocco di dati in modo che l'applicazione possa liberare la memoria associata al blocco di dati e alla struttura di intestazione. Esistono diversi modi per determinare quando un driver di dispositivo viene completato con un blocco di dati:

  • Specificando una funzione di callback per ricevere un messaggio inviato dal driver al termine di un blocco di dati
  • Usando un callback di eventi
  • Specificando una finestra o un thread per ricevere un messaggio inviato dal driver al termine di un blocco di dati
  • Eseguendo il polling del bit WHDR_DONE nel membro dwFlags della struttura WAVEHDR inviato con ogni blocco di dati

Se un'applicazione non ottiene un blocco di dati per il driver di dispositivo quando necessario, può verificarsi un divario udibile nella riproduzione o una perdita di informazioni registrate in ingresso. Questo richiede almeno uno schema di doppio buffer, mantenendo almeno un blocco di dati davanti al driver del dispositivo.

Negli argomenti seguenti vengono descritti i modi per determinare quando un driver di dispositivo viene completato con un blocco di dati:

Uso di una funzione di callback per elaborare i messaggi del driver