Open Source im professionellen Einsatz
Linux-Magazin 12/2008
472

Audiodaten lesen: EAGI

Ein mit dem Befehl »EAGI« gestartetes Programm verhält sich identisch zu AGI-Programmen - mit der Ausnahme, dass es über den Datei-Deskriptor 3 sämtliche Audiodaten lesen darf, die der Anrufer in den Channel schickt. Das C-Programm in Listing 6 tut dies und speichert die Audiodaten in der Datei »/tmp/c-audio.raw«. Diese können Sie entweder mit

sox -t raw -r 8000 -s -w -c 1 U
c-audio.raw c-audio.wav

in die WAV-Datei »c-audio.wav« konvertieren. Oder Sie geben die Daten mit

cat c-audio.raw | sox -t raw -r 8000 -s -w -c 1 - -t wav - | play -t wav -r 8000 -c 1 -

direkt auf dem Rechner wieder (siehe Kurve in Abbildung 3).

Listing 6: Audiodaten als
Datei

01 #include <fcntl.h>
02 #include <stdio.h>
03 #include <unistd.h>
04 #include <errno.h>
05 #include <sys/select.h>
06 #include <string.h>
07 
08 #define AUDIO_FILENO (STDERR_FILENO + 1)
09 
10 int main(void)
11 {
12     fd_set fds;
13     int res, fd;
14     char audiobuf[4096];
15 
16     if ((fd = open("/tmp/c-audio.raw", O_WRONLY | O_TRUNC | O_CREAT, 660)) < 0)
17          exit(0);
18     for (;;) {
19          FD_ZERO(&fds);
20          FD_SET(AUDIO_FILENO, &fds);
21          if ((res = select(AUDIO_FILENO + 1, &fds, NULL, NULL, NULL)) < 0) {
22               fprintf(stderr, "Error in select: %sn", strerror(errno));
23               break;
24          }
25          if (FD_ISSET(AUDIO_FILENO, &fds)) {
26               res = read(AUDIO_FILENO, audiobuf, sizeof(audiobuf));
27               if (res > 0) {
28                   write(fd, audiobuf, res);
29               }
30          }
31     }
32     if (fd > 0)
33          close(fd);
34     exit(0);
35 }

Ein AGI-Programm beenden

Bei nicht gesetzter Channel-Variable »AGISIGHUP« schickt Asterisk sofort das Signal »SIGHUP« an Ihr laufendes AGI-Programm, wenn ein Anrufer auflegt. Daher müssen Sie sich auch keine Gedanken machen, dass das Programm in einer While-Schleife hängen bleibt, wenn der Benutzer auflegt.

Dieses Verhalten kann allerdings unerwünscht sein, beispielsweise wenn das AGI-Programm noch temporäre Dateien aufräumen oder eine gerade vom Anrufer aufgenommene Nachricht verschicken soll. Außerdem arbeitet Asterisk die in der Extension folgenden Priorities nicht ab, wenn der Anrufer einhängt. Wollen Sie dieses Asterisk-»SIGHUP« an Ihr AGI-Programm unterbinden, dann weisen Sie vor dem AGI-Programmstart mit

Set(AGISIGHUP="no")

der genannten Variablen »no« zu. Dennoch kann es vorkommen, dass ein AGI-Programm von außen beendet wird, weil es genau genommen über zwei Pipes mit Asterisk kommuniziert. (Die erzeugt übrigens die Funktion »launch_script()« in der Datei »res_agi.c«.) Legt der Anrufer auf, dann hört Asterisk auf, von der Pipe zu lesen. Wenn das AGI-Programm dann per Stdout in die Pipe schreibt, bekommt es sofort das Signal »SIGPIPE« geschickt und haucht selbst sein Leben aus.

Das passiert immer, wenn ein Prozess in eine Pipe schreibt, bei der der lesende Prozess schon beendet ist (Broken Pipe, siehe »man 7 signal«). Wollen Sie nach Stdout schreiben ohne die Angst, dass ihr AGI-Programm dabei stirbt, müssen Sie das Signal »SIGPIPE« ignorieren oder einen Signalhandler dafür schreiben.

Linux-Magazin kaufen

Einzelne Ausgabe
 
Abonnements
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

Ähnliche Artikel

  • Zeit für was Neues

    Der eine braucht sowieso gerade eine neue, den anderen nervt, dass sich der Vermieter seiner Telefonanlage jedes Komfortmerkmal extra bezahlen lässt. Zeit zu wechseln, Zeit eine VoIP-fähige Anlage selbst zu bauen, Zeit für einen Asterisk-Workshop im Linux-Magazin.

  • Erweiterte Gesprächskultur

    Im zweiten Teil des großen Telefonanlagen-Workshops erfahren Sie, wie Sie komplexe Komfortfunktionen programmieren, beispielsweise interaktive Sprachmenüs, und welche Mechanismen Asterisk im Einzelnen dafür in seinem Ärmel hat.

  • Deutsche Sprachbausteine für Asterisk-Anlagen

    Der VoIP-Spezialist Amooma bietet Sprachbausteine für die freie Asterisk-Telefonanlage (Version 1.4 und 1.6) zum kostenfreien Download und uneingeschränkter Nutzung an.

  • Ruf mich an!

    Alles, was über Telefonie hinausgeht, macht den wirklichen Mehrwert von Asterisk aus: Sprachportale beispielsweise, die Fluggäste identifizieren und informieren, bei einer frostigen Wohnung warnen oder den Admin mimen, wenn die User ihre Passwörter verschusselt haben.

  • Gemeinschaft an der Strippe

    Asterisk-Toolkits wie das auf deutsche Verhältnisse angepasste Projekt mit dem schönen Namen Gemeinschaft helfen den Admins und Systemintegratoren, eine Telefonanlage ab mittlerer Größe mit überschaubarem Aufwand zu migrieren und zu betreiben.

comments powered by Disqus

Ausgabe 10/2017

Digitale Ausgabe: Preis € 6,40
(inkl. 19% MwSt.)

Artikelserien und interessante Workshops aus dem Magazin können Sie hier als Bundle erwerben.