| |
mp3_recv.pl
accepts MP3-encoded telephone calls.
0 #!/usr/bin/perl
1 # file: mp3_recv.pl
2 use strict;
3 use DSP;
4 use IO::Socket;
5 use constant BUFSIZE => 1024;
6 $SIG{CHLD} = sub { wait; };
7 my $dest = shift || 'prego';
8 my $port = shift || 2007;
9 my $listen = IO::Socket::INET->new(LocalPort => $port,
10 Listen => 5,
11 Reuse => 1) || die "Can't listen: $!";
12 while (1) {
13 warn "waiting for a connection...\n";
14 my $sock = $listen->accept;
15 warn "accepting connection from ", $sock->peerhost,"\n";
16 unless (my $dsp = new DSP) {
17 warn "DSP unavailable. Hanging up.\n";
18 close $sock;
19 } else {
20 handle_connection($sock, $dsp);
21 }
22 }
23 sub handle_connection {
24 my ($sock, $dsp) = @_;
25 my $child = fork();
26 die "Can't fork: $!" unless defined $child;
27 my $data;
28 if ($child) { # parent process
29 eval {
30 local $SIG{INT} = sub {die};
31 my $uncompress = $dsp->uncompress;
32 print $uncompress $data while sysread($sock, $data, BUFSIZE);
33 };
34 close $sock;
35 kill TERM => $child;
36 } else {
37 close $listen;
38 my $compress = $dsp->compress;
39 print $sock $data while sysread($compress, $data, BUFSIZE);
40 exit;
41 }
42 }
|