staging.inyokaproject.org

Tonausgabe (audsp/espeak) per definiertem Tastendruck pausieren oder stoppen

Status: Gelöst | Ubuntu-Version: Ubuntu 10.10 (Maverick Meerkat)
Antworten |

Heinrich_Schwietering Team-Icon

Wikiteam
Avatar von Heinrich_Schwietering

Anmeldungsdatum:
12. November 2005

Beiträge: 11288

Hi!

Bin auf der Suche nach der Möglichkeit, die Tonausgabe von Festival (Prozess audsp) und eSpeak für das xsane2speech-Skript zu unterbrechen, oder auch ganz stoppen zu können. In der Systemüberwachung ist das per "Prozess anhalten" und "Prozess stoppen" möglich; ich bräuchte es per Tastendruck, der aktiv ist, währen die Ausgabe läuft. Finde allerdings nur threads, in denen Leute keinen Sound haben, ihn aber brauchen, nicht umgekehrt 😉.

Wie kann man das wohl bewerkstelligen?

Eine andere Möglichkeit wäre, ein Zenity-Fenster mit einer entsprechenden Auswahlmöglichkeit zu öffnen,sobald der Wiedertgabe prozess läuft, und es wieder schleißen zu lassen, wenn er beendet wird; würde gut zu dem Programm passen.

so long
hank

Vain

Avatar von Vain

Anmeldungsdatum:
12. April 2008

Beiträge: 2503

Moin,

was die „Systemüberwachung“ wohl tut, ist SIGSTOP und SIGCONT an den Prozess zu schicken. Du selbst kannst das primär auf zwei Arten tun:

  • Wenn deine Anwendung im Terminal läuft, dann drück mal Strg + S , das sendet SIGSTOP. Danach ein Strg + Q für SIGCONT.

  • Wenn dein Programm irgendwo im Hintergrund werkelt und nicht direkt in einem Terminal sichtbar ist, dann kannst du kill nutzen, um die Signale zu übermitteln:

    1
    2
    3
    kill -STOP $pid
    # oder
    kill -CONT $pid
    

    Die $pid solltest du ja kennen.

Zum Testen könntest du zum Beispiel das hier mal im Terminal laufen lassen:

1
while true; do echo -n "[$BASHPID] "; date; sleep 1; done

Das zeigt dir die PID an, damit du mit kill experimentieren kannst, und außerdem kannst du’s mit Strg + S und Strg + Q probieren.

HTH. ☺

Heinrich_Schwietering Team-Icon

Wikiteam
(Themenstarter)
Avatar von Heinrich_Schwietering

Anmeldungsdatum:
12. November 2005

Beiträge: 11288

Hi!

Großartig, Danke! 👍 Für mich als "Universal-Diletant" ist die Variante mit

killall -STOP audsp
killall -CONT audsp

einfacher, da muss ich mich nicht um die PIDs kümmerm, außerdem tummeln sich immer zwei audsp-Prozesse in Prozessvervaltung (oder wohl eher dem Rechner 😉), die hab' ich dann gleich beide am Wickel. (und das mit $pid verstehe ich auf Anhieb auch nicht, vermutlich eine Variable, die per pidof ausgelesen würde?)

Aber zu der noch zu der while:true-Geschichte: Ich möchte, dass ein Zenity-Fenster mit der Auswahl zum Pausieren, Wiederaufnehmen und Beenden zeigt, geöffnet wird, sobald der Wiedergabeprozess Prozess läuft, und spätestens wieder verschwindet, wenn der Text zu Ende vorgelesen ist, aber endgültig abgbrochen wurde (was ja auf da selbe hinausläuft,also wenn der Prozess beendet ist.

Wie könnte so ein Aufruf aussehen?

**Pseudocode**
while $PROZESS true
do ZENITY-FENSTER mit Angabe der Optionen zu killall
done

sowas in der Art hätte ich da gerne...

so long
hank

Heinrich_Schwietering Team-Icon

Wikiteam
(Themenstarter)
Avatar von Heinrich_Schwietering

Anmeldungsdatum:
12. November 2005

Beiträge: 11288

Hi!

Bin ja etwas weiter; mit

1
2
3
4
       while pidof "$SOUND" true
       do
       [ZENITY-BEFEHL]
       done  

kann ich mit ausgelesener Variable $SOUND für eSpeak das Zenity-Fenster am Laufen halten, und auch bedienen, solange der Prozess läuft ☺

Kniffelig wird es allerdings, wenn statt dessen Festival läuft; dafür wird audsp verwendet, und da sind immer zwei Prozesse am Laufen, einer mit fester ID, dar andere wird anscheinend immer wieder neu gestartet, jedenfalls erhöht sich die ID mit jedem Aufruf, es scheint für jeden neuen Satz einen neuen Prozess zugeben.

Interessanterweise lässt sich der Prozess mit der festen Nummer auch nicht beenden, zumindest nicht mit einem einfachen "killall", jedenfalls sagt mir das Terminal, dass es den Prozess nicht gäbe... Sehr seltsam. Für die while-Abfrage geht es im Skript wohl deshalb nicht, weil die erste Prozessnummer verwendet wird, die aber ja ständig wechselt, was bedeutet: die Schleife kommt gar nicht zu Einsatz... bzw lässt sich nicht beenden 😲 KAnn aber über das Skript die pids gar nicht nicht auslesen lassen, im Terminal geht es.

Ich müsste also versuchen, die zweite Nummer rauszuholen, aber selbst wenn ich die habe, weiß ich auch nicht, ob ich mit while pidof weiter kommen würde, da kann ich ja "nur" den Namen des Prozesses einsetzen...

so long
hank

Heinrich_Schwietering Team-Icon

Wikiteam
(Themenstarter)
Avatar von Heinrich_Schwietering

Anmeldungsdatum:
12. November 2005

Beiträge: 11288

Hi!

Des Rätsels Lösung scheint ein sleep-Befehl vor aufruf des Zenity- Fensters zu sein, der Ausgabe-Prozess für Festival, mit dem Umwandeln in die Wave-Datei dauerte schlicht zu lange, sodass der Prozess noch nicht gestartet war, der das Festival-Fenster steuern sollte 😊 .

So ist es also geklärt, besten Dank nochmal...

so long
hank

Antworten |