我有一个程序可以通过插孔连接从火线设备 (FA-66) 录制音频。界面是用 pygtk 创建的,录音是用 py-jack ( http://sourceforge.net/projects/py-jack/ )。录制是在不同的线程中完成的,因为必须同时使用 GUI 来查看音频的结果。
问题是当我启动录制线程时,GUI 响应变得非常缓慢。我在主线程的开头有 gtk.gdk 函数 start_threads() 。如果我做对了,我不需要threads_enter() 和threads_leave(),因为录制不会影响GUI。如果我错了,请纠正。
函数 jack.process() 记录来自三个麦克风的音频。例如,如果我用 time.sleep(2) 替换它,一切正常。
在这种情况下创建线程的最佳方法是什么?为什么 jack.process 会冻结 GUI?它需要所有的cpu时间还是什么?我的代码示例如下:
录音机.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)