使用數據區塊傳遞系統專屬訊息的應用程式(使用 midiOutLongMsg 和 midiInAddBuffer 函式)和串流緩衝區(使用 midiStreamOut 函式)必須持續提供設備驅動器的數據區塊,直到播放或錄製完成為止。
即使使用單一數據區塊,應用程式也必須能夠判斷設備驅動器何時完成數據區塊,以便釋放與數據區塊和標頭結構相關聯的記憶體。 您可以使用三種方法來判斷裝置驅動器何時完成資料區塊:
- 指定回呼函式,以在驅動程式完成數據區塊時接收訊息。 若要取得時間戳 MIDI 輸入資料,您必須使用回呼函式。
- 使用事件回呼 (僅適用於輸出)。
- 使用視窗或線程回呼,在驅動程式完成數據區塊時接收訊息。
如果應用程式在需要時未將數據區塊傳送到設備驅動程式,則可能會發生聲音中斷或丟失傳入的錄音資訊。 應用程式至少應該使用雙緩衝配置,在設備驅動器前面保留至少一個數據區塊。
使用回調函式來處理驅動程式訊息
您可以撰寫自己的回呼函式來處理設備驅動器所傳送的訊息。 若要使用回呼函式,請在 dwFlags 參數中指定 CALLBACK_FUNCTION 旗標,並在 midiInOpen 或 midiOutOpen 函式的 dwCallback 參數中指定回呼函式的位址。
傳送至回呼函式的訊息類似於傳送至視窗的訊息,不同之處在於訊息有兩個雙字參數,而不是不帶正負號的整數參數和 doubleword 參數。 如需這些訊息的詳細資訊,請參閱 傳送 System-Exclusive 訊息 和 管理 MIDI 錄製。
使用下列其中一種技術,將實例資料從應用程式傳遞至回呼函式:
- 開啟設備驅動器的函式中使用 dwCallbackInstance 參數。
- 使用 dwUserMIDIHDR 結構的成員,識別要傳送至 MIDI 裝置驅動程式的數據區塊。
如果您需要超過 32 位的實例數據,請傳遞包含其他資訊的 結構位址。
使用事件回呼來處理驅動程式訊息
若要使用事件回呼,請使用 CreateEvent 函式來取得事件的句柄,並在呼叫 midiOutOpen 函式時指定 CALLBACK_EVENT。
事件回呼是由可能導致函式回呼的任何項目所設定。 不同於回呼函式和視窗或線程回呼,事件回呼不會收到特定的關閉、完成或開啟通知。 因此,應用程式可能必須檢查在事件發生后正在等候的進程狀態。
如需事件回呼的詳細資訊,請參閱 使用事件回呼來管理緩衝播放。
使用視窗或線程回呼來處理驅動程式訊息
若要使用視窗回呼,請在 dwFlags 參數中指定 CALLBACK_WINDOW 標誌,並在 midiInOpen 或 midiOutOpen 函式的 dwCallback 參數的低序字中指定視窗句柄。 驅動程式訊息將會傳送至由句柄識別的視窗的視窗程序函數,句柄位於 dwCallback。
同樣地,若要使用線程回呼,請在呼叫midiInOpen 或 midiOutOpen中指定 CALLBACK_THREAD 旗標和線程標識符。 在此情況下,訊息會張貼至指定的線程,而不是張貼到視窗。
傳送至視窗或線程回呼的訊息專屬於使用的MIDI裝置。 如需這些訊息的詳細資訊,請參閱 傳送 System-Exclusive 訊息 和 管理 MIDI 錄製。
相關主題