Freigeben über


Verwalten von MIDI-Datenblöcken

Anwendungen, die Datenblöcke zum Übergeben von systemspezifischen Nachrichten (mit den Funktionen midiOutLongMsg und midiInAddBuffer ) und Streampuffern (mit der MidiStreamOut-Funktion ) verwenden, müssen den Gerätetreiber kontinuierlich mit Datenblöcken versorgen, bis die Wiedergabe oder Aufzeichnung abgeschlossen ist.

Selbst wenn ein einzelner Datenblock verwendet wird, muss eine Anwendung in der Lage sein zu bestimmen, wann ein Gerätetreiber mit dem Datenblock fertig ist, damit er den Speicher freigeben kann, der dem Datenblock und der Headerstruktur zugeordnet ist. Drei Methoden können verwendet werden, um zu bestimmen, wann ein Gerätetreiber mit einem Datenblock fertig ist:

  • Geben Sie eine Rückruffunktion an, um eine vom Treiber gesendete Nachricht zu empfangen, wenn sie mit einem Datenblock abgeschlossen ist. Um zeitstempelte MIDI-Eingabedaten abzurufen, müssen Sie eine Rückruffunktion verwenden.
  • Verwenden Sie einen Ereignisrückruf (nur für die Ausgabe).
  • Verwenden Sie einen Fenster- oder Threadrückruf, um eine vom Treiber gesendete Nachricht zu empfangen, wenn sie mit einem Datenblock abgeschlossen ist.

Wenn eine Anwendung bei Bedarf keinen Datenblock an den Gerätetreiber erhält, kann es zu einer hörbaren Lücke bei der Wiedergabe oder zu einem Verlust eingehender aufgezeichneter Informationen kommen. Eine Anwendung sollte mindestens ein Doppeltpufferungsschema verwenden, um mindestens einen Datenblock vor dem Gerätetreiber zu behalten.

Verwenden einer Rückruffunktion zum Verarbeiten von Treibermeldungen

Sie können Ihre eigene Rückruffunktion schreiben, um vom Gerätetreiber gesendete Nachrichten zu verarbeiten. Um eine Rückruffunktion zu verwenden, geben Sie das flag CALLBACK_FUNCTION im dwFlags-Parameter und die Adresse der Rückruffunktion im dwCallback-Parameter der funktion midiInOpen oder midiOutOpen an.

Nachrichten, die an eine Rückruffunktion gesendet werden, ähneln nachrichten, die an ein Fenster gesendet werden, mit der Ausnahme, dass sie zwei Doubleword-Parameter anstelle eines ganzzahligen Parameters ohne Vorzeichen und einen Doubleword-Parameter haben. Weitere Informationen zu diesen Nachrichten finden Sie unter Senden System-Exclusive Nachrichten und Verwalten der MIDI-Aufzeichnung.

Verwenden Sie eine der folgenden Techniken, um instance Daten aus einer Anwendung an eine Rückruffunktion zu übergeben:

  • Verwenden Sie den dwCallbackInstance-Parameter der Funktion, die den Gerätetreiber öffnet.
  • Verwenden Sie den dwUser-Member der MIDIHDR-Struktur , der einen Datenblock identifiziert, der an einen MIDI-Gerätetreiber gesendet wird.

Wenn Sie mehr als 32 Bits an instance Daten benötigen, übergeben Sie eine Adresse einer Struktur, die die zusätzlichen Informationen enthält.

Verwenden eines Ereignisrückrufs zum Verarbeiten von Treibermeldungen

Um einen Ereignisrückruf zu verwenden, verwenden Sie die CreateEvent-Funktion , um das Handle eines Ereignisses abzurufen und CALLBACK_EVENT im Aufruf der midiOutOpen-Funktion anzugeben.

Ein Ereignisrückruf wird durch alles festgelegt, was zu einem Funktionsrückruf führen kann. Im Gegensatz zu Rückruffunktionen und Fenster- oder Threadrückrufen erhalten Ereignisrückrufe keine spezifischen Benachrichtigungen zum Schließen, Abschließen oder Öffnen. Daher muss eine Anwendung möglicherweise die status des Prozesses überprüfen, auf den sie nach dem Ereignis wartet.

Weitere Informationen zu Ereignisrückrufen finden Sie unter Verwenden eines Ereignisrückrufs zum Verwalten der gepufferten Wiedergabe.

Verwenden eines Fenster- oder Threadrückrufs zum Verarbeiten von Treibermeldungen

Um einen Fensterrückruf zu verwenden, geben Sie das flag CALLBACK_WINDOW im dwFlags-Parameter und ein Fensterhandle im Wort mit niedriger Reihenfolge des dwCallback-Parameters der Funktion midiInOpen oder midiOutOpen an. Treibermeldungen werden an die Fensterprozedurfunktion für das Fenster gesendet, das durch das Handle in dwCallback identifiziert wird.

Wenn Sie einen Threadrückruf verwenden möchten, geben Sie das flag CALLBACK_THREAD und einen Threadbezeichner im Aufruf von midiInOpen oder midiOutOpen an. In diesem Fall werden Nachrichten an den angegebenen Thread und nicht an ein Fenster gesendet.

Nachrichten, die an einen Fenster- oder Threadrückruf gesendet werden, sind spezifisch für das verwendete MIDI-Gerät. Weitere Informationen zu diesen Nachrichten finden Sie unter Senden System-Exclusive Nachrichten und Verwalten der MIDI-Aufzeichnung.

MIDI-Dienste