Bug #44
(V5.86)Timidity++で演奏させた後、MIDIマッパーに切り替えて演奏させると落ちる
ステータス: | 終了 | 開始日: | 2011/02/01 | |
---|---|---|---|---|
優先度: | 通常 | 期日: | 2011/02/04 | |
担当者: | - | 進捗 %: | 100% | |
カテゴリ: | - | 作業時間の記録: | - | |
対象バージョン: | - |
説明
状況(2011.02.04)¶
V5.87にて対処済み。
(原因)
エクスクルーシブ・メッセージを送信した後、MIDI音源がその処理を完了したタイミングで、 アプリケーション側が用意したバッファを解除する必要があるが、 従来のMuseはその解除タイミングを得るために音源側から発信されるコールバックを活用していた。 Timidity++以外のドライバは、音源処理完了時点でこのコールバックを アプリケーション側に投げてくれたため、正常な解除処理が行われていた。 しかし、Timidity++ドライバでは何故かそのメッセージを投げてくれないため、 前回のバッファが解除されていない状況で、 次に続くエクスクルーシブ・メッセージを処理する状況となり、 システム上の不整合が生じてハングアップに至る。
(対処)
エクスクルーシブ・メッセージを音源に送信した後、 バッファのデータヘッダー要素である状態フラグの監視ループに入り、 その値が完了になった時点でループを抜け出すというシーケンスに改めた。 一種のポーリングではあるが、この方式はコールバックに依存しないため 確実なバッファの解除が実施できると判断した。 また、MIDI音源オープン時にコールバックの定義をする必要が無くなり、 イベントに関する処理負荷も低減させることができたと推測している。
※なお、本件とは直接関わりは無いが、V5.87のバージョンアップにおいて、 Readme.txtの改訂も実施した。 具体的には、利用頻度の高いものを極力早めに解説するという方針の基に “第2章 Museコーディングの手引き”における節立てを組み直した。
概要(2011.02.01)¶
(1)Timidity++をインストールし、Museのメニューの「音源(V)」に Timidity++ Driverが追加された状態にしておく。
(2)Museで“Timidity++ Driver”を音源として選択し、任意データを数秒演奏させる。
(3)音源メニューから“Microsoft MIDIマッパー”に切り替える。
(4)この状態で再び演奏を開始しようとすると、Museがフリーズ状態になった後、 しばらくして落ちる。
関連するチケット