3

ここで使用されているものと非常によく似ていますが、Raspberry Pi でバックグラウンド サービスとして実行します。

MIDI デバイスを切断して再接続し、引き続き読み取ることができるようにしたいと考えています。

私は2つのアプローチを試しました:

  1. pygame.midi.get_count() と info() を使用して定期的に MIDI デバイスを列挙します。
  2. この例のように、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)、誰かが正しい方向に向けてくれることを期待していました。

4

3 に答える 3

1

これについてはまだ完全にテストしていませんが、 を呼び出しquitてからもう一度 を呼び出すと、initMIDI デバイスの適切に更新されたリストを取得できると思います。次に例を示します。

import pygame, pygame.midi    
pygame.midi.init()    
print pygame.midi.get_count()    
a=raw_input('Connect or disconnect some MIDI devices')    
pygame.midi.quit()    
pygame.midi.init()
print pygame.midi.get_count()
于 2015-01-17T22:54:21.147 に答える