Condividi tramite


Offset di prefetch

Un driver miniport WavePci chiama il metodo IPreFetchOffset::SetPreFetchOffset per specificare l'offset di prefetch di un flusso di output DirectSound accelerato dall'hardware. Questo offset è il numero di byte di dati che separano il cursore di scrittura dal cursore di riproduzione nel buffer hardware del dispositivo audio. Il cursore di scrittura specifica la posizione del buffer in cui un'applicazione DirectSound può scrivere in modo sicuro l'esempio audio successivo. Il cursore di riproduzione specifica la posizione del buffer dell'esempio audio attualmente riprodotto dal dispositivo audio.

DirectSound esegue una query sul driver della porta WavePci per le posizioni correnti dei cursori di riproduzione e scrittura inviando una richiesta di proprietà KSPROPERTY_AUDIO_POSITION . In risposta a questa richiesta, il driver della porta ottiene la posizione di gioco corrente dal driver miniport chiamando IMiniportWavePciStream::GetPosition. Il modo in cui il driver di porta determina la posizione di scrittura dipende dal fatto che setPreFetchOffset sia stato chiamato.

Per impostazione predefinita, il driver di porta posiziona il cursore di scrittura nell'ultimo mapping richiesto dal driver miniport. Con ogni chiamata a IPortWavePciStream::GetMapping, l'offset di prefetch predefinito aumenta di dimensioni maggiori. Se il driver miniport WavePci acquisisce un numero elevato di mapping, l'offset predefinito può crescere molto grande.

La chiamata a SetPreFetchOffset esegue l'override del valore predefinito. Dopo questa chiamata, il driver di porta calcola la posizione di scrittura aggiungendo l'offset di prefetch specificato alla posizione di riproduzione (tenendo conto del wrapping alla fine del buffer DirectSound).

Un driver miniport può allocare un numero elevato di mapping per un paio di motivi. Uno consiste nel ridurre il sovraccarico delle operazioni audio sul processore di sistema. Con più mapping, il driver richiede meno interruzioni per mantenere il dispositivo audio fornito continuamente con i dati. Un altro motivo è che l'allocazione di più mapping riduce la probabilità che la riproduzione audio subisca problemi quando i driver di dispositivo si comportano male per collegare il sistema per brevi periodi.

Un problema con un grande offset di prefetch è che alcune applicazioni DirectSound possono diventare confuse sulle posizioni relative dei cursori di riproduzione e scrittura. In Windows 95/98, i dischi virtuali audio mantengono un offset di prefetch relativamente piccolo e le applicazioni DirectSound scritte per questi sistemi operativi potrebbero non essere eseguite correttamente se l'offset è maggiore di quanto previsto.

Ad esempio, un'applicazione potrebbe dividere il buffer DirectSound in una metà superiore e una metà inferiore e quindi "ping pong" le due metà tra l'applicazione e il dispositivo. Quando il cursore di scrittura entra prima nella metà superiore o inferiore del buffer, scrive un valore di dati di metà buffer in quella metà del buffer. Questo schema presuppone che il cursore di riproduzione sia sempre posizionato nell'altra metà del buffer- la metà che non viene scritta in. Si noti che questo presupposto non è corretto se l'offset di prefetch supera la metà delle dimensioni del buffer. In questo caso, quando il cursore di scrittura raggiunge la fine del buffer DirectSound e esegue il wrapping intorno all'inizio del buffer, sarà nella stessa metà del buffer del cursore di riproduzione. Quando l'applicazione scrive il valore di un buffer a metà dei dati nella nuova posizione del cursore di scrittura, termina la sovrascrizione della posizione del cursore di riproduzione e l'eliminazione dei dati non ancora riprodotti.

Anche se l'applicazione stessa può certamente essere accusata di questo tipo di errore, un driver miniport WavePci può eliminare la modalità di errore semplicemente chiamando SetPreFetchOffset per impostare l'offset di prefetch su un valore più piccolo.

L'impostazione dell'offset di prefetch su un valore inferiore sposta il cursore di scrittura risultante più vicino al cursore di riproduzione. È consigliabile impostare l'offset di prefetch sulle dimensioni FIFO dell'hardware. Un tipico offset di prefetch è di circa 64 campioni, a seconda della progettazione hardware del motore DMA.

Per rimanere compatibili con alcune applicazioni DirectSound meno recenti, DirectSound attualmente esegue il pad dei cursori di scrittura dei pin accelerati hardware per 10 millisecondi. Si noti che la quantità di riempimento potrebbe cambiare in futuro.

Per altre informazioni sulla gestione di cursori di scrittura e riproduzione dei cursori a livello di driver, vedere Proprietà posizione audio.