Bagikan melalui


Latensi WavePci

Driver port WavePci menangani buffering aliran audio secara berbeda dari driver WaveCyclic.

Jika driver miniport WavePci Anda menyediakan pencampuran perangkat keras, DirectSound mengirimkan IRP ke driver port WavePci yang berisi seluruh aliran gelombang DirectSound dalam satu buffer siklik. DirectSound mengalokasikan buffer sebagai blok memori virtual yang berdekatan. Untuk menghindari penyalinan buffer DirectSound, lapisan streaming kernel memetakan buffer ke memori virtual mode kernel dan menghasilkan MDL (daftar deskriptor memori) yang menentukan alamat virtual dan fisik halaman memori dalam buffer siklik. Driver port WavePci mempartisi buffer siklik ke dalam urutan bingkai alokator (lihat Alokator KS). Driver miniport menentukan ukuran bingkai alokator pilihannya ketika metode IMiniportWavePciStream::GetAllocatorFraming dipanggil oleh driver port selama inisialisasi aliran. Namun, SysAudio, penyusun grafik sistem, dapat mengganti preferensi driver miniport untuk mengakomodasi persyaratan komponen lain dalam grafik filter audio.

Driver port WavePci mengekspos buffer siklik ke driver miniport sebagai urutan pemetaan. Pemetaan adalah seluruh bingkai alokasi atau sebagian bingkai. Jika bingkai alokasi tertentu terletak sepenuhnya dalam halaman, driver port menyajikan bingkai itu ke driver miniport sebagai pemetaan tunggal. Jika bingkai alokasi melintasi satu atau beberapa batas halaman, driver port membagi bingkai di setiap batas halaman dan menyajikannya sebagai dua pemetaan atau lebih. Setiap panggilan ke IPortWavePciStream::GetMapping menghasilkan pemetaan berturut-turut berikutnya secara berurutan.

Berbeda dengan kasus WaveCyclic, di mana driver miniport memiliki sedikit kontrol atas berapa milidetik data yang di-buffer pada perangkat keras, driver miniport WavePci memiliki kontrol yang cukup besar atas jumlah pemetaan yang telah dibuka kapan saja. Jumlah pemetaan terbuka meningkat satu per satu dengan setiap panggilan ke GetMapping dan berkurang satu dengan setiap panggilan ke ReleaseMapping. (A Panggilan GetMapping dapat gagal, tentu saja, sehingga driver memiliki kurang dari kontrol total atas jumlah pemetaan.) Dengan mengontrol jumlah pemetaan terbuka dan melacak kumulatif ukuran pemetaan, driver miniport dapat menentukan (dalam toleransi tergantung pada ukuran pemetaan) jumlah milidetik buffering yang tersedia untuk perangkat keras. Driver miniport WavePci Anda harus meminta pemetaan halaman yang cukup untuk mengurangi kemungkinan kelaparan ke tingkat yang dapat diterima.

Jika kebijakan driver miniport Anda adalah buffer hingga 50 milidetik data, misalnya, antara pointer baca dan tulis, ingatlah bahwa batas ini mewakili jumlah data maksimum yang akan diakumulasikan driver Anda, tetapi tidak dan tidak boleh mewakili kontribusi driver Anda terhadap latensi aliran. Driver Anda harus dirancang untuk menjaga latensinya sesecil mungkin. Ketika driver miniport mendapatkan serangkaian pemetaan awalnya sebelum mulai memutar aliran baru, driver miniport dapat terus meminta pemetaan sampai mencapai batas buffernya (50 milidetik dalam contoh ini) atau tidak ada lagi pemetaan yang segera tersedia. Namun, dalam kasus terakhir, driver miniport tidak boleh menunggu sampai lebih banyak pemetaan tersedia sebelum mulai memutar aliran. Sebaliknya, driver harus segera mulai memainkan pemetaan yang telah diperolehnya. Kemudian, ketika lebih banyak pemetaan tersedia, driver dapat terus memperoleh pemetaan tambahan sampai mencapai batas ukuran buffer atau tidak ada lagi pemetaan yang segera tersedia.

Secara umum, perangkat keras DMA perangkat WavePci harus dirancang untuk langsung mengakses bingkai audio yang disimpan pada keselarasan byte arbitrer dan batas-batas straddle antara halaman memori fisik yang tidak bersebelahan. Jika Anda memiliki perangkat yang mengharuskan pemetaan menjadi jumlah integral bingkai audio, perangkat tersebut terbatas dalam jenis format audio yang didukungnya. Tentu saja, perangkat dengan batasan ini harus tetap dapat menangani ukuran bingkai audio yang merupakan kekuatan dua.

Misalnya, perangkat dengan empat saluran dan ukuran sampel 16-bit memerlukan ukuran bingkai audio delapan byte. Jumlah integral bingkai audio cocok dengan rapi dalam halaman (atau ukuran bingkai alokasi lainnya yang merupakan kelipatan delapan byte). Namun, dalam kasus aliran 5,1 saluran dengan sampel 16-bit, ukuran bingkai audio adalah 12 byte dan aliran yang melebihi ukuran satu halaman yang selalu berisi bingkai audio yang membatasi batas halaman. (Angka-angka dalam Filter Gelombang mengilustrasikan masalah ini.) Perangkat keras yang tidak dapat menangani penyelarasan byte sewenang-wenang dan pemetaan panjang byte arbitrer harus bergantung pada driver untuk melakukan salinan perantara, yang menurunkan performa.

Driver adaptor sampel Ac97 di Microsoft Windows Driver Kit (WDK) menerapkan metode GetAllocatorFraming. Driver miniport menggunakan metode ini untuk mengomunikasikan ukuran alokasi bingkai pilihannya. Di Windows 2000 dan Windows Me, driver port memanggil metode ini hanya ketika driver sistem Splitter (Splitter.sys) dibuat di atas pin output. Di Windows XP dan yang lebih baru, driver port memanggil metode ini untuk aliran input juga. Ingatlah bahwa SysAudio mungkin memilih untuk mengabaikan preferensi driver miniport saat memutuskan ukuran alokasi bingkai.