Eine Wellensenke für Kernel-Mode Softwaresynthesizer
Wie in Synthesizern und Wellensenken erläutert, implementiert der DMus-Porttreiber die Wellensenke für einen Softwaresynthesizer, der im Kernelmodus arbeitet. Der Miniporttreiber für den Synthesizer macht eine ISynthSinkDMus-Schnittstelle für den Porttreiber verfügbar. Die Wellensenke des Porttreibers verwendet diese Schnittstelle, um die vom Synthesizer erzeugten Wellendaten zu lesen.
Um die Wellensenke des DMus-Porttreibers zu nutzen, sollte ein DMus-Miniporttreiber einen DirectMusic-Filter mit zwei Pintypen definieren:
Ein DirectMusic-Eingabenadel oder MIDI-Eingabestift. Dieser Pin ist eine Senke für einen Renderstream, der MIDI-Nachrichten enthält.
Ein Wellenausgangspin. Dieser Pin ist eine Quelle für einen Renderstream, der PCM-Beispiele enthält.
Die folgende Abbildung zeigt einen DirectMusic-Filter, der einen Synthesizerknoten (KSNODETYPE_SYNTHESIZER) enthält. Dieser Filter erfüllt die vorherigen Anforderungen für einen Kernelmodus-Softwaresynthesizer, indem er einen DirectMusic-Eingabestift und einen Wave-Ausgabestift bereitstellt. (Darüber hinaus kann ein DMus-Miniporttreiber, der legacy MIDI-Synthese unterstützt, einen MIDI-Eingabestift bereitstellen.)
Auf der linken Seite der Figur gelangt ein MIDI-Stream über den DirectMusic-Eingabenadel in den Filter. Dieser Pin verfügt über eine IMXF-Schnittstelle , die für den Porttreiber verfügbar gemacht wird. Der Porttreiber ruft diese Schnittstelle durch Aufrufen der IMiniportDMus::NewStream-Methode ab. Der Porttreiber überspeist MIDI-Nachrichten an den Pin, indem er die IMXF::P utMessage-Methode aufruft .
Auf der rechten Seite der Abbildung verlässt ein Wellenstrom den Filter durch den Wellenausgangspin und fließt zur Wellensenke des Porttreibers. Der Porttreiber kommuniziert mit dem Pin über seine ISynthSinkDMus-Schnittstelle . Der Porttreiber ruft diese Schnittstelle ab, indem er zuerst IMiniportDMus::NewStream aufruft, um ein Streamobjekt mit einer IMXF-Schnittstelle abzurufen, und dann das Objekt nach seiner ISynthSinkDMus-Schnittstelle abfragt . Die Wellensenke ruft Wellendaten vom Pin ab, indem sie die ISynthSinkDMus::Render-Methode aufruft.
Obwohl sich ein Hardwaresynthesizer im Prinzip auf die Wellensenke des Porttreibers für das Rendern verlassen könnte, fügt der Aufruf von ISynthSinkDMus::Render dem MIDI-Stream genügend Latenz hinzu, um ihn für viele interaktive Anwendungen unattraktiv zu machen. Um die Streamlatenz zu verringern, verfügen Hardwaresynthesizer wahrscheinlich über interne Verbindungen mit Misch- und Wellenrenderinghardware, anstatt die Wellensenke des Porttreibers zu verwenden. Diese Art von Synthesizer ersetzt den Wellenausgangspin auf der rechten Seite der vorherigen Abbildung durch eine festverdrahtete Verbindung (dargestellt als Bridge-Pin) an einen Hardwaremischer.
Die ISynthSinkDMus-Schnittstelle bietet Methoden zum Rendern von Wellendaten über eine Wellensenke, zum Konvertieren von Der Referenzzeit in die Samplezeit und zurück und zum Synchronisieren mit der master Uhr:
ISynthSinkDMus::RefTimeToSample
ISynthSinkDMus::SampleToRefTime
ISynthSinkDMus erbt von der IMXF-Schnittstelle . Weitere Informationen finden Sie unter ISynthSinkDMus.
Der DMus-Miniporttreiber in der vorherigen Abbildung identifiziert den DirectMusic-Eingabestift und den Wellenausgangspin wie folgt:
Um den DirectMusic-Eingabenadel zu identifizieren, definiert der Miniporttreiber den Datenbereich der Pin so, dass er ein Hauptformat vom Typ KSDATAFORMAT_TYPE_MUSIC und ein Unterformat vom Typ KSDATAFORMAT_SUBTYPE_DIRECTMUSIC hat. Diese Kombination gibt an, dass der Pin einen zeitstempelten MIDI-Stream akzeptiert. Die Datenbereichsdeskriptor ist eine Struktur vom Typ KSDATARANGE_MUSIC. (Ein Beispiel finden Sie unter DirectMusic Stream Data Range.) Der Miniporttreiber definiert die Datenflussrichtung des Pins, die KSPIN_DATAFLOW_IN werden soll. (Der PCPIN_DESCRIPTORKsPinDescriptor der Struktur. DataFlow-Member gibt die Datenflussrichtung an.) Wenn Sie IMiniportDMus::NewStream aufrufen, um das Streamobjekt für diesen Pin zu erstellen, legt der Porttreiber den StreamType-Parameter auf DMUS_STREAM_MIDI_RENDER fest.
Um den Wellenausgangspin zu identifizieren, definiert der Miniporttreiber den Datenbereich des Pins, um ein Hauptformat vom Typ KSDATAFORMAT_TYPE_AUDIO und ein Unterformat vom Typ KSDATAFORMAT_SUBTYPE_PCM zu haben. Diese Kombination gibt an, dass der Pin einen Wellenaudiostream ausgibt, der PCM-Beispiele enthält. Der Datenbereichsdeskriptor ist eine Struktur vom Typ KSDATARANGE_AUDIO. (Sehen Sie sich das Beispiel im PCM-Streamdatenbereich an.) Der Miniporttreiber definiert die Datenflussrichtung des Pins, die KSPIN_DATAFLOW_OUT werden soll. Beim Aufrufen von IMiniportDMus::NewStream zum Erstellen des Streamobjekts für diesen Pin legt der Porttreiber den StreamType-Parameter auf DMUS_STREAM_WAVE_SINK fest.
Wenn der Treiber außerdem einen MIDI-Eingabepin für den Synthesizer unterstützen würde, wäre seine Definition ähnlich der des DirectMusic-Eingabepins, aber die Pindefinition würde ein Unterformat vom Typ KSDATAFORMAT_SUBTYPE_MIDI angeben, und der Pin akzeptiert einen unformatierten MIDI-Stream anstelle eines zeitstempelten MIDI-Streams.