Bagikan melalui


Peristiwa Perangkat Keras

Beberapa perangkat audio menyediakan kenop kontrol volume perangkat keras, sakelar bisu, atau jenis kontrol manual lainnya. Aplikasi dapat merespons perubahan dalam kontrol ini dengan menyesuaikan volume atau mengubah cara aliran audio diputar. Ketika pengguna menyesuaikan kontrol perangkat keras, driver miniport menggunakan antarmuka IPortEvents untuk memberi tahu driver port bahwa peristiwa perangkat keras telah terjadi. Driver port, pada gilirannya, memberi tahu aplikasi peristiwa sehingga dapat membaca pengaturan kontrol baru dari perangkat.

Driver miniport Anda dapat meminta driver port untuk antarmuka IPortEvents pada saat ia melayani panggilan Init (lihat IMiniportWavePci::Init, misalnya) dari driver port. Pada Microsoft Windows 98 SE, Windows Me, dan Windows 2000 dan yang lebih baru, kueri tersebut berhasil. Untuk contoh kode, lihat adaptor audio sampel Sb16 di versi Windows Driver Kit (WDK) sebelumnya.

Ketika driver port memanggil metode IMiniport::GetDescription driver Anda, metode menghasilkan struktur PCFILTER_DESCRIPTOR yang menentukan, antara lain, peristiwa yang didukung perangkat Anda. Peristiwa dapat ditentukan dalam tabel otomatisasi untuk anggota Pin dan Simpul PCFILTER_DESCRIPTOR, dan di anggota AutomationTable , yang menunjuk ke tabel otomatisasi untuk filter itu sendiri. Setiap peristiwa ditentukan oleh struktur PCEVENT_ITEM . Driver Anda harus mengatur anggota Set dan Id struktur PCEVENT_ITEM ke KSEVENTSETID_AudioControlChange dan KSEVENT_CONTROL_CHANGE, dan harus memuat penunjuk ke rutinitas EventHandler driver Anda ke anggota Handler . Driver Anda juga harus mengatur bit PCEVENT_ITEM_FLAG_BASICSUPPORT di anggota Bendera untuk menunjukkan dukungan dasar untuk peristiwa perubahan kontrol, dan harus mengatur bit PCEVENT_ITEM_FLAG_ONESHOT dan/atau PCEVENT_ITEM_FLAG_ENABLE untuk menunjukkan bahwa ia mendukung pemberitahuan satu bidikan dan/atau berulang.

Ketika aplikasi kemudian memanggil fungsi mixerOpen (dijelaskan dalam dokumentasi Microsoft Windows SDK) untuk meminta pemberitahuan peristiwa tertentu, driver port kemudian memanggil rutinitas EventHandler driver Anda dengan pointer ke struktur PCEVENT_REQUEST . Anggota Kata Kerja struktur ini diatur ke PCEVENT_VERB_ADD dan anggota EventItem-nya menentukan peristiwa yang akan diaktifkan. Struktur PCEVENT_REQUEST juga berisi pointer ke struktur KSEVENT_ENTRY yang harus diperlakukan driver Anda sebagai data sistem buram. Setelah mengaktifkan acara, handler Anda harus memanggil IPortEvents::AddEventToEventList dengan pointer KSEVENT_ENTRY yang sama. Dengan panggilan ini, handler mengakui bahwa peristiwa diaktifkan.

Ketika peristiwa perangkat keras terjadi dan rutinitas layanan interupsi driver Anda mendeteksi bisu atau perubahan volume, driver Anda memberi sinyal peristiwa ke driver port dengan memanggil IPortEvents::GenerateEventList dengan serangkaian parameter yang menjelaskan peristiwa. Misalnya, panggilan berikut menjelaskan perubahan kontrol dalam simpul volume lineout:

    pPE->GenerateEventList(NULL, KSEVENT_CONTROL_CHANGE,
                           FALSE, ULONG(-1), TRUE, LINEOUT_VOL);

Selama panggilan ini, driver port mencari daftar peristiwanya untuk semua peristiwa yang cocok dengan parameter panggilan dan mengirim pemberitahuan ke klien yang memantau peristiwa ini. Dalam contoh ini, pPE adalah penunjuk ke objek IPortEvents , dan LINEOUT_VOL adalah ID simpul yang ditetapkan driver miniport ke simpul volume lineout. Parameter yang tidak ditentukan (seperti GUID set peristiwa dan ID pin dalam contoh sebelumnya) diperlakukan sebagai wildcard dan selalu cocok dengan parameter yang sesuai dalam daftar.