Latenza WaveCyclic

Se il driver miniport WaveCyclic fornisce la combinazione hardware di un flusso di riproduzione audio, DirectSound invia un IRP al driver di porta WaveCyclic che contiene l'intero flusso d'onda DirectSound in un singolo buffer ciclico. Il driver di porta WaveCyclic riceve l'IRP e inserisce i dati d'onda a fasi nel buffer DMA esposto dal driver. WaveCyclic tenta di mantenere il puntatore di scrittura del buffer DMA circa 40 millisecondi prima del puntatore di lettura. Anche quando il driver esegue la combinazione di hardware con DirectSound, può aspettarsi circa 40 millisecondi di dati aggiuntivi nel buffer DMA.

Il fatto che il driver di porta WaveCyclic tenti di accumulare fino a 40 millisecondi di dati nel buffer ciclico non significa che il driver di porta WaveCyclic aggiunge 40 millisecondi alla latenza del flusso. Infatti, il driver della porta aggiunge una latenza molto ridotta. Subito prima che inizi la riproduzione di un nuovo flusso, mentre il driver della porta sta ancora scrivendo i dati iniziali all'inizio del buffer ciclico, il driver della porta continua a scrivere finché non sono disponibili altri dati o il buffer contiene un totale di 40 millisecondi di dati. Tuttavia, se meno di questa quantità di dati è immediatamente disponibile, il driver della porta non forza l'attesa del driver miniport. Consente invece al driver miniport di iniziare immediatamente a riprodurre i dati già memorizzati nel buffer. Successivamente, man mano che diventano disponibili altri dati, il driver della porta continua a scrivere i dati nel buffer fino a quando non sono disponibili altri dati o la quantità di dati memorizzati nel buffer tra i puntatori di lettura e scrittura raggiunge i 40 millisecondi.

Dopo un periodo di fame, un flusso KMixer può contenere intervalli di silenzio. Se WaveCyclic ha ricevuto solo dati wave sufficienti da KMixer per mantenere trenta anziché quaranta millisecondi di dati aggiuntivi nel buffer DMA, WaveCyclic inizia a scrivere silenzio nel buffer DMA dopo la fine dei dati validi di KMixer. Questo criterio garantisce che, se si verifica una fame e il dispositivo legge oltre la fine dei dati validi, il dispositivo audio esegue il rendering del silenzio invece di dati non aggiornati o non inizializzati.

La quantità di silenzio scritto nel buffer DMA viene mantenuta abbastanza piccola e se KMixer riesce a fornire al driver della porta WaveCyclic dati aggiuntivi prima che il silenzio venga riprodotto, i dati sovrascrivono il silenzio nel buffer. In assenza di fame, il dispositivo audio riceve un flusso continuo di dati misti senza intervalli di silenzio forzato. Quando si esegue il debug del driver, tuttavia, si potrebbe vedere il metodo IMiniportWaveCyclicStream::Silence del driver miniport anche se il renderer audio non è affamato.