ジャック接続のFirewireデバイス(FA-66)からのオーディオを録音するプログラムがあります。インターフェイスはpygtkで作成され、録音はpy-jack(http://sourceforge.net/projects/py-jack/)で作成されます。オーディオの結果を表示するにはGUIを同時に使用する必要があるため、録音は別のスレッドで行われます。
問題は、レコーディングスレッドを開始すると、GUIの応答が非常に遅くなることです。メインスレッドの先頭にgtk.gdk関数start_threads()があります。正しく理解していれば、記録はGUIに影響を与えないため、threads_enter()とthreads_leave()は必要ありません。私が間違っている場合は訂正してください。
関数jack.process()は、3つのマイクからの音声を録音します。たとえば、time.sleep(2)に置き換えると、すべて問題なく動作します。
この場合、スレッドを作成するための最良の方法は何ですか?jack.processがGUIをフリーズするのはなぜですか?すべてのCPU時間か何かがかかりますか?以下の私のコードのサンプル:
soundrecorder.py:
...
def start(self):
Thread(target=self._start).start()
def _start(self):
while self.eventhandler.record.isSet():
data = self._jackRecord(self.sample_length)
self.datahandler.queue.put(data)
def _jackRecord(self, length):
capture = Numeric.zeros((self.inputs, int(self.sample_rate * length)), 'f')
output = Numeric.zeros((self.inputs, self.buffer_size), 'f')
i = 0
while i < capture.shape[1] - self.buffer_size:
try:
jack.process(output, capture[:,i:i+self.buffer_size])
i += self.buffer_size
except:
pass
return capture
eventhandler.py:recordStart()およびrecordStop()は、開始ボタンと停止ボタンが押されたときに呼び出される単なるコールバック関数です。
...
def recordStart(self, widget, data=None):
if not self.record.isSet():
self.record.set()
self.soundrecorder = SoundRecorder(self, self.datahandler)
self.soundrecorder.connect()
self.soundrecorder.start()
def recordStop(self, widget, data=None):
if self.record.isSet():
self.record.clear()
del(self.soundrecorder)