Latenza WavePci

Il driver della porta WavePci gestisce il buffering di un flusso audio in modo diverso dal driver WaveCyclic.

Se il driver miniport WavePci fornisce la combinazione hardware, DirectSound invia un IRP al driver di porta WavePci che contiene l'intero flusso d'onda DirectSound in un singolo buffer ciclico. DirectSound alloca il buffer come blocco contiguo di memoria virtuale. Per evitare di copiare il buffer DirectSound, il livello di streaming del kernel esegue il mapping del buffer nella memoria virtuale in modalità kernel e genera un MDL (elenco descrittore di memoria) che specifica sia gli indirizzi virtuali che fisici delle pagine di memoria nel buffer ciclico. Il driver della porta WavePci partiziona il buffer ciclico in una sequenza di fotogrammi allocatore (vedere Allocatori KS). Il driver miniport specifica le dimensioni di allocator-frame preferite quando il metodo IMiniportWavePciStream::GetAllocatorFraming viene chiamato dal driver di porta durante l'inizializzazione del flusso. Tuttavia, SysAudio, il generatore di grafici di sistema, può eseguire l'override delle preferenze del driver miniport per soddisfare i requisiti degli altri componenti nel grafico del filtro audio.

Il driver di porta WavePci espone il buffer ciclico al driver miniport come sequenza di mapping. Un mapping è un intero frame di allocazione o una parte di un frame. Se un particolare frame di allocazione si trova completamente all'interno di una pagina, il driver di porta presenta tale frame al driver miniport come singolo mapping. Se un frame di allocazione si allontana da uno o più limiti di pagina, il driver della porta divide il frame in ogni limite di pagina e lo presenta come due o più mapping. Ogni chiamata a IPortWavePciStream::GetMapping restituisce il mapping successivo successivo nella sequenza.

A differenza del caso WaveCyclic, in cui il driver miniport ha poco controllo sul numero di millisecondi di dati memorizzati nel buffer nell'hardware, il driver miniport WavePci ha un notevole controllo sul numero di mapping aperti in qualsiasi momento. Il numero di mapping aperti aumenta di uno con ogni chiamata a GetMapping e diminuisce di uno con ogni chiamata a ReleaseMapping. (A) La chiamata GetMapping può avere esito negativo, naturalmente, in modo che il driver abbia un controllo inferiore al totale sul numero di mapping. Controllando il numero di mapping aperti e tenendo traccia delle dimensioni cumulative dei mapping, il driver miniport può determinare (entro una tolleranza dipendente dalla dimensione del mapping) il numero di millisecondi di buffering disponibili per l'hardware. Il driver miniport WavePci dovrebbe richiedere mapping di pagina sufficienti per ridurre le probabilità di fame a livelli accettabili.

Se i criteri del driver miniport devono memorizzare nel buffer fino a 50 millisecondi di dati, ad esempio tra i puntatori di lettura e scrittura, tenere presente che questo limite rappresenta la quantità massima di dati accumulata dal driver, ma non deve rappresentare il contributo del driver alla latenza del flusso. Il driver deve essere progettato per mantenere la latenza il più piccola possibile. Quando un driver miniport ottiene il set iniziale di mapping prima di iniziare a riprodurre un nuovo flusso, il driver miniport può continuare a richiedere mapping finché non raggiunge il limite di buffer (50 millisecondi in questo esempio) o non sono immediatamente disponibili altri mapping. In quest'ultimo caso, tuttavia, il driver miniport non deve attendere fino a quando non diventano disponibili più mapping prima di iniziare a riprodurre il flusso. Al contrario, il driver dovrebbe iniziare immediatamente a riprodurre i mapping che ha già ottenuto. Successivamente, man mano che diventano disponibili più mapping, il driver può continuare ad acquisire mapping aggiuntivi fino a quando non raggiunge il limite di dimensioni del buffer o non sono immediatamente disponibili altri mapping.

In generale, l'hardware DMA di un dispositivo WavePci deve essere progettato per accedere direttamente ai fotogrammi audio archiviati in allineamenti di byte arbitrari e che si allontanano tra pagine non contigue di memoria fisica. Se si dispone di un dispositivo che richiede che i mapping siano un numero integrale di fotogrammi audio, tale dispositivo è limitato nei tipi di formati audio supportati. Naturalmente, un dispositivo con questa limitazione dovrebbe comunque essere in grado di gestire una dimensione del fotogramma audio che è una potenza di due.

Ad esempio, un dispositivo con quattro canali e una dimensione del campione a 16 bit richiede una dimensione del fotogramma audio di otto byte. Un numero integrale di fotogrammi audio si adatta perfettamente all'interno di una pagina (o qualsiasi altra dimensione del frame di allocazione che è un multiplo di otto byte). Tuttavia, nel caso di un flusso di canale a 5.1 con campioni a 16 bit, la dimensione del frame audio è di 12 byte e un flusso che supera le dimensioni di una singola pagina contiene necessariamente frame audio che si allontanano dai limiti della pagina. (I dati in I filtri wave illustrano questo problema. L'hardware che non può gestire allineamenti di byte arbitrari e mapping arbitrari di byte-length deve dipendere dal driver per eseguire una copia intermedia, che riduce le prestazioni.

Il driver dell'adattatore di esempio Ac97 in Microsoft Windows Driver Kit (WDK) implementa un metodo GetAllocatorFraming. Il driver miniport usa questo metodo per comunicare le dimensioni di allocazione dei fotogrammi preferite. In Windows 2000 e Windows Me, il driver della porta chiama questo metodo solo quando viene creata un'istanza del driver di sistema Splitter (Splitter.sys) sopra il pin di output. In Windows XP e versioni successive, il driver della porta chiama questo metodo anche per i flussi di input. Tenere presente che SysAudio potrebbe scegliere di ignorare le preferenze del driver miniport quando si decide una dimensione di allocazione dei fotogrammi.