ここで使用されているものと非常によく似ていますが、Raspberry Pi でバックグラウンド サービスとして実行します。
MIDI デバイスを切断して再接続し、引き続き読み取ることができるようにしたいと考えています。
私は2つのアプローチを試しました:
- pygame.midi.get_count() と info() を使用して定期的に MIDI デバイスを列挙します。
- この例のように、pyudev を使用して USB イベントを監視します。
(1) の問題は、デバイスがまだ接続されているかどうかに関係なく、pygame.midi が常に同じ値 (get_count と info の両方) を返すように見えることです。
(2) の問題は、イベント用に登録した非同期関数が呼び出されないことです (ただし、サブシステムを usb に変更するだけでスタンドアロンの例は正常に動作します)。これはスレッド化の問題である可能性があると考えたので、専用スレッドからのイベントを登録するためにすべてを呼び出し、glib.MainLoop.run() を実行してアイドル待機させましたが、pygame が midi デバイスを読み取ることができないことを発見しましたAMK クラスを実行する前にスレッドを開始した場合、何かを出力して返されたスレッドであっても。(Piレポのpyudevのバージョンが0.13であるため、glibを使用していますが、新しい方法はgobjectと同等だと思います)。
したがって、udevd を使用して接続イベントを検出し、/etc/udev/rules.d/ トリガーを介してサービスを再起動することに頼りました。 )。
したがって、デバッグにさらに多くの時間を費やす前に (2)、誰かが正しい方向に向けてくれることを期待していました。