Ich habe ein Programm, das Audio von Firewire-Gerät (FA-66) mit Jack-Verbindung aufzeichnet. Die Schnittstelle wird mit pygtk und der Aufnahme mit py-jack (http://sourceforge.net/projects/py-jack/) erstellt. Die Aufzeichnung erfolgt in einem anderen Thread, da die GUI gleichzeitig zum Anzeigen von Ergebnissen aus dem Audio verwendet werden muss.pygtk gui friert mit Pyjack Thread
Das Problem ist, dass die GUI sehr langsam reagiert, wenn ich den Aufnahme-Thread starte. Ich habe gtk.gdk Funktion start_threads() am Anfang des Hauptthreads. Wenn ich es richtig verstanden habe, brauche ich weder threads_enter() noch threads_leave(), da sich die Aufzeichnung nicht auf die GUI auswirkt. Bitte korrigieren Sie, wenn ich falsch liege.
Die Funktion jack.process() nimmt Audio von drei Mikrofonen auf. Wenn ich es zum Beispiel mit time.sleep (2) ersetze, funktioniert alles ok.
Was ist der beste Weg, um Threading in diesem Fall zu erstellen? Warum friert der jack.process die GUI ein? Benötigt es die ganze CPU-Zeit oder so? Proben von meinem Code unten:
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() und recordStop() einfach Callback-Funktionen, die aufgerufen werden, wenn Start- und Tasten gedrückt werden aufhören.
...
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)
"Die Aufnahme erfolgt in einem anderen Thread, da die GUI gleichzeitig zum Anzeigen von Ergebnissen aus dem Audio verwendet werden muss" - Das ist falsch. Kein Grund, Threads zu verwenden. Sie sollten Threads nur verwenden, wenn die Aufzeichnungs-API blockiert. Ansonsten kannst du beides im selben Thread (besser) machen. – nosklo
Vielleicht habe ich es nicht richtig erklärt. Die Aufnahme erfolgt in einer Schleife, so dass es keine Pausen gibt oder sie so minimal wie möglich sind. Wenn dann ein Sample aufgenommen wird, wird es analysiert und die Ergebnisse werden in der GUI angezeigt. Zur gleichen Zeit wird bereits das nächste Sample aufgenommen. Wenn es nicht gut ist, Threads zu verwenden, habe ich keine Ahnung, wie das gemacht werden muss. –