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