Поделиться через


Allocator

Интерфейсы к распределителю и из нее : IMXF и IAllocatorMXF. Эти интерфейсы позволяют повторно использовать DMUS_KERNEL_EVENT структуры без выделения и освобождения памяти. IMXF::P utMessage предоставляет структуру распределителя, а IAllocatorMXF::GetMessage получает только что обнуляемую структуру DMUS_KERNEL_EVENT из распределителя для повторного использования. (Распределител создается с пустыми DMUS_KERNEL_EVENT структурами в пуле, чтобы он никогда не запускал пустой.) Как показано на рисунке ниже, irP (в виде структур DMUS_EVENTHEADER) поступают из dmusic.dll в распаковщик.

Схема, иллюстрирующая поток irP через порт и драйверы минипорта в процессе выделения.

Распаковка вызывает IAllocatorMXF::GetMessage для получения пустой структуры DMUS_KERNEL_EVENT . Распаковка извлекает DMUS_KERNEL_EVENT структуры из IRP, заполняет эти структуры (по одной на событие MIDI) и передает их в секвенсор (с помощью интерфейса MXF). Секвенсор переупорядочивает их на основе меток времени и передает их драйверу мини-порта, вызывая IMXF::P utMessage. Драйвер мини-порта извлекает данные MIDI из DMUS_KERNEL_EVENT структур, чтобы они могли преобразовываться в волновые данные. Он передает используемые структуры DMUS_KERNEL_EVENT обратно в распределителю с другим вызовом IMXF::P utMessage .

Обратная ситуация происходит для захвата. Данные MIDI поступают из оборудования в драйвер мини-порта, и драйвер мини-порта вызывает IAllocatorMXF::GetMessage , чтобы получить пустую структуру DMUS_KERNEL_EVENT. DMUS_KERNEL_EVENT структуры заполняются метками времени и данными и передаются в приемник захвата через IMXF::P utMessage. Драйвер мини-порта может передать несколько сообщений для каждой структуры, если он устанавливает флаг DMUS_KEF_EVENT_INCOMPLETE в структуре DMUS_KERNEL_EVENT. Приемник записи в драйвере порта DMus анализирует этот необработанный поток данных и выдает DMUS_KERNEL_EVENT структуры, содержащие сообщения MIDI с отметкой времени (по одному на структуру).

Драйвер мини-порта также может выдавать сообщения с меткой времени в приемник захвата. В этом случае драйвер не задает бит DMUS_KEF_EVENT_INCOMPLETE в DMUS_KERNEL_EVENT. Приемник захвата передает структуры с метками времени непосредственно упаковщику, который упаковывает сообщения в IRP и отправляет их в dmusic.dll. Запись DirectMusic используется только для записи MIDI. Для записи волн используйте запись DirectSound.

Когда упаковщик извлекает данные из структуры DMUS_KERNEL_EVENT, он удаляет используемую структуру DMUS_KERNEL_EVENT в распределитель с помощью IMXF::P utMessage. Когда буфер IRP заполнен, он передается до dmusic.dll. Упаковщик получает пустые irP от dmusic.dll, заполняет их и завершает. Больше IRP продолжают просачиваться вниз, так что он всегда имеет один для заполнения.