У меня есть программа, которая записывает звук с устройства FireWire (FA-66) с разъемом Jack. Интерфейс создается с помощью pygtk, а запись - с помощью py-jack (http://sourceforge.net/projects/py-jack/).. Запись выполняется в другом потоке, поскольку графический интерфейс пользователя должен использоваться одновременно для просмотра результатов аудио.
Проблема в том, что когда я запускаю поток записи, графический интерфейс очень медленно реагирует. У меня есть функция gtk.gdk start_threads () в начале основного потока. Если я правильно понял, мне не нужны threads_enter () и threads_leave (), потому что запись не влияет на GUI. Пожалуйста, исправьте, если я ошибаюсь.
Функция jack.process () записывает звук с трех микрофонов. Если я заменю его, например, на time.sleep (2), все будет нормально.
Каков наилучший способ создания потоков в этом случае? Почему jack.process зависает в графическом интерфейсе? Это займет все время процессора или что-то?
Образцы моего кода ниже:
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)