Listing 3. The DSP.pm Module An IP Telephone in 74 Lines of PERL
The Perl Journal, Fall 2000
 

The DSP.pm module, which reads and writes MP3 data.

 0    package DSP;

 1    use strict;
 2    use IO::File;
 3    use Carp 'croak';
 4    use vars '%sizeof', '@ISA';
 5    @ISA = 'IO::Handle';

 6    BEGIN {
 7      use Config;
 8      %sizeof= ( int => $Config{intsize} );
 9      require "sys/soundcard.ph";
 10   }

 11   use constant DSP        => '/dev/dsp';
 12   use constant COMPRESS   => $Config{byteorder} eq '1234'
 13                              ? "lame -r -x -m m -b32 -s16 - - |"
 14                              : "lame -r    -m m -b32 -s16 - - |";
 15   use constant UNCOMPRESS => "| mpg123 -s -m -";

 16   sub new {
 17       my $class = shift;
 18       my $dsp = IO::File->new('/dev/dsp', 'r+') 
                      or croak "Can't open /dev/dsp: $!";
 19       croak "can't set samplesize: $!" 
            unless ioctl $dsp, SNDCTL_DSP_SAMPLESIZE, pack("I", 16);
 20       croak "can't set speed: $!"      
            unless ioctl $dsp, SNDCTL_DSP_SPEED, pack("I", 16000);
 21       croak "can't set mono: $!"       
            unless ioctl $dsp, SNDCTL_DSP_STEREO, pack("I", 0);
 22       return bless $dsp, $class;
 23   }

 24   # read from encode to get MP3 from microphone
 25   sub compress {
 26       my $self = shift;
 27       open(S, "<&STDIN");
 28       STDIN->fdopen($self, "r") or die "Can't reopen STDIN on DSP: $!";
 29       my $encode = IO::File->new(COMPRESS) or croak "Can't open lame: $!";
 30       open(STDIN, "<&S");
 31       return $encode;
 32   }

 33   # write to decode to get sound from MP3
 34   sub uncompress {
 35       my $self = shift;
 36       open(S, ">&STDOUT");
 37       STDOUT->fdopen($self, "w") or die "Can't reopen STDOUT on DSP: $!";
 38       my $uncompress = IO::File->new(UNCOMPRESS) 
            or die "Can't open mpg123: $!";
 39       $uncompress->autoflush(1);
 40       open(STDOUT, ">&S");
 41       return $uncompress;
 42   }

 43   1;