Open Source im professionellen Einsatz

Audiotool Sox

Das Suffix ist wichtig, denn das nachfolgend aufgerufene Tool »sox« schließt daraus auf das in der Audiodatei zu verwendende Kodierungsverfahren. Externe Programme startet POE durch ein Objekt der Klasse POE::Wheel::Run, das das GUI ruckellos weiterlaufen lässt und bei Bedarf sogar Aktionen auslöst, wenn das Programmkind sich verabschiedet. Das Wheel in der Zeile 47 ignoriert allerdings jene Events, die bei Ausgaben nach »Stderr« auftreten (»StderrEvent«). Nur der User kann den Lauf des Rekorders beenden.

Das aufgerufene Programm »rec« liegt dem »sox«-Paket bereits bei (genau wie das später genutzte Utility »play«) und nimmt nur den Namen der zu erstellenden Audiodatei entgegen. Es liest Audiodaten über ein eingebautes oder externes Mikrofon. Zu beachten ist, dass POE::Wheel::Run das aufzurufende Programm und dessen Parameterliste getrennt in den Parametern »Program« und »ProgramArgs« erwartet.

Der Code ab Zeile 46 hält das GUI übrigens ganz und gar nicht auf, alle notwendigen Aktionen geschehen im Hintergrund. Damit das Wheel nicht nach dem Verlassen der Funktion »record()« seine letzte Referenz verliert und Perls Garbage-Collector zum Opfer fällt, speichert Zeile 53 eine Referenz darauf unter dem Schlüssel »recorder« im POE-spezifischen »$HEAP« ab. Weiter sichert es dort den Namen der temporären Datei, damit die Abspielfunktion später darauf zugreifen kann. Am Ende frischt »record()« noch die Fußzeile auf, um dem User mitzuteilen, dass er mit [S] stoppen und mit [P] den Abspielvorgang einleiten kann.

Stopp!

Nach einem Tastendruck auf [S] kommt die Funktion »record_stop()« an die Reihe, sie prüft zunächst, ob überhaupt ein Wheel läuft. Falls nicht, hat wohl ein Übermütiger [S] gedrückt, ohne dass überhaupt eine Aufnahme lief. Zeile 70 schießt das laufende Aufnahmeprogramm dann mit dem über das Posix-Modul hereingeholte »SIGTERM«-Signal ab, im Anschluss streicht Zeile 71 die Referenz des soeben (hoffentlich) ruckartig beendeten Wheel aus dem Heap.

Die Funktion »footer_update()« frischt mit der »text()«-Methode die Fußzeile auf und schickt ein »draw()« hinterher, um das GUI zu veranlassen, das Widget neu auf den Bildschirm zu zeichnen. Der Abspiel-Handler »play_flipped« stoppt zunächst etwaige laufende Aufnahmen und ruft dann in Zeile 105 das Abspiel-Wheel auf. Dies definiert einen »CloseEvent«, der den in Zeile 18 definierten POE-Zustand »play_ended« anspringt, sobald die vom Wheel aufgerufene Funktion »sox_play()« (ab Zeile 117) zurückkehrt. Auch hier vertrödelt POE keine Zeit, sondern führt »sox_play()« asynchron aus und kommuniziert mit ihren Ausgabe-, Fehler- und Ende-Events.

Damit auch dieses Wheel nicht in sich zusammenfällt, wenn das Skript den Scope der Funktion »play_flipped« verlässt (was wegen des asynchronen Aufrufs noch passiert, bevor das Wheel die externe Funktion überhaupt startet), speichert Zeile 113 eine Referenz darauf im »$HEAP« ab. Jedes Wheel hat innerhalb einer POE-Session eine eindeutige ID und da »play_flipped()« die Referenz unter der ID abspeichert, könnte der User auch mehrere Abspielvorgänge gewissermaßen parallel starten.

Die Funktion »sox_play()« legt eine weitere temporäre, zunächst leere Ogg-Datei an und übergibt sie dem Utility »sox«:

sox input.ogg output.ogg reverse

Die Option »reverse« weist »sox« an, die Eingabedatei nicht einfach in die Ausgabedatei zu überführen, sondern sie dabei auch noch umzudrehen. Die Ergebnisdatei schnappt sich dann das Sox-Utility »play« in Zeile 126 und spielt sie ab. Die umgedrehte Datei löscht Zeile 128 anschließend, denn ein erneuter Aufruf von »sox_play« legt eine neue an.

Diesen Artikel als PDF kaufen

Express-Kauf als PDF

Umfang: 4 Heftseiten

Preis € 0,99
(inkl. 19% MwSt.)

Als digitales Abo

Als PDF im Abo bestellen

comments powered by Disqus

Ausgabe 07/2013

Preis € 6,40

Insecurity Bulletin

Insecurity Bulletin

Im Insecurity Bulletin widmet sich Mark Vogelsberger aktuellen Sicherheitslücken sowie Hintergründen und Security-Grundlagen. mehr...

Linux-Magazin auf Facebook