Allocator

할당자와의 인터페이스는 IMXFIAllocatorMXF입니다. 이러한 인터페이스를 사용하면 메모리를 할당하고 할당을 취소하지 않고 DMUS_KERNEL_EVENT 구조를 다시 사용할 수 있습니다. IMXF::P utMessage 는 할당자에 구조를 제공하고 IAllocatorMXF::GetMessage 는 재사용을 위해 할당자에서 새로 0으로 표시된 DMUS_KERNEL_EVENT 구조를 검색합니다. (할당자는 풀의 빈 DMUS_KERNEL_EVENT 구조로 만들어지므로 비어 있지 않습니다.) 다음 다이어그램 그림과 같이 IRP(DMUS_EVENTHEADER 구조체의 형태)는 dmusic.dll 압축 해제기로 들어옵니다.

할당자 프로세스에서 포트 및 미니포트 드라이버를 통한 IRP 흐름을 보여 주는 다이어그램

unpacker는 IAllocatorMXF::GetMessage 를 호출하여 빈 DMUS_KERNEL_EVENT 구조를 검색합니다. unpacker는 IRP에서 DMUS_KERNEL_EVENT 구조를 검색하고, 이러한 구조체를 채우고(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_KERNEL_EVENT 구조체에서 DMUS_KEF_EVENT_INCOMPLETE 플래그를 설정하는 경우 구조체당 둘 이상의 메시지를 전달할 수 있습니다. DMus 포트 드라이버의 캡처 싱크는 이 원시 데이터 스트림을 구문 분석하고 타임스탬프를 적용한 MIDI 메시지가 포함된 DMUS_KERNEL_EVENT 구조를 내보낸다(구조당 하나씩).

미니포트 드라이버 자체가 타임스탬프가 지정된 메시지를 캡처 싱크로 내보낸 것도 가능합니다. 이 경우 드라이버는 DMUS_KERNEL_EVENT DMUS_KEF_EVENT_INCOMPLETE 비트를 설정하지 않습니다. 캡처 싱크는 타임스탬프가 지정된 구조를 packer에 직접 전달하여 메시지를 IRP에 패키저하고 dmusic.dll 보냅니다. DirectMusic 캡처는 MIDI를 기록하는 데만 사용됩니다. 웨이브 기록의 경우 DirectSound 캡처를 사용합니다.

packer는 DMUS_KERNEL_EVENT 구조에서 데이터를 끌어오면 사용된 DMUS_KERNEL_EVENT 구조를 IMXF::P utMessage를 사용하여 할당자로 삭제합니다. IRP 버퍼가 가득 차면 dmusic.dll 전달됩니다. 패커는 dmusic.dll 빈 IRP를 수신하고, 채우고, 완료합니다. 더 많은 IRP는 항상 채울 수 있도록 아래로 흘러 계속.