Latenza di flusso durante la riproduzione
Mentre un flusso di riproduzione audio è in stato Run, il ruolo del driver di porta WaveRT è minimo. Come illustrato nel diagramma seguente, durante la riproduzione il client del driver di porta WaveRT scrive i dati nel buffer ciclico e nel dispositivo audio quindi legge questi dati dal buffer. Questa attività non richiede alcun intervento dal driver di porta. In altre parole, i dati audio passano direttamente tra l'applicazione in modalità utente e l'hardware audio senza essere toccati da componenti software in modalità kernel.
Nel diagramma le posizioni di scrittura e riproduzione procedono continuamente da sinistra a destra mentre il flusso di dati audio scorre attraverso il buffer ciclico. Il buffer viene descritto come ciclico perché quando la posizione di riproduzione o la posizione di scrittura raggiunge la fine del buffer, esegue automaticamente il wrapping all'inizio del buffer.
La latenza di flusso durante la riproduzione ha due origini principali, designate nel diagramma seguente come A e B.
Nel diagramma precedente, la posizione di scrittura è la posizione appena oltre l'ultimo esempio scritto dal client nel buffer. La posizione di riproduzione è l'esempio che il dispositivo audio sta attualmente riproducendo tramite l'altoparlante.
La latenza dal momento in cui il client scrive un campione audio nel buffer fino a quando il dispositivo audio non riproduce semplicemente la separazione tra le posizioni di scrittura e riproduzione. Questa separazione è la somma delle due origini di latenza seguenti (contrassegnate come A e B nel diagramma):
Latenza A: dopo che il dispositivo audio legge i dati dal buffer, i dati si trovano in un buffer "first in, first out" (FIFO) hardware fino a quando il dispositivo audio non visualizza i dati tramite il convertitore digitale-analogico (DAC).
Latenza B: dopo che il client scrive i dati nel buffer ciclico, i dati si trovano nel buffer fino a quando il dispositivo audio legge i dati.
Il client non ha alcun controllo sulla latenza A, che dipende interamente dall'hardware. Un FIFO tipico potrebbe archiviare campioni sufficienti per alimentare l'applicazione livello dati per circa 64 tick del clock di esempio. Tuttavia, il client controlla la latenza B. Rendendo latenza B troppo grande introduce ritardi non necessari nel sistema; tuttavia, rendendo troppo piccolo il rischio di esaurimento del dispositivo audio.
Anche se il client può configurare un timer per attivare periodicamente il thread di scrittura del buffer, questo metodo non ottiene la latenza più piccola. Per ridurre ulteriormente la latenza, il client può configurare il dispositivo per generare una notifica hardware ogni volta che il dispositivo termina la lettura di un nuovo blocco di dati di riproduzione dal buffer. In questo caso, il thread client viene attivato dalle notifiche hardware anziché da un timer.
Se il dispositivo audio invia una notifica al client ogni volta che termina la lettura di un blocco di dati dal buffer, il client può rendere la latenza più piccola di quanto altrimenti sarebbe pratica.
Il client può ottenere un riepilogo dei ritardi che contribuiscono alla latenza di flusso inviando una richiesta di KSPROPERTY_RTAUDIO_HWLATENCY al driver di porta WaveRT.
Dopo che il client determina la quantità di separazione da mantenere tra le posizioni di scrittura e di gioco, il client monitora le modifiche nella posizione di riproduzione per determinare la distanza di avanzamento della posizione di scrittura. Nei sistemi operativi Windows Server 2008 e versioni successive, il client invia una richiesta di proprietà KSPROPERTY_RTAUDIO_POSITIONREGISTER per determinare la posizione di riproduzione. Il supporto per questa funzionalità è fornito da miglioramenti nel driver di sistema PortCls.
Se il dispositivo audio ha un registro di posizione come illustrato nel diagramma precedente, la richiesta di proprietà esegue il mapping del registro a un indirizzo di memoria virtuale accessibile al client in modalità utente. Dopo il mapping del registro di posizione, il client può leggere il contenuto dell'indirizzo di memoria per determinare la posizione di riproduzione corrente.