Partager via


Un récepteur de vague pour les synthétiseurs logiciels Kernel-Mode

Comme expliqué dans Synthétiseurs et récepteurs d’ondes, le pilote de port DMus implémente le récepteur d’ondes pour un synthétiseur logiciel qui fonctionne en mode noyau. Le pilote miniport du synthétiseur expose une interface ISynthSinkDMus au pilote de port. Le récepteur d’ondes du pilote de port utilise cette interface pour lire les données d’onde produites par le synthétiseur.

Pour utiliser le récepteur d’ondes du pilote de port DMus, un pilote miniport DMus doit définir un filtre DirectMusic avec deux types de broches :

  • Une broche d’entrée DirectMusic ou une broche d’entrée MIDI. Cette broche est un récepteur pour un flux de rendu contenant des messages MIDI.

  • Broche de sortie d’onde. Cette broche est une source pour un flux de rendu contenant des exemples PCM.

La figure suivante montre un filtre DirectMusic contenant un nœud de synthétiseur (KSNODETYPE_SYNTHESIZER). Ce filtre répond aux exigences précédentes pour un synthétiseur logiciel en mode noyau en fournissant une broche d’entrée DirectMusic et une broche de sortie wave. (En outre, un pilote miniport DMus qui prend en charge la synthèse MIDI héritée peut fournir une broche d’entrée MIDI.)

Diagramme illustrant un filtre DirectMusic pour un synthétiseur logiciel en mode noyau avec broche d’entrée DirectMusic et broche de sortie d’onde.

Sur le côté gauche de la figure, un flux MIDI entre dans le filtre via la broche d’entrée DirectMusic. Cette broche a une interface IMXF qu’elle expose au pilote de port. Le pilote de port obtient cette interface en appelant la méthode IMiniportDMus ::NewStream . Le pilote de port alimente les messages MIDI vers la broche en appelant la méthode IMXF ::P utMessage .

Sur le côté droit de la figure, un flux d’onde quitte le filtre par le biais de la broche de sortie d’onde et s’écoule vers le récepteur d’ondes du pilote de port. Le pilote de port communique avec la broche via son interface ISynthSinkDMus . Le pilote de port obtient cette interface en appelant D’abord IMiniportDMus ::NewStream pour obtenir un objet de flux avec une interface IMXF , puis en interrogeant l’objet pour son interface ISynthSinkDMus . Le récepteur d’onde extrait les données d’onde de la broche en appelant la méthode ISynthSinkDMus ::Render .

Bien qu’un synthétiseur matériel puisse, en principe, s’appuyer sur le récepteur d’ondes du pilote de port pour le rendu, l’appel à ISynthSinkDMus ::Render ajoute une latence suffisante au flux MIDI pour le rendre peu attrayant pour de nombreuses applications interactives. Pour réduire la latence du flux, les synthétiseurs matériels sont susceptibles d’avoir des connexions internes au matériel de mixage et de rendu des ondes au lieu d’utiliser le récepteur d’ondes du pilote de port. Ce type de synthétiseur remplace la broche de sortie d’onde sur le côté droit de la figure précédente par une connexion câblée (représentée sous la forme d’une broche de pont) à un mélangeur matériel.

L’interface ISynthSinkDMus fournit des méthodes pour afficher les données d’ondes via un récepteur d’ondes, convertir de l’heure de référence à l’heure de l’exemple, puis effectuer une synchronisation avec l’horloge master :

ISynthSinkDMus ::RefTimeToSample

ISynthSinkDMus ::Render

ISynthSinkDMus ::SampleToRefTime

ISynthSinkDMus ::SyncToMaster

ISynthSinkDMus hérite de l’interface IMXF . Pour plus d’informations, consultez ISynthSinkDMus.

Le pilote miniport DMus dans la figure précédente identifie sa broche d’entrée DirectMusic et sa broche de sortie d’onde comme suit :

  • Pour identifier sa broche d’entrée DirectMusic, le pilote miniport définit la plage de données de la broche pour avoir un format majeur de type KSDATAFORMAT_TYPE_MUSIC et un sous-format de type KSDATAFORMAT_SUBTYPE_DIRECTMUSIC. Cette combinaison indique que la broche accepte un flux MIDI horodaté. Le descripteur de plage de données est une structure de type KSDATARANGE_MUSIC. (Pour obtenir un exemple, consultez Plage de données de flux DirectMusic.) Le pilote miniport définit la direction du flux de données de la broche à KSPIN_DATAFLOW_IN. (KsPinDescriptor de la structure PCPIN_DESCRIPTOR. Le membre DataFlow indique la direction du flux de données.) Lorsque vous appelez IMiniportDMus ::NewStream pour créer l’objet stream pour cette broche, le pilote de port définit le paramètre StreamType sur DMUS_STREAM_MIDI_RENDER.

  • Pour identifier sa broche de sortie d’onde, le pilote miniport définit la plage de données de la broche pour avoir un format majeur de type KSDATAFORMAT_TYPE_AUDIO et une sous-forme de type KSDATAFORMAT_SUBTYPE_PCM. Cette combinaison indique que la broche émet un flux audio wave contenant des exemples PCM. Le descripteur de plage de données est une structure de type KSDATARANGE_AUDIO. (Voir l’exemple dans Plage de données de flux PCM.) Le pilote miniport définit la direction du flux de données de la broche à KSPIN_DATAFLOW_OUT. Lorsque vous appelez IMiniportDMus ::NewStream pour créer l’objet stream pour cette broche, le pilote de port définit le paramètre StreamType sur DMUS_STREAM_WAVE_SINK.

En outre, si le pilote prenait en charge une broche d’entrée MIDI pour le synthétiseur, sa définition serait similaire à celle de la broche d’entrée DirectMusic, mais la définition de broche spécifierait une sous-forme de type KSDATAFORMAT_SUBTYPE_MIDI, et la broche accepterait un flux MIDI brut plutôt qu’un flux MIDI horodaté.