IDirectMusicSynth und IDirectMusicSynthSink
Wie unter Synthesizer und Wellensenken beschrieben, können Sie einen benutzerdefinierten Softwaresynthesizer oder eine Wellensenke implementieren, die im Benutzermodus ausgeführt wird und mit DirectMusic kommuniziert. Das Synthesizerobjekt muss über eine IDirectMusicSynth-Schnittstelle verfügen. Das Wellensenkenobjekt muss über eine IDirectMusicSynthSink-Schnittstelle verfügen.
DirectMusic kommuniziert mit einem Softwaresynthesizer über die IDirectMusicSynth-Schnittstelle . DirectMusic unterstützt diese Schnittstelle in DirectX 6.1 und höher. IDirectMusicSynth unterstützt die In der folgenden Tabelle gezeigten Methoden, die die Methoden in Funktionsgruppen organisieren.
Group | Methodennamen |
---|---|
Aktivierung | IDirectMusicSynth::Activate |
Channels | IDirectMusicSynth::GetChannelPriority, IDirectMusicSynth::SetChannelPriority |
Instrumente | IDirectMusicSynth::D ownload, IDirectMusicSynth::Unload |
Information | IDirectMusicSynth::GetAppend, IDirectMusicSynth::GetFormat, IDirectMusicSynth::GetLatencyClock, IDirectMusicSynth::GetPortCaps , IDirectMusicSynth::GetRunningStats |
Wiedergabe | IDirectMusicSynth::P layBuffer, IDirectMusicSynth::Render |
Ports | IDirectMusicSynth::Open, IDirectMusicSynth::Close, IDirectMusicSynth::SetNumChannelGroups |
Sonstige Parameter | IDirectMusicSynth::SetMasterClock, IDirectMusicSynth::SetSynthSink |
Die meisten Anwendungen müssen die Methoden in der IDirectMusicSynth-Schnittstelle nicht direkt aufrufen. Der DirectMusic-Port verwaltet in der Regel den Synthesizer. Ihre Anwendung kann jedoch während der Entwicklung und beim Testen direkt mit dem Synthesizer in Verbindung treten.
Der Synthesizer ist nicht vollständig ohne eine Verbindung mit einer Wellensenke, die als Objekt mit einer IDirectMusicSynthSink-Schnittstelle dargestellt wird. Die Wellensenke verbindet den Audioausgabestream des Synthesizers mit einem Audiorenderingmodul wie DirectSound, DirectShow oder der Windows Multimedia waveOut-API .
Standardmäßig verwendet DirectMusic seine interne IDirectMusicSynthSink-Implementierung , um die Vom Softwaresynthesizer generierten Wellendaten zu verarbeiten. Diese Wellensenke leitet die Daten an DirectSound weiter.
Bevor der Synthesizer aktiviert werden kann, muss zunächst eine Wellensenke erstellt und über einen Aufruf von IDirectMusicSynth::SetSynthSink mit dem Synthesizer verbunden werden. Dies sollte der erste Aufruf nach dem Erstellen des Synthesizers sein, da viele der timingbezogenen Aufrufe, einschließlich IDirectMusicSynth::GetLatencyClock und IDirectMusicSynth::SetMasterClock, tatsächlich an entsprechende Aufrufe von IDirectMusicSynthSink übergeben werden.
Nur DirectX 6.1 und DirectX 7 unterstützen die Implementierung einer benutzerdefinierten Benutzermodus-Wellensenke mit einer IDirectMusicSynthSink-Schnittstelle . IDirectMusicSynthSink unterstützt die In der folgenden Tabelle gezeigten Methoden, die die Methoden in Funktionsgruppen organisieren.
Group | Methodennamen |
---|---|
Initialisierung | IDirectMusicSynthSink::Activate, IDirectMusicSynthSink::GetDesiredBufferSize |
IDirectMusicSynthSink::Init, IDirectMusicSynthSink::SetDirectSound | |
Zeitliche Steuerung | IDirectMusicSynthSink::GetLatencyClock, IDirectMusicSynthSink::RefTimeToSample |
IDirectMusicSynthSink::SampleToRefTime, IDirectMusicSynthSink::SetMasterClock |
In DirectX 8 und höher verwendet DirectMusic immer die interne Wellensenke mit einem Synthesizer im Benutzermodus. Diese späteren Versionen von DirectMusic unterstützen keine benutzerdefinierten Implementierungen von IDirectMusicSynthSink.
In DirectX 6.1 und DirectX 7 können Sie jedoch Ihr eigenes IDirectMusicSynthSink-Objekt implementieren und es verwenden, um den Audioausgabestream des Synthesizers in beliebiger Weise zu verwalten. Beispielsweise können Sie die Wellendaten in DirectShow oder die waveOut-API einspeisen. Wenn Sie ein Wavestreamobjekt erstellen, muss es über eine IDirectMusicSynthSink-Schnittstelle verfügen, um sich an das IDirectMusicSynth-Objekt anzuschließen.
Neben der Verwaltung des Wellenstroms ist die Wellensenke für die Steuerung des Timings für den Synthesizer verantwortlich. Die Wellensenke empfängt die master Uhr durch einen Aufruf von IDirectMusicSynth::SetMasterClock, der die master Zeitquelle mit einem identischen Aufruf von IDirectMusicSynthSink::SetMasterClock übergibt. Da die master Uhr nicht aus demselben Kristall wie der Wellenstrom generiert wird, muss die Wellensenke sie synchron halten, indem sie für die Uhrdrift kompensiert wird.
Damit der Synthesizer die Zeit entsprechend nachverfolgen kann, stellt er außerdem zwei Aufrufe bereit, um von master Uhrzeit in Samplezeit und zurück zu konvertieren:
IDirectMusicSynthSink::RefTimeToSample
IDirectMusicSynthSink::SampleToRefTime
Die Wellensenke generiert die Latenzuhr, da sie tatsächlich die Zeiten verwaltet, zu denen Samples durch Aufrufe von IDirectMusicSynth::Render geschrieben werden. Wenn DirectMusic IDirectMusicSynth::GetLatencyClock am DirectMusic-Port aufruft, wird einfach umgedreht und IDirectMusicSynthSink::GetLatencyClock aufgerufen.
Wenn ein Softwaresynthesizer zum ersten Mal geöffnet wird, gibt DirectMusic dem Synthesizer eine DMUS_PORTPARAMS-Struktur (in der Microsoft Windows SDK Dokumentation beschrieben), die die Samplerate und die Anzahl der Kanäle für den Audioausgabestream angibt. Der Synthesizer konvertiert diese dann in eine WAVEFORMATEX-Standardstruktur , die an die Wellensenke übergeben wird, wenn die Wellensenke die IDirectMusicSynth::GetFormat-Methode aufruft.
Weitere Informationen finden Sie in den Beschreibungen der Schnittstellen IDirectMusic und IDirectMusicPort in der Dokumentation zum Windows SDK.