J'ai un programme qui enregistre l'audio du périphérique Firewire (FA-66) avec la connexion Jack. L'interface est créée avec pygtk et l'enregistrement avec py-jack (http://sourceforge.net/projects/py-jack/). L'enregistrement est effectué dans un thread différent car l'interface graphique doit être utilisée en même temps pour afficher les résultats de l'audio.pygtk gui gèle avec le fil de pyjack
Le problème est que lorsque je démarre le fil d'enregistrement, l'interface graphique devient très lente à répondre. J'ai la fonction gtk.gdk start_threads() au début du thread principal. Si je l'ai bien, je n'ai pas besoin de threads_enter() et de threads_leave(), car l'enregistrement n'affecte pas l'interface graphique. Veuillez corriger si j'ai tort.
La fonction jack.process() enregistre l'audio à partir de trois microphones. Si je le remplace, par exemple, avec time.sleep (2), tout fonctionne bien.
Quelle est la meilleure façon de créer du filetage dans ce cas? Pourquoi le jack.process gèle-t-il l'interface graphique? Est-ce que ça prend tout le temps du CPU ou quelque chose? Des échantillons de mon code ci-dessous:
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() et recordstop() sont des fonctions simplement rappel qui sont appelés lorsque le démarrage et boutons d'arrêt sont pressés.
...
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)
"L'enregistrement se fait dans un fil différent parce que l'interface graphique doit être utilisée en même temps pour afficher les résultats de l'audio" - C'est incorrect. Pas une raison d'utiliser des discussions. Vous devez utiliser des threads uniquement si l'API d'enregistrement bloque. Sinon, vous pouvez simplement faire les deux dans le même thread (mieux). – nosklo
Peut-être que je ne l'ai pas expliqué correctement. L'enregistrement se fait en boucle afin qu'il n'y ait pas de pauses ou qu'elles soient aussi minimes que possible. Ensuite, lorsqu'un échantillon est enregistré, il sera analysé et les résultats sont affichés dans l'interface graphique. En même temps, l'échantillon suivant est déjà enregistré. Si ce n'est pas bon d'utiliser des threads, je n'ai aucune idée de comment cela doit être fait. –