IDirectMusicSynth et IDirectMusicSynthSink
Comme décrit dans Synthétiseurs et récepteurs d’ondes, vous pouvez implémenter un synthétiseur logiciel personnalisé ou un récepteur de vagues qui s’exécute en mode utilisateur et communique avec DirectMusic. L’objet synthétiseur doit avoir une interface IDirectMusicSynth. L’objet récepteur d’ondes doit avoir une interface IDirectMusicSynthSink.
DirectMusic communique avec un synthétiseur logiciel via son interface IDirectMusicSynth . DirectMusic prend en charge cette interface dans DirectX 6.1 et versions ultérieures. IDirectMusicSynth prend en charge les méthodes indiquées dans le tableau suivant, qui organise les méthodes en groupes fonctionnels.
Groupe | Noms de méthodes |
---|---|
Activation | IDirectMusicSynth ::Activate |
Canaux | IDirectMusicSynth ::GetChannelPriority, IDirectMusicSynth ::SetChannelPriority |
Instruments | IDirectMusicSynth ::D ownload, IDirectMusicSynth ::Unload |
Information | IDirectMusicSynth ::GetAppend, IDirectMusicSynth ::GetFormat, IDirectMusicSynth ::GetLatencyClock, IDirectMusicSynth ::GetPortCaps , IDirectMusicSynth ::GetRunningStats |
Lecture | IDirectMusicSynth ::P layBuffer, IDirectMusicSynth ::Render |
Ports | IDirectMusicSynth ::Open, IDirectMusicSynth ::Close, IDirectMusicSynth ::SetNumChannelGroups |
Paramètres divers | IDirectMusicSynth::SetMasterClock, IDirectMusicSynth::SetSynthSink |
La plupart des applications n’ont pas besoin d’appeler directement les méthodes de l’interface IDirectMusicSynth ; le port DirectMusic gère généralement le synthétiseur. Toutefois, votre application peut s’interfacer directement au synthétiseur pendant le développement et le test.
Le synthétiseur n’est pas complet sans connexion à un récepteur d’ondes, qui est représenté sous la forme d’un objet avec une interface IDirectMusicSynthSink . Le récepteur d’ondes connecte le flux de sortie audio du synthétiseur à un module de rendu audio tel que DirectSound, DirectShow ou l’API WaveOut multimédia Windows.
Par défaut, DirectMusic utilise son implémentation IDirectMusicSynthSink interne pour gérer les données d’onde générées par le synthétiseur logiciel. Ce récepteur d’ondes alimente les données vers DirectSound.
Avant d’activer le synthétiseur, un récepteur d’ondes doit d’abord être créé et connecté au synthétiseur via un appel à IDirectMusicSynth ::SetSynthSink. Il doit s’agir du tout premier appel après la création du synthétiseur, car la plupart des appels liés au minutage, y compris IDirectMusicSynth ::GetLatencyClock et IDirectMusicSynth ::SetMasterClock, sont en fait passés à des appels équivalents sur IDirectMusicSynthSink.
Seuls DirectX 6.1 et DirectX 7 prennent en charge l’implémentation d’un récepteur d’ondes en mode utilisateur personnalisé avec une interface IDirectMusicSynthSink . IDirectMusicSynthSink prend en charge les méthodes indiquées dans le tableau suivant, qui organise les méthodes en groupes fonctionnels.
Groupe | Noms de méthodes |
---|---|
Initialisation | IDirectMusicSynthSink::Activate, IDirectMusicSynthSink::GetDesiredBufferSize |
IDirectMusicSynthSink::Init, IDirectMusicSynthSink::SetDirectSound | |
Minutage | IDirectMusicSynthSink ::GetLatencyClock, IDirectMusicSynthSink ::RefTimeToSample |
IDirectMusicSynthSink::SampleToRefTime, IDirectMusicSynthSink::SetMasterClock |
Dans DirectX 8 et versions ultérieures, DirectMusic utilise toujours son récepteur d’ondes interne avec un synthétiseur en mode utilisateur. Ces versions ultérieures de DirectMusic ne prennent pas en charge les implémentations personnalisées d’IDirectMusicSynthSink.
Dans DirectX 6.1 et DirectX 7, toutefois, vous êtes libre d’implémenter votre propre objet IDirectMusicSynthSink et de l’utiliser pour gérer le flux de sortie audio du synthétiseur comme vous le souhaitez. Par exemple, vous pouvez alimenter les données de vague dans DirectShow ou l’API waveOut . Si vous créez un objet de flux d’ondes, il doit disposer d’une interface IDirectMusicSynthSink pour se connecter à l’objet IDirectMusicSynth .
En plus de gérer le flux d’ondes, le récepteur d’ondes est responsable du contrôle du minutage du synthétiseur. Le récepteur d’ondes reçoit l’horloge master par un appel à IDirectMusicSynth ::SetMasterClock, qui transmet l’master source d’heure avec un appel identique à IDirectMusicSynthSink ::SetMasterClock. Étant donné que l’horloge master n’est pas générée à partir du même cristal que le flux d’ondes, le récepteur de vagues doit les maintenir synchronisées en compensant la dérive d’horloge.
En outre, afin que le synthétiseur puisse suivre l’heure de manière appropriée, il fournit deux appels à convertir de master heure d’horloge en exemple d’heure et d’arrière :
IDirectMusicSynthSink ::RefTimeToSample
IDirectMusicSynthsink ::SampleToRefTime
Le récepteur d’ondes génère l’horloge de latence, car il gère en fait les heures auxquelles les exemples sont écrits par des appels à IDirectMusicSynth ::Render. Lorsque DirectMusic appelle IDirectMusicSynth ::GetLatencyClock sur le port DirectMusic, il se retourne simplement et appelle IDirectMusicSynthSink ::GetLatencyClock.
Lorsqu’un synthétiseur logiciel est ouvert pour la première fois, DirectMusic donne au synthétiseur une structure DMUS_PORTPARAMS (décrite dans la documentation Microsoft Windows SDK) qui spécifie le taux d’échantillonnage et le nombre de canaux pour le flux de sortie audio. Le synthétiseur les convertit ensuite en une structure WAVEFORMATEX standard qu’il transmet au récepteur d’ondes lorsque le récepteur d’onde appelle la méthode IDirectMusicSynth ::GetFormat .
Pour plus d’informations, consultez les descriptions des interfaces IDirectMusic et IDirectMusicPort dans la documentation du Kit de développement logiciel (SDK) Windows.