Perl EAGI

 #!/usr/bin/perl
 #
 # Note that this example doesn't check the results of AGI calls, and doesn't use
 # Asterisk::AGI in an attempt to keep it simple and dependency free.
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the same terms as Perl itself.
 #
 # Author: Simon P. Ditner / http://uc.org/simon
 #
 # Usage:
 #    - Create an AGI in /var/lib/asterisk/agi-bin, i.e.: perl.eagi
 #    - Call using EAGI from your dialplan: exten => 100,1,EAGI(perl.eagi)
 #
 use warnings;
 use strict;
 
 use IO::Handle;
 
 $| = 1; # Turn of I/O Buffering
 my $buffer = undef;
 my $result = undef;
 my $AUDIO_FD = 3;    # Audio is delivered on file descriptor 3
 my $audio_fh = new IO::Handle;
 $audio_fh->fdopen( $AUDIO_FD, "r" );           # Open the audio file descriptor for reading
 
 # Skip over the preamble that Asterisk sends this AGI
 while( <STDIN> ) {
   chomp;
   last if length == 0;
 }
 
 # Playback beep
 print "STREAM FILE beep \"#\"\n"; $result = <STDIN>;
 
 # Record 5 seconds of audio at 8,000 samples/second (uses 16 bit integers)
 #    5 seconds x 8000 samples/second x ( 16 bits / 8bits/byte ) = 80000 bytes
 my $bytes_read = $audio_fh->read( $buffer, 80000 );
 $audio_fh->close();
 
 # Playback beep
 print "STREAM FILE beep \"#\"\n"; $result = <STDIN>;
 
 # Write the raw audio to a file for later analysis
 my $fh;
 open( $fh, ">/tmp/recording.raw" );
 print $fh $buffer;
 close( $fh );
 
 # Also convert the raw audio on-the-fly to the GSM format using 'sox', so that
 # we can play it back to the user right now.
 open( $fh, "|/usr/bin/sox -t raw -r 8000 -s -b 16 -c 1 - /tmp/recording.gsm" );
 #                             |      |    |  |    |   |   |
 #                             |      |    |  |    |   |   '-- Write to this file
 #                             |      |    |  |    |   '-- Read from STDIN
 #                             |      |    |  |    '-- Mono Audio
 #                             |      |    |  '---- Samples are words (a word is 2 bytes = 16 bit audio)
 #                             |      |    '---- The audio is signed (32766..-32766)
 #                             |      '---- The sample rate is 8,000 samples/second
 #                             '---- The input format is SLIN, which is 'raw' audio
 print $fh $buffer;
 close( $fh );
 
 # Playback /tmp/recording.gsm
 print "STREAM FILE /tmp/recording \"#\"\n"; $result = <STDIN>;
 
 exit;

 #!/usr/bin/perl
 #
 # Note that this example doesn't check the results of AGI calls, and doesn't use
 # Asterisk::AGI in an attempt to keep it simple and dependency free.
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the same terms as Perl itself.
 #
 # Author: Simon P. Ditner / http://uc.org/simon
 #
 # Usage:
 #    - Create an AGI in /var/lib/asterisk/agi-bin, i.e.: perl.eagi
 #    - Call using EAGI from your dialplan: exten => 100,1,EAGI(perl.eagi)
 #
 use warnings;
 use strict;
 
 use IO::Handle;
 
 $| = 1; # Turn of I/O Buffering
 my $buffer = undef;
 my $result = undef;
 my $AUDIO_FD = 3;    # Audio is delivered on file descriptor 3
 my $audio_fh = new IO::Handle;
 $audio_fh->fdopen( $AUDIO_FD, "r" );           # Open the audio file descriptor for reading
 
 # Skip over the preamble that Asterisk sends this AGI
 while( <STDIN> ) {
   chomp;
   last if length == 0;
 }
 
 # Playback beep
 print "STREAM FILE beep \"#\"\n"; $result = <STDIN>;
 
 # Record 5 seconds of audio at 8,000 samples/second (uses 16 bit integers)
 #    5 seconds x 8000 samples/second x ( 16 bits / 8bits/byte ) = 80000 bytes
 my $bytes_read = $audio_fh->read( $buffer, 80000 );
 $audio_fh->close();
 
 # Playback beep
 print "STREAM FILE beep \"#\"\n"; $result = <STDIN>;
 
 # Write the raw audio to a file for later analysis
 my $fh;
 open( $fh, ">/tmp/recording.raw" );
 print $fh $buffer;
 close( $fh );
 
 # Also convert the raw audio on-the-fly to the GSM format using 'sox', so that
 # we can play it back to the user right now.
 open( $fh, "|/usr/bin/sox -t raw -r 8000 -s -b 16 -c 1 - /tmp/recording.gsm" );
 #                             |      |    |  |    |   |   |
 #                             |      |    |  |    |   |   '-- Write to this file
 #                             |      |    |  |    |   '-- Read from STDIN
 #                             |      |    |  |    '-- Mono Audio
 #                             |      |    |  '---- Samples are words (a word is 2 bytes = 16 bit audio)
 #                             |      |    '---- The audio is signed (32766..-32766)
 #                             |      '---- The sample rate is 8,000 samples/second
 #                             '---- The input format is SLIN, which is 'raw' audio
 print $fh $buffer;
 close( $fh );
 
 # Playback /tmp/recording.gsm
 print "STREAM FILE /tmp/recording \"#\"\n"; $result = <STDIN>;
 
 exit;

Created by: spditner, Last modification: Mon 15 of Oct, 2012 (13:40 UTC) by liosha
Please update this page with new information, just login and click on the "Edit" or "Discussion" tab. Get a free login here: Register Thanks! - Find us on Google+