Audio-Daemon
view release on metacpan or search on metacpan
package Audio::Daemon;
use IO::Socket::INET;
use IO::Select;
use vars qw($VERSION);
$VERSION='0.99Beta';
sub new {
my ($proto, %arg) = @_;
my $class = ref($proto) || $proto;
my $self = {};
foreach my $k (qw/Allow Deny Server Port Log Pass/) {
$self->{$k} = $arg{$k} if (defined $arg{$k});
}
# if you feel like changing the main seperator value:
$self->{sep} = sprintf("%c", 255);
# or changing the secondary seperator value:
$self->{subsep} = sprintf("%c", 254);
bless($self, $class);
$self->parse_acl('Allow') if ($self->{Allow});
$self->parse_acl('Deny') if ($self->{Deny});
return $self;
}
sub debug { my $self = shift; return $self->log('debug', @_); }
sub info { my $self = shift; return $self->log('info', @_); }
sub error { my $self = shift; return $self->log('error', @_); }
sub crit { my $self = shift; return $self->log('crit', @_); }
sub warn { my $self = shift; return $self->log('warn', @_); }
sub log {
my $self = shift;
my @caller = caller(2);
# print "caller line is ".$caller[2]."\n";
# ($package, $filename, $line, $subroutine, $hasargs,
# $wantarray, $evaltext, $is_require, $hints, $bitmask)
if (defined $self->{Log}) {
&{$self->{Log}}(@_, @caller);
return 1;
} else {
return 0;
}
}
sub socket {
my $self = shift;
if (ref $self->{socket} eq 'IO::Socket::INET') {
$self->debug('caller requested existing socket');
return $self->{socket}
}
my $package = (split '::', (ref $self))[-1];
if ($package ne 'Client') {
if (! defined $self->{Port}) {
$self->crit("No Port defined for socket creation");
return;
}
$self->{socket} = IO::Socket::INET->new(LocalPort => $self->{Port}, Proto=>'udp');
} else {
if (! defined $self->{Port} || ! defined $self->{Server}) {
$self->crit("Need both the Port and Server defined for socket creation");
return;
}
$self->{socket} = IO::Socket::INET->new(PeerPort => $self->{Port}, PeerAddr => $self->{Server}, Proto=>'udp');
}
if (! defined $self->{socket}) {
$self->crit("Failed to initialize Socket: $!");
return;
}
return $self->{socket};
}
# randomze takes in an array reference and returns an array of randomzied indixes
sub randomize {
my $self = shift;
my $start = shift;
return unless (ref $start eq 'ARRAY');
my @stack;
my $count = 0;
while (scalar @$start) {
my $pick = int (rand() * (scalar @$start));
push @stack, $start->[$pick];
splice(@{$start}, $pick, 1);
}
$self->{random} = \@stack;
my @revstack;
foreach my $t (0..$#stack) {
$revstack[$stack[$t]] = $t
}
$self->{revrandom} = \@revstack;
}
# Generic read routine, should return a hash ref of values read from client.
# will return undef if request comes from unallowed IP.
( run in 1.872 second using v1.01-cache-2.11-cpan-75ffa21a3d4 )