Musiktechnologie-GUIDs
Ein MIDI- oder DMus-Miniporttreiber muss den Bereich der Streamformate angeben, den jeder seiner Pins verarbeiten kann. Wie in Pin Factories beschrieben, gibt der Treiber diese Informationen als Array aus mindestens einem Datenbereichsdeskriptor an, von denen jede eine Struktur vom Typ KSDATARANGE_MUSIC ist. Das Technology-Element dieser Struktur gibt an, welche Art von Synthesizertechnologie das MIDI- oder DirectMusic-Gerät verwendet. Ein Miniporttreiber kann das Element Technology auf einen der GUID-Werte in der folgenden Tabelle (linke Spalte) festlegen.
KSDATARANGE_MUSIC Technology GUID | MIDIOUTCAPS wTechnology Value | Bedeutung |
---|---|---|
KSMUSIC_TECHNOLOGY_PORT |
MOD_MIDIPORT |
Das Gerät ist ein MPU-401-Gerät. |
KSMUSIC_TECHNOLOGY_SYNTH |
MOD_SYNTH |
Das Gerät ist ein Synthesizer. |
KSMUSIC_TECHNOLOGY_SQSYNTH |
MOD_SQSYNTH |
Das Gerät ist ein Quadratwellensynthesizer. |
KSMUSIC_TECHNOLOGY_FMSYNTH |
MOD_FMSYNTH |
Das Gerät ist ein FM-Synthesizer. |
KSMUSIC_TECHNOLOGY_MAPPER |
MOD_MAPPER |
Das Gerät ist der Microsoft MIDI-Mapper. |
KSMUSIC_TECHNOLOGY_WAVETABLE |
MOD_WAVETABLE |
Das Gerät ist ein Hardware-Wavetable-Synthesizer. |
KSMUSIC_TECHNOLOGY_SWSYNTH |
MOD_SWSYNTH |
Das Gerät ist ein Softwaresynthesizer. |
Die midiOutGetDevCaps-Funktion übersetzt die technologie-GUID, die sie vom Treiber empfängt, in einen Index, den sie in das wTechnology-Element der MIDIOUTCAPS-Struktur schreibt, das sie an den Aufrufer ausgibt. In der obigen Tabelle wird der wTechnology-Wert (mittlere Spalte) angezeigt, der den einzelnen Technologie-GUID entspricht. Weitere Informationen zu midiOutGetDevCaps und MIDIOUTCAPS finden Sie in der Microsoft Windows SDK-Dokumentation.
Beim Aufzählen von Geräten kann eine MIDI-Anwendung, die die Windows-Multimedia-API midiOut oder midiIn verwendet, MIDI-Pins sehen, aber keine DirectMusic-Pins. Eine DirectMusic-Anwendung kann sowohl MIDI- als auch DirectMusic-Pins anzeigen. Ein MIDI- oder DMus-Miniporttreiber identifiziert einen MIDI-Pin, indem er den Untertyp GUID in den Datenbereichen des Pins auf KSDATAFORMAT_SUBTYPE_MIDI festlegt. Ein DMus-Miniporttreiber identifiziert einen DirectMusic-Pin, indem er die Untertyp-GUID auf KSDATAFORMAT_SUBTYPE_DIRECTMUSIC festlegt. Beispiele für Datenbereiche für MIDI- und DirectMusic-Pins finden Sie unter MIDI Stream Data Range und DirectMusic Stream Data Range.
Wie in MIDI- und DirectMusic-Filtern erläutert, ruft ein Adaptertreiber die PcNewMiniport-Funktion auf, um eine instance eines der vom System bereitgestellten Miniporttreiber in Portcls.sys zu erstellen. Der Aufrufer gibt eine der Treiber-GUIDs in der folgenden Tabelle an, um anzugeben, welcher Miniporttreiber instanziieren soll.
Treiber-GUID | Technologie-GUID |
---|---|
CLSID_MiniportDriverDMusUART |
KSMUSIC_TECHNOLOGY_PORT |
CLSID_MiniportDriverDMusUARTCapture |
KSMUSIC_TECHNOLOGY_PORT |
CLSID_MiniportDriverFmSynth |
KSMUSIC_TECHNOLOGY_FMSYNTH |
CLSID_MiniportDriverFmSynthWithVol |
KSMUSIC_TECHNOLOGY_FMSYNTH |
CLSID_MiniportDriverUart |
KSMUSIC_TECHNOLOGY_PORT |
Die rechte Spalte der vorherigen Tabelle gibt die Technologie-GUID an, die der entsprechende Miniporttreiber in den Datenbereichen seiner Pins angibt. Beispielsweise weist der FmSynth-Miniporttreiber den Pins die Technologie-GUID KSMUSIC_TECHNOLOGY_FMSYNTH zu.
Einige wavetable Synthesizer-Geräte stellen sich anwendungen als MPU-401-Geräte (mit Technologie-GUID KSMUSIC_TECHNOLOGY_PORT) zur Verfügung. Wenn kein externer Synthesizer vorhanden ist, können sie einen rohen MIDI-Bytestrom über den Wavetable-Synthesizer wiedergeben.
Die midiOut-API bevorzugt jedoch wavefähige Synthesizergeräte (mit Technologie-GUID KSMUSIC_TECHNOLOGY_WAVETABLE), wenn sie das (bevorzugte) STANDARD-MIDI-Wiedergabegerät auswählen. Es wird explizit vermieden, dass ein MPU-401-Gerät als Standardgerät ausgewählt wird.
Um sich als Standardgerät zu qualifizieren, sollte sich ein wavetable-Gerät, das unformatiertes MIDI wiedergeben kann, als wavetable-Gerät und nicht als MPU-401-Gerät verfügbar machen. Wenn ein Adaptertreiber jedoch den vom System bereitgestellten MPU-401-Miniporttreiber DMusUART verwendet, um sein wavetable Synthesizer-Gerät zu verwalten, weist dieser Miniporttreiber den Pins statisch die Technologie-GUID KSMUSIC_TECHNOLOGY_PORT zu.
Durch Aufrufen der IMusicTechnology::SetTechnology-Methode kann ein Adaptertreiber die Technologie-GUIDs in den Datenbereichen eines Miniporttreibers überschreiben. Im folgenden Codebeispiel ändert ein Adaptertreiber die Technologie-GUID in den Daten des DMusUART-Miniporttreibers vom Standardwert KSMUSIC_TECHNOLOGY_PORT bis zum Wert KSMUSIC_TECHNOLOGY_WAVETABLE. Mit dieser neuen Einstellung kann das MPU-ähnliche Wavetable-Gerät von der midiOut-API als STANDARD-MIDI-Gerät ausgewählt werden.
// Create the miniport object.
PUNKNOWN miniport;
ntStatus = PcNewMiniport((PMINIPORT*)&miniport, CLSID_MiniportDriverDMusUART);
// Query the miniport driver for the IMusicTechnology interface.
IMusicTechnology* pMusicTechnology;
if (NT_SUCCESS(ntStatus))
{
ntStatus = miniport->QueryInterface(IID_IMusicTechnology, (PVOID*)&pMusicTechnology);
}
// Set the Technology members in the DirectMusic data-range entries
// for all the pins that are exposed by this miniport.
// SetTechnology should be called before initializing the miniport.
if (NT_SUCCESS(ntStatus))
{
ntStatus = pMusicTechnology->SetTechnology(&KSMUSIC_TECHNOLOGY_WAVETABLE);
}
Wie im Kommentar im vorherigen Codebeispiel angegeben, sollte der Adaptertreiber SetTechnology aufrufen, bevor die Methode des Porttreibers Init
aufgerufen wird (die wiederum die Methode des Miniporttreibers Init
aufruft). Die vom System bereitgestellten DMusUART- und UART-Miniporttreiber unterstützen beide die IMusicTechnology-Schnittstelle . Für andere Miniporttreiber ist die Unterstützung für IMusicTechnology optional. Weitere Informationen finden Sie in der Implementierung der SetTechnology-Methode im DMusUART-Beispiel-Audiotreiber im Microsoft Windows Driver Kit (WDK).