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).