Filtri d'onda

I filtri wave rappresentano i dispositivi che e/o acquisiscino 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 multimediali di Microsoft Windows. Per informazioni sui formati d'onda supportati dai driver audio WDM, vedere WAVEFORMATEX e WAVEFORMATEXTENSIBLE.

Un filtro di rendering onda riceve come input un flusso audio digitale d'onda e restituisce un segnale audio analogico (a un set di altoparlanti o mixer esterno) o un flusso audio digitale (ad esempio a 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 wave-rendering e wave-capture 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 dell'hardware implementa come parte del driver dell'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 generico di filtro d'onda.

Il driver di sistema PortCls (Portcls.sys) implementa tre driver di porte 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, esegue automaticamente il wrapping 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 accodati nel dispositivo. Quando il puntatore di lettura o scrittura del dispositivo raggiunge la fine di un blocco, passa 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 come 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 rispetto a 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 un intervento periodico del software da parte 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 .For more information, see the A Wave Port Driver for Real-Time Audio Streaming white paper.

Filtri WaveRT

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

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

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

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

L'esempio di codice in Creazione del dispositivo secondario illustra questo processo. I driver porta e 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 .For more information, see the A Wave Port Driver for Real-Time Audio Streaming white paper.

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 in quello fisico e nello spazio di indirizzi virtuali.

  • 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 nel buffer ciclico, mentre un dispositivo WavePci si basa sulle funzionalità di dispersione/raccolta dell'hardware DMA per evitare tale copia. I runtime di integrazione che forniscono dati audio 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 di cui viene eseguito il rendering o l'acquisizione. 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 factory di filtro WavePci crea un filtro WavePci come indicato di seguito:

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

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

  • Chiama il metodo IPort::Init del driver della porta per associare il driver miniport al driver della 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 IPortWavePci e IMiniportWavePci .

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

Filtri WaveCyclic

Nota

Microsoft supporta un ambiente diversificato e inclusivo. Questo articolo contiene riferimenti alla terminologia riconosciuta dalla guida di stile Microsoft per le comunicazioni senza distorsioni 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 in modo che sia allineato.

Nota: Informazioni waveCyclic per le versioni precedenti di Windows

Un filtro WaveCyclic viene implementato come coppia di driver porta/miniport. Una factory di filtri 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 il valore GUID CLSID_PortWaveCyclic.

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

L'esempio di codice in Creazione del dispositivo secondario illustra questo processo. I driver 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 di indirizzi della memoria fisica e virtuale. Se, come accennato in precedenza, il motore DMA del dispositivo WaveCyclic impone vincoli aggiuntivi sulla memoria del buffer, il driver miniport è libero di implementare il proprio metodo di allocazione del buffer per soddisfare questi vincoli.

Un driver miniport WaveCyclic che chiede un buffer di grandi dimensioni (ad esempio, otto pagine di memoria contigue fisicamente) deve essere preparato a stabilire una dimensione del buffer più piccola se il sistema operativo nega la richiesta originale. Un dispositivo audio potrebbe 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 con mastering del bus viene chiamato dispositivo master. In alternativa, un dispositivo WaveCyclic può essere un dispositivo subordinato senza funzionalità DMA-hardware 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 DMA-channel anziché usare l'oggetto DMA-channel predefinito, creato da uno dei metodi New DmaChannel del driver diporta:

IPortWaveCyclic::NewMasterDmaChannel

IPortWaveCyclic::NewSlaveDmaChannel

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

Per un esempio di driver che implementa il proprio oggetto canale DMA, vedere l'adattatore audio di esempio Sb16 nelle versioni precedenti del 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.