Condividi tramite


Filtri a onde

I filtri wave rappresentano i dispositivi che eseguono il rendering e/o l'acquisizione di dati audio digitali in formato onda. Le applicazioni in genere accedono alle funzionalità di questi dispositivi tramite l'API DirectSound o tramite le funzioni waveOutXxx e waveInXxx di Microsoft Windows multimedia. Per informazioni sui formati d'onda supportati dai driver audio WDM, vedere WAVEFORMATEX e WAVEFORMATEXTENSIBLE.

Un filtro di wave-rendering riceve in input un flusso audio digitale d'onda e restituisce un segnale audio analogico (a un set di altoparlanti o a un mixer esterno) o un flusso audio digitale (ad esempio, per un connettore S/PDIF).

Un filtro di acquisizione onda riceve come input un segnale audio analogico (da un microfono o un jack di input) o un flusso digitale (ad esempio da un connettore S/PDIF). Lo stesso filtro restituisce un flusso d'onda contenente dati audio digitali.

Un singolo filtro d'onda può eseguire il rendering e l'acquisizione simultaneamente. Questo tipo di filtro può, ad esempio, rappresentare un dispositivo audio in grado di riprodurre audio tramite un set di altoparlanti e registrare l'audio tramite un microfono contemporaneamente. In alternativa, l'hardware di rendering e acquisizione delle onde potrebbe essere rappresentato come filtri d'onda separati, come descritto in Sottodispositivi audio dinamici.

Un driver di adattatore audio forma un filtro d'onda associando un driver miniport wave, che il fornitore hardware implementa come parte del driver di adattatore, con un driver di porta d'onda, che il sistema implementa. Il driver miniport gestisce tutte le operazioni specifiche dell'hardware per il filtro d'onda e il driver di porta gestisce tutte le funzioni di filtro onda generico.

Il driver di sistema PortCls (Portcls.sys) implementa tre driver di porta d'onda: WaveRT, WavePci e WaveCyclic.

I tre tipi di filtro d'onda funzionano come segue:

  • Un filtro WaveRT alloca un buffer per i dati wave e rende il buffer direttamente accessibile al client in modalità utente. Il buffer può essere costituito da blocchi contigui o non contigui di memoria, a seconda delle funzionalità hardware del dispositivo wave. Il client accede al buffer come blocco contiguo di memoria virtuale. Il buffer è ciclico, il che significa che quando il puntatore di lettura del dispositivo (per il rendering) o di scrittura (per l'acquisizione) raggiunge la fine del buffer, ritorna automaticamente all'inizio del buffer.

  • Un filtro WavePci accede direttamente al buffer del client. Anche se il client accede al buffer come singolo blocco contiguo di memoria virtuale, il filtro WavePci deve accedere al buffer come una serie di blocchi di memoria possibilmente non contigui. I blocchi contenenti parti successive del flusso di rendering o acquisizione vengono messi in coda nel dispositivo. Quando il puntatore di lettura o scrittura del dispositivo raggiunge la fine di un blocco, si sposta all'inizio del blocco successivo nella coda.

  • Un filtro WaveCyclic alloca un buffer costituito da un singolo blocco contiguo di memoria da usare come output (per il rendering) o un buffer di input (per l'acquisizione). Questo buffer è ciclico. Poiché il buffer non è direttamente accessibile al client, il driver deve copiare i dati tra il buffer ciclico del driver e il buffer in modalità utente del client.

WaveRT è preferibile rispetto a WavePci e WaveCyclic. WavePci e WaveCyclic sono stati usati con le versioni precedenti di Windows.

Un filtro WaveRT può rappresentare un dispositivo audio che risiede in un bus di sistema, ad esempio PCI o PCI Express. Il vantaggio principale di un filtro WaveRT su un filtro WaveCyclic o WavePci è che un filtro WaveRT consente a un client in modalità utente di scambiare dati audio direttamente con l'hardware audio. Al contrario, i filtri WaveCyclic e WavePci richiedono entrambi un intervento software periodico del driver, che aumenta la latenza del flusso audio. Inoltre, i dispositivi audio con e senza funzionalità DMA a dispersione/raccolta possono essere rappresentati come filtri WaveRT. Per altre informazioni, vedere il white paper A Wave Port Driver for Real-Time Audio Streaming.

Filtri WaveRT

Un filtro WaveRT viene implementato come coppia di driver porta/miniport. In Windows Vista e versioni successive, un generatore di filtri WaveRT crea un filtro WaveRT come segue:

  • Crea un'istanza di un oggetto driver miniport WaveRT.

  • Crea un'istanza di un oggetto driver di porta WaveRT chiamando PcNewPort con valore GUID CLSID_PortWaveRT.

  • Chiama il metodo IPort::Init del driver di porta per associare il driver miniport al driver di porta.

L'esempio di codice in Creazione del dispositivo secondario illustra questo processo. I driver della porta e della miniport comunicano tra loro tramite le interfacce IPortWaveRT e IMiniportWaveRT.

Per altre informazioni, vedere il white paper A Wave Port Driver for Real-Time Audio Streaming.

Informazioni per le versioni precedenti di Windows

Informazioni waveCyclic per le versioni precedenti di Windows

Un filtro WaveCyclic può rappresentare un dispositivo audio che si connette a un bus di sistema, ad esempio ISA, PCI, PCI Express o PCMCIA. Come suggerisce il nome "WavePci", un filtro WavePci rappresenta in genere un dispositivo che si connette a un bus PCI, anche se, in linea di principio, un dispositivo WavePci potrebbe invece connettersi a un bus ISA, ad esempio. A differenza dei dispositivi più semplici supportati da WaveCyclic, un dispositivo supportato da WavePci deve avere funzionalità DMA a dispersione/raccolta. Un dispositivo audio che risiede nel bus PCI ma non dispone di DMA a dispersione/raccolta può essere rappresentato come filtro WaveCyclic ma non come filtro WavePci.

Informazioni wavePci per le versioni precedenti di Windows

Un dispositivo WavePci è in grado di eseguire trasferimenti DMA a dispersione/raccolta da o verso buffer che possono trovarsi in indirizzi di memoria arbitrari e che iniziano e terminano con allineamenti di byte arbitrari. Al contrario, l'hardware DMA per un dispositivo WaveCyclic richiede solo la possibilità di spostare i dati da o verso un singolo buffer allocato dal driver miniport del dispositivo. Un driver miniport WaveCyclic è libero di allocare un buffer ciclico che soddisfi le funzionalità limitate del canale DMA. Ad esempio, il canale DMA per un dispositivo WaveCyclic tipico potrebbe richiedere un buffer che soddisfi le restrizioni seguenti:

  • Il buffer si trova in una determinata area dello spazio indirizzi fisico.

  • Il buffer è contiguo nello spazio indirizzi fisico e nello spazio indirizzi virtuale.

  • Il buffer inizia e termina su limiti pari a quattro o otto byte.

In cambio di questa semplicità, tuttavia, un dispositivo WaveCyclic deve basarsi sulla copia software dei dati da o verso il buffer ciclico, mentre un dispositivo WavePci si basa sulle funzionalità di dispersione/raccolta dell'hardware DMA per evitare tale copia. I pacchetti di richiesta di I/O (IRP) che forniscono dati audio in formato wave a un dispositivo di rendering o recuperano dati da un dispositivo di acquisizione sono accompagnati da buffer di dati, e ognuno di questi buffer contiene una parte del flusso audio che viene riprodotto o acquisito. Un dispositivo WavePci è in grado di accedere a questi buffer direttamente tramite il motore DMA a dispersione/raccolta, mentre un dispositivo WaveCyclic richiede che i dati vengano copiati nel buffer ciclico dall'IRP o viceversa.

Filtri WavePci

Nota: Informazioni WavePci per le versioni precedenti di Windows

Un filtro WavePci viene implementato come coppia di driver porta/miniport. Una fabbrica di filtri WavePci crea un filtro WavePci come segue:

  • Instanzia un oggetto miniport driver WavePci.

  • Crea un'istanza di un oggetto driver di porta WavePci chiamando PcNewPort con valore GUID CLSID_PortWavePci.

  • Chiama il metodo IPort::Init del driver di porta per associare il driver miniport al driver di porta.

L'esempio di codice in Creazione del dispositivo secondario illustra questo processo. I driver port e miniport comunicano tra loro tramite le interfacce IPortWavePci e IMiniportWavePci.

Per altre informazioni, vedere Problemi di implementazione per i dispositivi WavePci.

Filtri WaveCyclic

Annotazioni

Microsoft supporta un ambiente diversificato e inclusivo. Questo articolo contiene riferimenti alla terminologia riconosciuta dalla guida di stile Microsoft per la comunicazione senza pregiudizi come esclusioni. La parola o la frase viene usata in questo articolo per coerenza perché è attualmente presente nel software. Quando il software viene aggiornato per rimuovere la lingua, questo articolo verrà aggiornato per essere allineato.

Nota: Informazioni WaveCyclic per le versioni precedenti di Windows

Un filtro WaveCyclic viene implementato come coppia di driver porta/miniport. Una fabbrica di filtro WaveCyclic crea un filtro WaveCyclic come indicato di seguito:

  • Crea un'istanza di un oggetto driver miniport WaveCyclic.

  • Crea un'istanza di un oggetto driver di porta WaveCyclic chiamando PcNewPort con valore GUID CLSID_PortWaveCyclic.

  • Chiama il metodo IPort::Init del driver di porta per associare il driver miniport al driver di porta.

L'esempio di codice in Creazione del dispositivo secondario illustra questo processo. I driver di porta e miniport comunicano tra loro tramite le interfacce IPortWaveCyclic e IMiniportWaveCyclic.

Il buffer ciclico del filtro WaveCyclic è sempre costituito da un blocco contiguo di memoria virtuale. L'implementazione del driver di porta del metodo IDmaChannel::AllocateBuffer alloca sempre un buffer contiguo nello spazio indirizzi di memoria fisica e virtuale. Se, come accennato in precedenza, il motore DMA del dispositivo WaveCyclic impone vincoli aggiuntivi sulla memoria buffer, il driver miniport è libero di implementare il proprio metodo di allocazione del buffer per soddisfare questi vincoli.

Un driver miniport WaveCyclic che richiede un buffer di grandi dimensioni (ad esempio, otto pagine di memoria fisicamente contigue) deve essere preparato a risolvere una dimensione del buffer inferiore se il sistema operativo nega la richiesta originale. Un dispositivo audio può occasionalmente essere scaricato e ricaricato per ribilanciare le risorse di sistema (vedere Arresto di un dispositivo per ribilanciare le risorse).

Un dispositivo WaveCyclic con hardware DMA predefinito per il mastering del bus è denominato dispositivo master. In alternativa, un dispositivo WaveCyclic può essere un dispositivo subordinato senza funzionalità hardware DMA predefinite. Un dispositivo subordinato deve basarsi sul controller DMA di sistema per eseguire eventuali trasferimenti di dati necessari. Per altre informazioni sui dispositivi master e subordinati, vedere IDmaChannel e IDmaChannelSlave.

Un driver miniport WaveCyclic può implementare il proprio oggetto canale DMA anziché l'oggetto DMA-channel predefinito, creato da uno dei metodi NewXxxDmaChannel del driver di porta:

IPortWaveCyclic::NewMasterDmaChannel

IPortWaveCyclic::NewSlaveDmaChannel

L'implementazione personalizzata IDmaChannel del driver di adattatore può eseguire la gestione personalizzata dei dati per soddisfare vincoli hardware speciali. Ad esempio, le funzioni multimediali di Windows usano formati wave in cui i campioni a 16 bit sono sempre valori firmati, ma l'hardware per il rendering audio potrebbe essere progettato per usare valori senza segno a 16 bit. In questo caso, il metodo IDmaChannel::CopyTo personalizzato del driver può essere scritto per convertire i valori di origine firmati nei valori di destinazione non firmati richiesti dall'hardware. Anche se questa tecnica può essere utile per aggirare i difetti di progettazione hardware, può anche comportare un costo significativo in termini di overhead software.

Per un esempio di driver che implementa il proprio oggetto canale DMA, vedere l'adattatore audio di esempio Sb16 nelle versioni precedenti di WDK. Se la costante OVERRIDE_DMA_CHANNEL è definita come TRUE, le istruzioni di compilazione condizionale nel codice sorgente consentono l'implementazione di un oggetto IDmaChannel proprietario, che il driver usa al posto dell'oggetto IDmaChannel predefinito dalla chiamata IPortWaveCyclic::NewXxxDmaChannel.