Componenti Wave e DirectSound

I programmi dell'applicazione si basano su una combinazione di componenti in modalità utente e in modalità kernel per acquisire (input) e eseguire il rendering dei flussi di onda (output). Un flusso wave è un flusso audio digitale il cui formato di dati è descritto da una struttura WAVEFORMATEX o WAVEFORMATEXTENSIBLE.

Un'applicazione può usare una delle interfacce software seguenti per il rendering delle onde e l'acquisizione:

  • Funzioni Di Microsoft Windows Multimedia WaveOutXxx e waveInXxx

  • API DirectSound e DirectSoundCapture

Il comportamento delle funzioni waveOutXxx e waveInXxx è basato sulle funzionalità dei driver e dei dispositivi legacy. A partire da Windows 98, il driver di sistema WDMAud converte le chiamate a queste funzioni in comandi ai driver audio WDM. Tuttavia, simulando il comportamento del software e dell'hardware meno recenti, le funzioni waveOutXxx sacrificano gli effetti audio 3D e l'accelerazione hardware ora disponibili tramite l'API DirectSound. Per altre informazioni sulle funzioni DirectSound e Sulle onde multimediali di Windows, vedere la documentazione di Microsoft Windows SDK.

DirectSound e le funzioni dell'onda multimediale di Windows sono client del driver di sistema SysAudio, che compila i grafici dei filtri audio che elaborano i flussi wave e DirectSound. La compilazione di Graph è trasparente per le applicazioni che usano queste interfacce software.

Componenti di onda

Nella figura seguente vengono illustrati i componenti in modalità utente e in modalità kernel usati da un'applicazione wave per eseguire il rendering o acquisire un flusso audio digitale costituito da dati PCM wave.

Diagramma che illustra i componenti in modalità utente e in modalità kernel per il rendering e l'acquisizione di onde.

I componenti di rendering vengono visualizzati sul lato sinistro della figura precedente e i componenti di acquisizione vengono visualizzati a destra. Le caselle che rappresentano il driver miniport d'onda vengono oscurate per indicare che questi sono componenti forniti dal fornitore. Gli altri componenti della figura sono forniti dal sistema.

Nella parte superiore sinistra della figura, le interfacce dell'applicazione di rendering onda (o "wave-out") ai driver audio WDM tramite le funzioni waveOutXxx , implementate nel componente di sistema WinMM in modalità utente, Winmm.dll. L'applicazione legge blocchi di esempi audio a onda da un file e chiama la funzione waveOutWrite per eseguirne il rendering.

WDMAud, costituito sia da componenti in modalità utente che in modalità kernel (Wdmaud.drv e Wdmaud.sys), memorizza i dati dell'onda dalla chiamata waveOutWrite e restituisce il flusso di onda al driver di sistema KMixer, che appare sotto WDMAud nella figura.

KMixer è un componente di sistema che riceve flussi PCM wave da una o più origini e li combina insieme per formare un singolo flusso di output, che è anche in formato PCM wave.

KMixer restituisce un flusso di onda a un dispositivo WaveCyclic o WavePci, i cui driver porta e miniport appaiono sotto KMixer sul lato sinistro della figura precedente. Il driver miniport si associa al driver di porta per formare il filtro onda che rappresenta il dispositivo di rendering audio sottostante. Un dispositivo di rendering tipico restituisce un segnale analogico che determina un set di altoparlanti o un'unità audio esterna. Un dispositivo di rendering potrebbe anche restituire audio digitale tramite un connettore S/PDIF. Per altre informazioni su WaveCyclic e WavePci, vedere Filtri onda.

In alternativa, KMixer può passare il flusso di output a un dispositivo audio USB, controllato dal driver di sistema della classe USBAudio (non mostrato nella figura), anziché da un dispositivo WaveCyclic o WavePci.

Un driver della scheda crea un'istanza di un driver di porta WaveCyclic o WavePci chiamando PcNewPort con un valore GUID di CLSID_PortWaveCyclic o CLSID_PortWavePci rispettivamente.

Il lato destro della figura precedente mostra i componenti necessari per supportare un'applicazione che acquisisce i dati delle onde in un file. L'applicazione wave-capture (o "wave-in") comunica con i driver audio WDM tramite le funzioni waveInXxx , implementate nel componente di sistema WinMM.

Nell'angolo inferiore destro della figura, il dispositivo di acquisizione onda è controllato da miniport e driver di porta d'onda. I driver porta e miniport, che possono essere di tipo WaveCyclic o WavePci, associati insieme per formare un filtro di onda che rappresenta il dispositivo di acquisizione. Questo dispositivo acquisisce in genere un segnale analogico da un microfono o da un'altra origine audio e lo converte in un flusso PCM wave. Il dispositivo potrebbe anche inserire un flusso audio digitale tramite un connettore S/PDIF.

Il driver della porta onda restituisce direttamente il flusso di onda a KMixer o a WDMAud. Il flusso deve passare attraverso KMixer se deve essere convertito a frequenza di esempio prima che WDMAud lo riceva. Un sistema che esegue il rendering simultaneo e l'acquisizione di flussi audio potrebbe richiedere due istanze di KMixer, come illustrato nella figura. Si noti che SysAudio crea automaticamente queste istanze in base alle esigenze.

In alternativa, l'origine del flusso di onda acquisita può essere un dispositivo audio USB anziché un dispositivo WaveCyclic o WavePci. In questo caso, il driver USBAudio (non illustrato nella figura) passa il flusso a KMixer.

Indipendentemente dal fatto che il flusso di onda venga acquisito da un dispositivo USB o da un dispositivo WaveCyclic o WavePci, KMixer esegue la conversione della frequenza di campionamento nel flusso, se necessario, ma non si combina con altri flussi. KMixer restituisce il flusso risultante in Wdmaud.sys, la metà della metà del driver di sistema WDMAud. La metà della modalità utente, Wdmaud.drv, restituisce il flusso di onda al programma dell'applicazione tramite le funzioni waveInXxx , implementate in Winmm.dll. Infine, nella parte superiore della figura, l'applicazione wave-capture scrive i dati dell'onda in un file.

Al momento in cui l'applicazione wave-capture chiama la funzione waveInOpen per aprire il flusso di acquisizione, passa un puntatore alla routine di callback. Quando si verifica un evento di acquisizione onda, il sistema operativo chiama la routine di callback con un buffer contenente il blocco successivo di campioni di onda dal dispositivo di acquisizione. In risposta al callback, l'applicazione scrive il blocco successivo di dati wave nel file.

Componenti DirectSound

Nella figura seguente vengono illustrati i componenti in modalità utente e in modalità kernel usati da un programma dell'applicazione DirectSound per eseguire il rendering o acquisire i dati delle onde.

Diagramma che illustra i componenti in modalità utente e in modalità kernel per il rendering e l'acquisizione di DirectSound.

I componenti di rendering vengono visualizzati nella metà sinistra della figura precedente e i componenti di acquisizione vengono visualizzati a destra. I driver miniport d'onda vengono visualizzati come caselle oscurate per indicare che sono componenti forniti dal fornitore. Gli altri componenti della figura sono forniti dal sistema.

Nella parte superiore sinistra della figura, un'applicazione DirectSound carica i dati dell'onda da un file a un buffer audio gestito dal componente di sistema DirectSound in modalità utente (Dsound.dll). Questo componente invia un flusso di onda a un dispositivo WaveCyclic o WavePci, il cui driver porta e miniport appaiono in basso a sinistra nella figura. Se nel dispositivo è disponibile un pin del mixer hardware, il flusso passa direttamente al driver della porta di onda, ignorando KMixer. In caso contrario, il flusso passa prima attraverso KMixer, che lo combina con qualsiasi altro flusso di riproduzione simultaneamente. KMixer restituisce il flusso misto al driver della porta.

Come in precedenza, il driver miniport si associa al driver di porta per formare il filtro di onda che rappresenta il dispositivo di rendering audio sottostante. Questo dispositivo potrebbe riprodurre il flusso tramite un set di altoparlanti, ad esempio.

In alternativa, il flusso di onda può essere eseguito da un dispositivo audio USB anziché da un dispositivo WaveCyclic o WavePci. In questo caso, il flusso non può ignorare KMixer; il driver di sistema della classe USBAudio (non illustrato nella figura) passa sempre il flusso a KMixer.

Il lato destro della figura precedente mostra i componenti che supportano un'applicazione DirectSoundCapture. L'applicazione registra i dati dell'onda ricevuti da un dispositivo di acquisizione WaveCyclic o WavePci. Questo dispositivo converte un segnale analogico da un microfono, ad esempio in un flusso di onda. La porta d'onda del dispositivo e i driver miniport vengono visualizzati nell'angolo inferiore destro della figura. Come illustrato nella figura, il driver di porta riceve come input il flusso dal driver miniport e lo restituisce direttamente al componente DirectSound in modalità utente, Dsound.dll o indirettamente tramite KMixer. Ciò dipende dal fatto che un pin di acquisizione hardware sia disponibile dal dispositivo di acquisizione.

In alternativa, l'origine del flusso dell'onda acquisita può essere un dispositivo audio USB. In questo caso, il flusso non può ignorare KMixer; il driver USBAudio (non mostrato nella figura) passa sempre il flusso a KMixer.

Se KMixer viene inserito nel percorso del flusso di acquisizione, esegue la conversione della frequenza di campionamento nel flusso, se necessario, ma non si combina con altri flussi.

Nell'angolo superiore destro della figura precedente, l'applicazione legge i dati dell'onda dal buffer DirectSoundCapture e lo scrive nel file.