Wave Sink untuk Kernel-Mode Software Synthesizer

Seperti yang dijelaskan dalam Synthesizer dan Wave Sinks, driver port DMus mengimplementasikan wastafel gelombang untuk synthesizer perangkat lunak yang beroperasi dalam mode kernel. Driver miniport untuk synthesizer mengekspos antarmuka ISynthSinkDMus ke driver port. Sink gelombang driver port menggunakan antarmuka ini untuk membaca data gelombang yang dihasilkan oleh synthesizer.

Untuk menggunakan sink gelombang driver port DMus, driver miniport DMus harus menentukan filter DirectMusic dengan dua jenis pin:

  • Pin input DirectMusic atau pin input MIDI. Pin ini adalah sink untuk aliran render yang berisi pesan MIDI.

  • Pin output gelombang. Pin ini adalah sumber untuk aliran render yang berisi sampel PCM.

Gambar berikut menunjukkan filter DirectMusic yang berisi simpul synthesizer (KSNODETYPE_SYNTHESIZER). Filter ini memenuhi persyaratan sebelumnya untuk synthesizer perangkat lunak mode kernel dengan menyediakan pin input DirectMusic dan pin output gelombang. (Selain itu, driver miniport DMus yang mendukung sintesis MIDI warisan dapat memberikan pin input MIDI.)

Diagram yang mengilustrasikan filter DirectMusic untuk synthesizer perangkat lunak mode kernel dengan pin input DirectMusic dan pin output gelombang.

Di sisi kiri gambar, aliran MIDI memasuki filter melalui pin input DirectMusic. Pin ini memiliki antarmuka IMXF yang diekspos ke driver port. Driver port memperoleh antarmuka ini dengan memanggil metode IMiniportDMus::NewStream . Driver port menyalurkan pesan MIDI ke pin dengan memanggil metode IMXF::P utMessage .

Di sisi kanan gambar, aliran gelombang keluar dari filter melalui pin output gelombang dan mengalir ke wastafel gelombang driver port. Driver port berkomunikasi dengan pin melalui antarmuka ISynthSinkDMus - nya. Driver port memperoleh antarmuka ini dengan terlebih dahulu memanggil IMiniportDMus::NewStream untuk mendapatkan objek stream dengan antarmuka IMXF , lalu mengkueri objek untuk antarmuka ISynthSinkDMus-nya . Sink gelombang menarik data gelombang dari pin dengan memanggil metode ISynthSinkDMus::Render .

Meskipun synthesizer perangkat keras dapat, pada prinsipnya, mengandalkan sink gelombang driver port untuk penyajian, panggilan ke ISynthSinkDMus::Render menambahkan latensi yang cukup ke aliran MIDI untuk membuatnya tidak menarik bagi banyak aplikasi interaktif. Untuk mengurangi latensi aliran, synthesizer perangkat keras kemungkinan memiliki koneksi internal untuk mencampur dan merender gelombang perangkat keras alih-alih menggunakan wastafel gelombang driver port. Jenis synthesizer ini menggantikan pin output gelombang di sisi kanan gambar sebelumnya dengan koneksi hardwired (direpresentasikan sebagai pin penghubung) ke mixer perangkat keras.

Antarmuka ISynthSinkDMus menyediakan metode untuk merender data gelombang melalui wastafel gelombang, mengonversi dari waktu referensi ke waktu sampel dan kembali, dan menyinkronkan ke jam master:

ISynthSinkDMus::RefTimeToSample

ISynthSinkDMus::Render

ISynthSinkDMus::SampleToRefTime

ISynthSinkDMus::SyncToMaster

ISynthSinkDMus mewarisi dari antarmuka IMXF . Untuk informasi selengkapnya, lihat ISynthSinkDMus.

Driver miniport DMus pada gambar sebelumnya mengidentifikasi pin input DirectMusic dan pin output gelombang sebagai berikut:

  • Untuk mengidentifikasi pin input DirectMusic-nya, driver miniport menentukan rentang data pin untuk memiliki format utama jenis KSDATAFORMAT_TYPE_MUSIC dan subformat jenis KSDATAFORMAT_SUBTYPE_DIRECTMUSIC. Kombinasi ini menunjukkan bahwa pin menerima aliran MIDI bertanda waktu. Deskriptor rentang data adalah struktur jenis KSDATARANGE_MUSIC. (Misalnya, lihat DirectMusic Stream Data Range.) Driver miniport menentukan arah aliran data pin yang akan KSPIN_DATAFLOW_IN. (KsPinDescriptor struktur PCPIN_DESCRIPTOR. Anggota DataFlow menunjukkan arah aliran data.) Saat memanggil IMiniportDMus::NewStream untuk membuat objek stream untuk pin ini, driver port mengatur parameter StreamType ke DMUS_STREAM_MIDI_RENDER.

  • Untuk mengidentifikasi pin output gelombangnya, driver miniport mendefinisikan rentang data pin untuk memiliki format utama jenis KSDATAFORMAT_TYPE_AUDIO dan subformat jenis KSDATAFORMAT_SUBTYPE_PCM. Kombinasi ini menunjukkan bahwa pin memancarkan aliran audio gelombang yang berisi sampel PCM. Deskriptor rentang data adalah struktur jenis KSDATARANGE_AUDIO. (Lihat contoh dalam Rentang Data Aliran PCM.) Driver miniport menentukan arah aliran data pin yang akan KSPIN_DATAFLOW_OUT. Saat memanggil IMiniportDMus::NewStream untuk membuat objek stream untuk pin ini, driver port mengatur parameter StreamType ke DMUS_STREAM_WAVE_SINK.

Selain itu, jika driver mendukung pin input MIDI untuk synthesizer, definisinya akan mirip dengan pin input DirectMusic, tetapi definisi pin akan menentukan subformat jenis KSDATAFORMAT_SUBTYPE_MIDI, dan pin akan menerima aliran MIDI mentah daripada aliran MIDI bertanda waktu.