Pengalokasi

Antarmuka ke dan dari alokator adalah IMXF dan IAllocatorMXF. Antarmuka ini memungkinkan Anda menggunakan kembali struktur DMUS_KERNEL_EVENT tanpa mengalokasikan dan membatalkan alokasi memori. IMXF::P utMessage memberikan struktur kepada alokator dan IAllocatorMXF::GetMessage mengambil struktur DMUS_KERNEL_EVENT yang baru di-nol dari alokator untuk digunakan kembali. (Alokator dibuat dengan struktur DMUS_KERNEL_EVENT kosong di kumpulan sehingga tidak pernah mulai kosong.) Seperti yang ditunjukkan pada gambar diagram berikut, RUNTIME (dalam bentuk struktur DMUS_EVENTHEADER) masuk dari dmusic.dll ke pembungkus.

Diagram yang mengilustrasikan aliran RUNP melalui driver port dan miniport dalam proses alokator.

Unpacker memanggil IAllocatorMXF::GetMessage untuk mengambil struktur DMUS_KERNEL_EVENT kosong. Unpacker mengambil struktur DMUS_KERNEL_EVENT dari IRP, mengisi struktur ini (satu per peristiwa MIDI), dan meneruskannya ke pengurut (menggunakan antarmuka MXF-nya). Pengurut menyusun ulang mereka berdasarkan stempel waktu mereka dan, ketika jatuh tempo, meneruskannya ke driver miniport dengan memanggil IMXF::P utMessage. Driver miniport menarik data MIDI dari struktur DMUS_KERNEL_EVENT sehingga dapat merendernya ke dalam data gelombang. Ini meneruskan struktur DMUS_KERNEL_EVENT yang digunakan kembali ke alokator dengan panggilan IMXF::P utMessage lainnya.

Situasi terbalik terjadi untuk pengambilan. Data MIDI masuk dari perangkat keras ke driver miniport dan driver miniport memanggil IAllocatorMXF::GetMessage untuk mendapatkan struktur DMUS_KERNEL_EVENT kosong. DMUS_KERNEL_EVENT struktur diisi dengan stempel waktu dan data dan diteruskan ke sink pengambilan melalui IMXF::P utMessage. Driver miniport dapat meneruskan lebih dari satu pesan per struktur jika mengatur bendera DMUS_KEF_EVENT_INCOMPLETE dalam struktur DMUS_KERNEL_EVENT. Sink tangkapan di driver port DMus mengurai aliran data mentah ini dan memancarkan struktur DMUS_KERNEL_EVENT yang berisi pesan MIDI bertanda waktu (satu per struktur).

Dimungkinkan juga bagi driver miniport itu sendiri untuk memancarkan pesan bertanda waktu ke sink tangkapan. Dalam hal ini, driver tidak mengatur bit DMUS_KEF_EVENT_INCOMPLETE di DMUS_KERNEL_EVENT. Sink pengambilan meneruskan struktur bertanda waktu langsung ke pengemas, yang mengemas pesan ke dalam IRP dan mengirimkannya ke dmusic.dll. Penangkapan DirectMusic hanya untuk merekam MIDI. Untuk perekaman gelombang, gunakan penangkapan DirectSound.

Ketika pengemas menarik data dari struktur DMUS_KERNEL_EVENT, itu membuang struktur DMUS_KERNEL_EVENT yang digunakan ke dalam alokator dengan IMXF::P utMessage. Ketika buffer IRP penuh, buffer diteruskan ke dmusic.dll. Pengemas menerima IRP kosong dari dmusic.dll, mengisinya, dan melengkapinya. Lebih banyak RUN terus menetes sehingga selalu memiliki satu untuk mengisi.