Bagikan melalui


Offset Prefetch

Driver miniport WavePci memanggil metode IPreFetchOffset::SetPreFetchOffset untuk menentukan offset prefetch aliran output DirectSound yang dipercepat perangkat keras. Offset ini adalah jumlah byte data yang memisahkan kursor tulis dari kursor putar di buffer perangkat keras perangkat audio. Kursor tulis menentukan posisi buffer tempat aplikasi DirectSound dapat menulis sampel suara berikutnya dengan aman. Kursor putar menentukan posisi buffer sampel suara yang saat ini sedang diputar oleh perangkat audio.

DirectSound meminta driver port WavePci untuk posisi kursor putar dan tulis saat ini dengan mengirim permintaan properti KSPROPERTY_AUDIO_POSITION . Menanggapi permintaan ini, driver port memperoleh posisi bermain saat ini dari driver miniport dengan memanggil IMiniportWavePciStream::GetPosition. Bagaimana driver port menentukan posisi tulis tergantung pada apakah SetPreFetchOffset telah dipanggil.

Secara default, driver port memposisikan kursor tulis di pemetaan terakhir yang diminta oleh driver miniport. Dengan setiap panggilan ke IPortWavePciStream::GetMapping, offset prefetch default tumbuh lebih besar. Jika driver miniport WavePci memperoleh sejumlah besar pemetaan, offset default dapat tumbuh sangat besar.

Memanggil SetPreFetchOffset mengambil alih default. Setelah panggilan ini, driver port menghitung posisi tulis dengan menambahkan offset prefetch yang ditentukan ke posisi putar (dengan mempertimbangkan wraparound di akhir buffer DirectSound).

Driver miniport mungkin mengalokasikan sejumlah besar pemetaan karena beberapa alasan. Salah satunya adalah mengurangi overhead operasi audio pada prosesor sistem. Dengan lebih banyak pemetaan, driver membutuhkan lebih sedikit gangguan untuk menjaga perangkat audio terus disediakan dengan data. Alasan lain adalah bahwa mengalokasikan lebih banyak pemetaan mengurangi kemungkinan pemutaran audio akan mengalami gangguan ketika driver perangkat yang berperilaku buruk mengikat sistem untuk waktu yang singkat.

Salah satu masalah dengan offset prefetch besar adalah bahwa beberapa aplikasi DirectSound dapat menjadi bingung tentang posisi relatif kursor bermain dan tulis. Di Windows 95/98, VxD audio mempertahankan offset prefetch yang relatif kecil, dan aplikasi DirectSound yang ditulis untuk sistem operasi ini mungkin tidak berjalan dengan benar jika offset lebih besar dari yang mereka harapkan.

Misalnya, aplikasi mungkin membagi buffer DirectSound menjadi setengah atas dan setengah bawah dan kemudian "ping pong" dua bagian antara aplikasi dan perangkat. Ketika kursor tulis pertama kali memasuki bagian atas atau bawah buffer, kursor tulis setengah buffer senilai data ke setengah buffer tersebut. Skema ini mengasumsikan bahwa kursor putar selalu diposisikan di bagian lain dari buffer --setengah yang tidak ditulis. Perhatikan bahwa asumsi ini salah jika offset prefetch melebihi setengah ukuran buffer. Dalam hal ini, ketika kursor tulis mencapai akhir buffer DirectSound dan membungkus ke awal buffer, itu akan berada di setengah buffer yang sama dengan kursor putar. Ketika aplikasi menulis data senilai setengah buffer ke posisi kursor tulis baru, akhirnya menimpa posisi kursor putar dan menghancurkan data yang belum dimainkan.

Meskipun aplikasi itu sendiri tentu dapat disalahkan karena jenis kegagalan ini, driver miniport WavePci dapat menghilangkan mode kegagalan hanya dengan memanggil SetPreFetchOffset untuk mengatur offset prefetch ke nilai yang lebih kecil.

Mengatur offset prefetch ke nilai yang lebih kecil akan memindahkan kursor tulis yang dihasilkan lebih dekat ke kursor putar. Anda harus mengatur offset prefetch ke ukuran FIFO perangkat keras Anda. Offset prefetch yang khas adalah sekitar 64 sampel, tergantung pada desain perangkat keras mesin DMA.

Agar tetap kompatibel dengan aplikasi DirectSound lama tertentu, DirectSound saat ini mendukung kursor tulis pin yang dipercepat perangkat keras sebesar 10 milidetik. Perhatikan bahwa jumlah padding mungkin berubah di masa mendatang.

Untuk informasi tambahan tentang mengelola kursor tulis dan memutar kursor di tingkat driver, lihat Properti Posisi Audio.