Condividi tramite


Sviluppo di un driver Miniport WaveRT

Questo argomento presenta i punti relativi al software e all'hardware da prendere in considerazione quando si decide di sviluppare il proprio driver miniport WaveRT.

Microsoft ha sviluppato un set di linee guida per la progettazione hardware per un'architettura audio universale (UAA) e le linee guida includono le funzionalità consigliate per un dispositivo audio WaveRT. Le linee guida UAA si basano strettamente sulla specifica audio High Definition (HD) sviluppata da Intel.

Windows Vista e versioni successive dei sistemi operativi Windows forniscono un driver audio HD per dispositivi audio conformi a UAA. Quindi, se il dispositivo audio è conforme a UAA, non è necessario sviluppare il proprio driver miniport WaveRT. Tuttavia, per i dispositivi audio che dispongono di alcune funzionalità hardware non UAA proprietarie, è necessario sviluppare il driver miniport WaveRT per supportare le funzionalità proprietarie.

Per facilitare lo sviluppo di un driver miniport WaveRT, è consigliabile esaminare prima il driver dell'adattatore di esempio e quindi esaminare le funzionalità UAA descrittive di WaveRT.

Driver dell'adattatore di esempio

Per informazioni sul driver di esempio, vedere Driver audio di esempio.

Le funzionalità descrittive di WaveRT

Dopo aver esaminato il driver dell'adattatore di esempio e iniziare a progettare il driver miniport WaveRT, è necessario verificare che supporti le funzionalità software e hardware seguenti. Di conseguenza, il driver miniport che si compila diventa quindi compatibile con il driver di porta WaveRT fornito dal sistema e con la modalità di funzionamento del motore audio di Windows Vista.

  • Bassa latenza hardware. Un driver miniport WaveRT deve fornire un'implementazione completamente funzionante del metodo IMiniportWaveRTStream::GetHWLatency . Questo metodo è necessario per supportare la proprietà KSPROPERTY_RTAUDIO_HWLATENCY .

  • INTERRUZIONI FIFO. Un driver miniport WaveRT deve generare automaticamente interruzioni quando si verificano overrun e sottorun. Questa funzionalità consente di rilevare glitch nel flusso audio quando si eseguono test sul software del dispositivo audio e del driver. Senza supporto hardware (in altre parole, l'interruzione FIFO), non esiste un metodo pratico e affidabile per ottenere informazioni sugli errori.

  • Scatter-Gather ciclo DMA e buffer. Quando il driver miniport supporta un controller DMA con funzionalità di raccolta a dispersione, consente lo spostamento dei dati nel buffer ciclico senza la necessità di intervento dal driver miniport.

    Quando il driver miniport supporta un controller DMA che può eseguire cicli di buffer, il controller DMA può eseguire automaticamente il wrapping all'inizio del buffer dopo aver raggiunto la fine del buffer con un'operazione di lettura o scrittura. Può eseguire il wrapping senza intervento dal conducente miniport.

    Si noti che il driver di porta WaveRT supporta progetti hardware esistenti che non hanno la possibilità di eseguire trasferimenti di raccolta a dispersione o cicli di buffer automatici.

    Se un dispositivo audio non dispone di funzionalità di raccolta a dispersione, il driver miniport WaveRT deve prima allocare buffer ciclici costituiti da pagine che sono fisicamente contigue in memoria. Il driver miniport usa quindi funzioni helper nel driver di porta WaveRT per eseguire i trasferimenti di dati e il ciclo del buffer automatico. Lo svantaggio è che, poiché il pool di memoria non a pagina di un sistema diventa sempre più frammentato, una richiesta di allocare un grande blocco di memoria fisica contigua è più probabile che non riesca. Un dispositivo con funzionalità di raccolta a dispersione non è interessato dalla frammentazione della memoria.

    Se un dispositivo audio non può eseguire automaticamente cicli di buffer quando il canale DMA raggiunge la fine del buffer ciclico, il driver miniport WaveRT deve intervenire e configurare il canale per avviare il trasferimento dei dati all'inizio del buffer.

  • Registra posizioni. Per le nuove progettazioni, gli implementatori hardware devono includere un registro posizioni per ogni canale DMA. Un registro di posizione indica la posizione del buffer corrente come offset di byte dall'inizio del buffer ciclico. La lettura del registro di posizione è zero all'inizio del buffer. Quando il registro di posizione raggiunge la fine del buffer ciclico, esegue automaticamente il wrapping all'inizio del buffer (reimposta a zero) e continua a incrementare man mano che la posizione del buffer avanza.

    I registri di posizione possono essere mappati alla memoria virtuale in modo che i client possano leggere direttamente i registri.

    Idealmente, i registri di posizione devono indicare la posizione del buffer degli esempi attualmente in movimento attraverso i convertitori digitali da analogici e analogici (DACS e ADC) del dispositivo audio.

    Tuttavia, queste informazioni potrebbero non essere direttamente disponibili da un chipset audio che divide le funzioni digitali e analogiche in chip bus-controller e codificatore/decodificatore separati. In genere, i registri di posizione si trovano nel chip del controller del bus e ogni registro indica la posizione dei dati audio che il controller sta scrivendo o leggendo dai codec.

    Dopo aver ottenuto una lettura da questo tipo di registro di posizione, il client può stimare la posizione corrente degli esempi che si spostano attraverso le schede dati o le adC aggiungendo o sottraendo il ritardo tramite il codec. Il client ottiene il ritardo del codec dalla richiesta di proprietà KSPROPERTY_RTAUDIO_HWLATENCY . Per questo motivo, un driver miniport WaveRT deve segnalare con precisione il ritardo del codec quando il driver di porta chiama il metodo IMiniportWaveRTStream::GetHardwareLatency in risposta a questo tipo di richiesta di proprietà.

    Si noti che il driver di porta WaveRT supporta progetti hardware esistenti che non contengono registri di posizione. Per un dispositivo con questa limitazione, il driver miniport WaveRT deve non riuscire le chiamate al metodo IMiniportWaveRTStream::GetPositionRegister restituendo il codice di errore STATUS_NOT_SUPPORTED , che impone al driver di porta di non riuscire KSPROPERTY_RTAUDIO_POSITIONREGISTER richieste di proprietà. In questo caso, i client devono ottenere la posizione corrente tramite la proprietà KSPROPERTY_AUDIO_POSITION , che comporta il sovraccarico di una transizione tra la modalità utente e la modalità kernel per ogni lettura della posizione.

  • Registro orologio. Un registro orologio è una funzionalità hardware facoltativa ma utile per un dispositivo audio compatibile con WaveRT. I programmi dell'applicazione audio possono usare i registri dell'orologio per sincronizzare i flussi audio in due o più dispositivi audio indipendenti che dispongono di orologi hardware separati e non sincronizzati. Senza registri di orologio, un'applicazione non è in grado di rilevare e compensare la deriva tra gli orologi hardware.

    L'orologio di esempio usato dall'hardware audio per l'orologio dei dati audio tramite i convertitori analogici o analogici o analogici deve essere derivato dall'orologio interno che incrementa il registro degli orologi. Un registro di clock che incrementa a una frequenza asincrona rispetto all'orologio di esempio non è di uso per la sincronizzazione e non deve essere esposto.

    Analogamente ai registri di posizione, il registro dell'orologio può essere mappato alla memoria virtuale in modo che i client possano leggere direttamente il registro.

  • Oggetti di elaborazione audio. Un driver miniport WaveRT ben progettato non deve mai toccare i dati audio nel buffer ciclico di un dispositivo audio. L'hardware deve essere progettato in modo che i dati audio vengano trasmessi direttamente tra il client e l'hardware audio senza alcun intervento dal software del driver audio.

Le API sono disponibili solo con flussi audio in modalità condivisa. Per flussi in modalità esclusiva, le applicazioni scambiano dati direttamente con i dispositivi hardware WaveRT tramite buffer ciclici e nessun altro componente può toccare i dati nei buffer.

Per altre informazioni, vedere Oggetti di elaborazione audio windows.