Synthétiseurs et récepteurs d’ondes
Le moteur de rendu comporte deux parties :
Le synthétiseur, qui prend les messages MIDI et les convertit en exemples audio wave.
Le récepteur d’ondes, qui fournit une destination pour les exemples d’ondes et permet de synchroniser la sortie.
Par défaut, une application DirectMusic utilise le synthétiseur logiciel Microsoft (dmsynth.dll) comme synthétiseur et DirectSound comme appareil de sortie d’ondes.
Dans DirectX 6.1 et DirectX 7, une application DirectMusic peut remplacer ces valeurs par défaut. Par exemple, l’application peut utiliser le synthétiseur logiciel Microsoft, mais diriger la sortie vers un fichier .wav, ou implémenter un synthétiseur personnalisé qui fonctionne avec le récepteur d’ondes par défaut. Ce dernier scénario est plus probable, car le récepteur d’ondes par défaut devrait fonctionner bien pour la plupart des synthétiseurs.
Dans DirectX 8 et versions ultérieures, DirectMusic utilise toujours son récepteur d’ondes intégré pour générer des données à partir d’un synthé en mode utilisateur, mais une application peut remplacer le synthé logiciel par défaut. Cela signifie qu’une application DirectMusic peut implémenter un synthétiseur en mode utilisateur personnalisé, mais que le synthétiseur doit utiliser le récepteur d’ondes intégré de DirectMusic.
La figure ci-dessous montre comment l’architecture DirectMusic intègre des synthétiseurs en mode utilisateur et des récepteurs d’ondes. Notez que le bloc intitulé « Port DirectMusic » dans la figure suivante ne doit pas être confondu avec le pilote de port DMus en mode noyau dans le module pilote système PortCls, portcls.sys. Un port DirectMusic est un objet en mode utilisateur avec une interface IDirectMusicPort (qui fait partie de l’API DirectMusic) et est implémenté dans dmusic.dll. Pour plus d’informations sur les ports DirectMusic, consultez la documentation Microsoft Windows SDK.
Dans la figure précédente, l’application envoie des données au port DirectMusic en mode utilisateur, qui transmet les données (MIDI ou DLS) au synthé logiciel (dmsynth.dll par défaut) afin qu’elle puisse afficher les notes en données wave. Le récepteur d’ondes gère le minutage et remet au synthé une mémoire tampon à remplir lorsqu’il est prêt à recevoir une rafale de données. Le synthé remplit la mémoire tampon (un objet IDirectSoundBuffer par défaut) avec des données afin qu’elles puissent être transmises à DirectSound. DirectSound lit les données via le pilote système KMixer ou par le biais d’une broche de rendu à accélération matérielle DirectSound sur le périphérique audio, le cas échéant (voir Vue d’ensemble de l’accélération matérielle DirectSound).
Cette même architecture de base s’applique également aux implémentations en mode noyau, à l’exception du récepteur d’ondes qui remet la mémoire tampon de données directement au matériel ou au pilote système KMixer. Le pilote de port DMus implémente le récepteur d’ondes pour un synthétiseur logiciel en mode noyau. Pour plus d’informations, consultez A Wave Sink for Kernel-Mode Software Synthétiseurs.
Une fois ces étapes terminées, le port DirectMusic en mode utilisateur doit être ouvert et activé pour une utilisation. Dès que cette grande partie du code du pilote fonctionne, vous pouvez commencer à implémenter des fonctionnalités. Utilisez le code source du synthétiseur logiciel Microsoft en mode utilisateur en tant que modèle et commencez à ajouter la nouvelle fonctionnalité.
Un synthétiseur logiciel en mode utilisateur peut être implémenté en tant qu’objet avec une interface IDirectMusicSynth. Un récepteur d’ondes en mode utilisateur peut être implémenté en tant qu’objet avec une interface IDirectMusicSynthSink. Pour plus d’informations, consultez IDirectMusicSynth et IDirectMusicSynthSink.