Visão geral do driver de miniportador do sintetizador

Um sintetizador e um coletor são necessários para o suporte do DirectMusic. As implementações padrão de cada um são fornecidas com o DirectMusic. O Sintetizador de Software da Microsoft no modo de usuário é fornecido como o sintetizador padrão e o DirectSound é o coletor de ondas padrão. Eles fornecem emulação de hardware completa, mas aprimoramentos adicionais de desempenho normalmente podem ser obtidos com implementações de software ou hardware no modo kernel.

Se você estiver implementando suporte para hardware, a única opção é escrever um driver no modo kernel. No modo kernel, o coletor de ondas é fornecido pelo driver de porta DMus em PortCls e não deve precisar ser substituído para implementações personalizadas (como às vezes é feito no modo de usuário).

Para drivers DirectMusic no modo kernel, o arquivo de cabeçalho mais importante é dmusicks.h. Ele contém as interfaces main modo kernel necessárias para implementar o driver de miniporto. Essas interfaces são:

IMiniportDMus

ISynthSinkdMus

IMXF

IAllocatorMXF

IMasterClock

IPortDMus

As três últimas dessas interfaces são implementadas em PortCls.sys.

Dois outros arquivos de cabeçalho que são de interesse são dmusprop.h, que contém itens de propriedade DirectMusic, e dmusbuff.h, que contém o main estrutura IRP, DMUS_EVENTHEADER.

O diagrama a seguir mostra a relação entre o driver do adaptador IHV e o restante do sistema DirectMusic.

Diagrama ilustrando a relação entre o driver do adaptador e o sistema DirectMusic.

No nível superior, o driver é exposto por meio de um driver de porta DirectMusic (uma instância de interface IDirectMusicPort ). É assim que um aplicativo fala com o DirectMusic. Esse driver de porta se comunica para baixo com uma instância de pino por meio de chamadas de streaming de kernel padrão por meio da função DeviceIoControl (descrita na documentação do SDK do Microsoft Windows).

Observe que o termo "porta" tem dois significados conflitantes na figura acima. Evite confundir o uso do termo porta pela API do DirectMusic, no modo de usuário acima, com o driver de porta DMus no modo kernel. Os termos têm significados semelhantes, mas ligeiramente diferentes nos dois contextos. Em particular, observe que a interface IDirectMusicPort na parte superior da figura apresenta uma abstração de uma única instância de pino que o driver de porta DMus implementa na metade inferior da figura.

Cada objeto de driver de miniporta está conectado a um objeto de driver de porta correspondente. O objeto de driver de porta fornece serviços básicos para o driver de miniporto. Cada instância de pino que é mapeada para uma instância aberta do dispositivo tem serviços como conversão de formato, sequenciamento e "thruing" (para uma discussão sobre a conversão, consulte a descrição da interface IDirectMusicThru na documentação do SDK do Windows). Os pinos podem ser destinos ou fontes e podem dar suporte a vários formatos e intervalos de dados. Cada instância de pin especifica o destino ou a origem e especifica qual formato de dados e intervalo têm suporte.

O objeto de driver de miniporta é criado pelo driver do adaptador do IHV. Embora haja uma instância de pino e um sequenciador por instância aberta do driver, há apenas um par de drivers de miniport de porta por parte de hardware (ou sintetizador de software de kernel carregado). A comunicação com o driver de miniporto é por meio de um fluxo de eventos que é passado para o driver de miniporto e por itens de propriedade compatíveis com o driver de miniporto.

A seção DirectMusic Miniport Driver Interface apresenta os detalhes de uma implementação de driver de miniporto DirectMusic.