Bagikan melalui


Sink Layanan dan Objek Grup Layanan

Driver sistem PortCls mengimplementasikan antarmuka IServiceSink dan IServiceGroup untuk keuntungan driver port dan miniport. Driver port menggunakan antarmuka ini untuk mendistribusikan pemberitahuan interupsi ke rutinitas layanannya sendiri, dan driver miniport memiliki opsi untuk menggunakan antarmuka ini untuk tujuan serupa. Objek IServiceSink merangkum rutinitas layanan, dan objek IServiceGroup mewakili sekelompok objek IServiceSink. Ketika grup layanan menerima permintaan layanan, grup layanan mendistribusikan permintaan ke setiap sink layanannya.

IServiceGroup mewarisi dari IServiceSink. Karena grup layanan juga merupakan sink layanan, grup layanan mampu berisi grup layanan lain, meskipun driver audio biasanya tidak menggunakan kemampuan ini. Driver port saat ini menggunakan grup layanan untuk mendemultiplex permintaan layanan interupsi, meskipun fungsionalitas grup layanan cukup umum untuk membuatnya berpotensi berguna untuk tujuan lain juga.

Rutinitas layanan interupsi (ISR) driver miniport memanggil salah satu metode pemberitahuan berikut di driver port:

IPortDMus::Beri tahu

IPortMidi::Beri tahu

IPortWaveCyclic::Beri tahu

IPortWavePci::Beri tahu

Metode pemberitahuan mengambil pointer ke grup layanan sebagai parameter panggilan. Selama panggilan ini, driver port memanggil metode IServiceSink::RequestService grup layanan, yang mengantre panggilan prosedur yang ditangguhkan (DPC). Ketika DPC dijalankan, DPC meneruskan permintaan layanan ke semua objek anggota dalam grup layanan.

Kode driver miniport biasanya tidak perlu memanggil metode antarmuka IServiceGroup apa pun. Namun, driver port memanggil metode ini untuk menambahkan objek IServiceSink sendiri ke grup layanan yang diperolehnya dari driver miniport. Driver miniport membuat objek grup layanan sesuai kebutuhan dan mengaitkan grup layanan tersebut dengan objek miniport dan streaming yang memerlukan layanan berkala. Misalnya, driver miniport WaveCyclic mengaitkan objek stream dengan grup layanan yang ditentukannya sebagai parameter output ke metode IMiniportWaveCyclic::NewStream .

Dalam konteks driver miniport WaveCyclic, mengaitkan semua aliran dengan satu grup layanan menyebabkan driver port melayani semua aliran berdasarkan satu pemberitahuan. Mengaitkan setiap aliran dengan grup layanannya sendiri memungkinkan rutinitas layanan interupsi untuk memilih aliran yang akan dilayankan oleh driver port selama eksekusi DPC.

Driver miniport menghasilkan referensi ke grup layanannya ketika driver port memanggil salah satu metode inisialisasi berikut:

IMiniportDMus::Init

IMiniportMidi::Init

IMiniportWavePci::Init

Driver port menambahkan objek IServiceSink sendiri ke grup layanan yang diperolehnya dari panggilan Init . Ketika ISR driver miniport nanti memanggil Beri tahu untuk mengirim pemberitahuan ke grup layanan tersebut, grup layanan mengantrekan DPC yang meneruskan pemberitahuan ke objek IServiceSink driver port, yang pada gilirannya meneruskan pemberitahuan ke driver miniport dengan memanggil salah satu metode layanan berikut:

IMiniportDMus::Layanan (tidak digunakan)

IMiniportMidi::Service

IMiniportWavePci::Service

Driver miniport juga menghasilkan referensi ke grup layanannya ketika driver port memanggil salah satu metode pembuatan aliran berikut:

IMiniportDMus::NewStream

IMiniportMidi::NewStream

IMiniportWaveCyclic::NewStream

IMiniportWavePci::NewStream

Seperti yang dibahas sebelumnya, driver miniport memiliki opsi untuk membuat grup layanan yang berbeda untuk setiap aliran atau berbagi satu grup layanan di semua aliran.

Metode berikut membantu driver port MIDI dan DMus menghindari gangguan perangkat keras yang hilang:

IPortMidi::RegisterServiceGroup

IPortDMus::RegisterServiceGroup

Selama eksekusi metode Init-nya , driver miniport MIDI atau DMus biasanya memanggil metode RegisterServiceGroup driver port sebelum memulai synthesizer. Tujuan untuk panggilan ini adalah untuk memungkinkan driver port memasukkan objek sink layanannya (berisi handler interupsinya) ke dalam grup layanan sebelum perangkat keras mulai menghasilkan gangguan. Meskipun metode Init menghasilkan penunjuk grup layanan ke driver port, driver port dapat menggunakan pointer ini hanya setelah pengembalian dari Init.

Dalam kasus driver port WavePci, objek port menambahkan objek IServiceSink sendiri ke grup layanan yang diperolehnya dari panggilan IMiniportWavePci::NewStream . Ketika ISR driver miniport nanti memanggil Beri tahu untuk mengirim pemberitahuan ke grup layanan tersebut, grup layanan mengantre DPC yang meneruskan pemberitahuan ke objek IServiceSink driver port, yang pada gilirannya melakukan hal berikut:

  • Meneruskan pemberitahuan ke aliran miniport dengan memanggil metode layanan IMiniportWavePciStream::Service.

  • Memicu peristiwa posisi dan/atau jam apa pun pada pin yang siap diaktifkan.

Antarmuka IServiceSink mendukung satu metode:

IServiceSink::RequestService

Antarmuka IServiceGroup mendukung metode berikut:

IServiceGroup::AddMember

IServiceGroup::CancelDelayedService

IServiceGroup::RequestDelayedService

IServiceGroup::RemoveMember

IServiceGroup::SupportDelayedService

Selain itu, driver sistem PortCls menyediakan fungsi PcNewServiceGroup untuk membuat objek grup layanan baru. Namun, tidak ada fungsi serupa untuk membuat objek sink layanan. Driver port hanya menambahkan antarmuka IServiceSink ke implementasi objek port utamanya--ketika objek dibuat, begitu juga sink layanan. Driver port dapat menambahkan antarmuka IServiceSink objek port ke grup layanan yang diterimanya dari metode Init atau NewStream driver miniport. Untuk kenyamanan, file header Portcls.h mendefinisikan konstanta IMP_IServiceSink dan IMP_IServiceGroup untuk menambahkan antarmuka IServiceSink dan IServiceGroup ke objek driver.