MIDI データ ブロックの管理
システム排他メッセージ ( midiOutLongMsg 関数と midiInAddBuffer 関数を使用) とストリーム バッファー ( midiStreamOut 関数を使用) を渡すデータ ブロックを使用するアプリケーションは、再生または記録が完了するまで、デバイス ドライバーにデータ ブロックを継続的に提供する必要があります。
1 つのデータ ブロックが使用されている場合でも、データ ブロックとヘッダー構造に関連付けられているメモリを解放できるように、デバイス ドライバーがデータ ブロックで終了したタイミングをアプリケーションで判断できる必要があります。 次の 3 つのメソッドを使用して、デバイス ドライバーがデータ ブロックでいつ終了するかを判断できます。
- データ ブロックが終了したときにドライバーによって送信されるメッセージを受信するコールバック関数を指定します。 タイムスタンプ付きの MIDI 入力データを取得するには、コールバック関数を使用する必要があります。
- イベント コールバックを使用します (出力専用)。
- ウィンドウまたはスレッド コールバックを使用して、ドライバーがデータ ブロックで完了したときに送信されたメッセージを受信します。
アプリケーションが必要なときにデバイス ドライバーにデータ ブロックを取得しない場合は、再生時に聞こえるギャップが発生したり、受信した記録された情報が失われたりする可能性があります。 少なくとも、アプリケーションでは、デバイス ドライバーの前に少なくとも 1 つのデータ ブロックを維持するために、ダブル バッファリング スキームを使用する必要があります。
コールバック関数を使用したドライバー メッセージの処理
独自のコールバック関数を記述して、デバイス ドライバーから送信されたメッセージを処理できます。 コールバック関数を使用するには、dwFlags パラメーターに CALLBACK_FUNCTION フラグを指定し、midiInOpen 関数または midiOutOpen 関数の dwCallback パラメーターでコールバック関数のアドレスを指定します。
コールバック関数に送信されるメッセージは、ウィンドウに送信されるメッセージと似ていますが、符号なし整数パラメーターと doubleword パラメーターの代わりに 2 つの doubleword パラメーターがあります。 これらのメッセージの詳細については、「 System-Exclusiveメッセージの送信 」および「 MIDI レコーディングの管理」を参照してください。
アプリケーションからコールバック関数にインスタンス データを渡すには、次のいずれかの手法を使用します。
- デバイス ドライバーを開く関数の dwCallbackInstance パラメーターを使用します。
- MIDI デバイス ドライバーに送信されるデータ ブロックを識別する MIDIHDR 構造体の dwUser メンバーを使用します。
32 ビットを超えるインスタンス データが必要な場合は、追加情報を含む構造体のアドレスを渡します。
イベント コールバックを使用したドライバー メッセージの処理
イベント コールバックを使用するには、 CreateEvent 関数を使用してイベントのハンドルを取得し、 midiOutOpen 関数の呼び出しでCALLBACK_EVENTを指定します。
イベント コールバックは、関数コールバックを引き起こす可能性のあるものによって設定されます。 コールバック関数やウィンドウコールバックやスレッドコールバックとは異なり、イベントコールバックは特定のクローズ通知、完了通知、またはオープン通知を受け取りません。 そのため、アプリケーションでは、イベントが発生した後に待機しているプロセスの状態をチェックする必要があります。
イベント コールバックの詳細については、「イベント コールバックを使用したバッファー再生の管理」を参照してください。
ウィンドウまたはスレッド コールバックを使用してドライバー メッセージを処理する
ウィンドウ コールバックを使用するには、dwFlags パラメーターに CALLBACK_WINDOW フラグを指定し、midiInOpen 関数または midiOutOpen 関数の dwCallback パラメーターの下位ワードでウィンドウ ハンドルを指定します。 ドライバー メッセージは、 dwCallback のハンドルによって識別されるウィンドウのウィンドウ プロシージャ関数に送信されます。
同様に、スレッド コールバックを使用するには、 midiInOpen または midiOutOpen の呼び出しで、CALLBACK_THREAD フラグとスレッド識別子を指定します。 この場合、メッセージはウィンドウではなく、指定したスレッドに投稿されます。
ウィンドウまたはスレッドコールバックに送信されるメッセージは、使用される MIDI デバイスに固有です。 これらのメッセージの詳細については、「 System-Exclusiveメッセージの送信 」および「 MIDI レコーディングの管理」を参照してください。
関連トピック