Wpis z mikrobloga

Mirki, potrzebuję pomocy z #python

Mam na koncie kilka aplikacji okienkowych w #pyqt5 - przeważnie małe proste skrypty okraszone prostym GUI do użytku wewnętrznego w firmie. Wydaje mi się, że podstawy PyQt5 mam opanowane.

Teraz robię prosty skrypt do zapisywania i analizy wielokanałowego (8-16ch) dźwięku. Do analiz wykorzystuje #numpy - ale ten element też nie stanowi dla mnie problemu.

Sama praca z dźwiękiem w pythonie: testuje dwie biblioteki: python-sounddevice oraz PyAudio - obie to są bindingi do PortAudio. Obie są dość podobne, chociaż bardziej podoba mi się sounddevice. Z jego używaniem w prostych skryptach też nie mam problemu. Ze względu na specyfikę dokonywanej przeze mnie analizy używam non-blocking callback streams.

Problem pojawia się, gdy próbuję połączyć używanie sounddevice i PyQt5. Nie za bardzo wiem jak to ugryźć. Chciałbym, aby Stream z sounddevice dział się jakby niezależnie GUI. I tylko w funkcji callback odwoływać się do elementów GUI - np. odświeżać jakiś wskaźnik, czy wartość w GUI na podstawie obliczeń w callbacku na danych ze Streama.

Nieliczne przykłady w Internecie sugerują używanie m.in. QRunnable, czy QThreadPool - są to mi niestety metody zupełnie nieznane, nigdy nie pisałem niczego co wymagało by wydzielania oddzielnych procesów czy wątków. Czy ktoś z Was zmagał się z podobnym wyzwaniem? Może możecie polecić coś do poczytania, tak, żeby się w to chociaż trochę wgryźć. Może akurat znacie jakieś publiczne repozytorium, w którym ktoś używał jednocześnie PyQt5 i obsługiwał audio. Będę bardzo wdzięczny za jakiekolwiek wskazówki.

  • 2
nie bawiłem się z pyqt, ale same wątki nie są skomplikowane, trzeba zadbać o to żebyś dzielił między nimi, to co chcesz dzielić, być może zamiast używać "non-blocking callback streams" lepiej żebyś sam to opakował w wątek

to jest jakiś przykład:
https://www.pythonforthelab.com/blog/handling-and-sharing-data-between-threads/

nie mam za dużego doświadczenia z tym, więc może ktoś coś jeszcze napisze, ale jeśli się da, to ja bym przekazywał jakiś obiekt qt do wątku ze streamem, albo samego