File Coverage

blib/lib/Audio/Xmpcr/Network.pm
Criterion Covered Total %
statement 6 81 7.4
branch 0 38 0.0
condition 0 15 0.0
subroutine 2 14 14.2
pod 0 10 0.0
total 8 158 5.0


line stmt bran cond sub pod time code
1             # -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
2             # Audio::Xmpcr::Network
3             # Copyright Paul Bournival 2003
4             # -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
5            
6             package Audio::Xmpcr::Network;
7              
8             $VERSION="1.02";
9              
10 1     1   5 use strict;
  1         2  
  1         40  
11 1     1   3053 use IO::Socket::INET;
  1         32867  
  1         9  
12              
13             sub new {
14 0     0 0   my($class,$host,$port,$locker)=@_;
15 0   0       $port ||= 32463;
16 0           my $self={};
17              
18 0 0         $self->{s}=new IO::Socket::INET(PeerAddr => "$host:$port")
19             or die "Can't contact xmdaemon: $!!\n";
20 0           bless $self,$class;
21              
22 0 0         $self->_doop("appname $locker") if $locker;
23              
24 0           $self->{queuedEvents}=[];
25 0           $self;
26             }
27              
28             # -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
29             # turn on/off power
30             # -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
31             sub power {
32 0     0 0   my($self,$status)=@_;
33 0 0         die "Xmpcr::power: incorrect parameters" if ! $status;
34 0           my @ret=$self->_doop($status);
35 0 0         scalar(@ret)==0 ? undef : $ret[0];
36             }
37              
38             # -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
39             # turn on/off mute
40             # -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
41             sub mute {
42 0     0 0   my($self,$status)=@_;
43 0 0         die "Xmpcr::mute: incorrect parameters" if ! $status;
44 0           my @ret=$self->_doop("mute $status");
45 0 0         scalar(@ret)==0 ? undef : $ret[0];
46             }
47              
48             # -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
49             # change channel
50             # -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
51             sub setchannel {
52 0     0 0   my($self,$chan)=@_;
53 0 0         die "Xmpcr::setchannel: incorrect parameters" if ! $chan;
54 0           my @ret=$self->_doop("channel $chan");
55 0 0         scalar(@ret)==0 ? undef : $ret[0];
56             }
57              
58             # -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
59             # force the lock
60             # -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
61             sub forcelock {
62 0     0 0   my($self)=@_;
63 0           my @ret=$self->_doop("forcelock");
64 0 0         scalar(@ret)==0 ? undef : $ret[0];
65             }
66              
67             # -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
68             # list 1 or all channels
69             # -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
70             sub list {
71 0     0 0   my($self,$chan)=@_;
72 0 0         my @list=$self->_doop("list" . ($chan ? " $chan" : ""));
73 0           my @ret;
74 0           for my $line (@list) {
75 0           push(@ret,$self->_hashifySongEntry($line));
76             }
77 0 0         $chan ? $ret[0] : @ret;
78             }
79              
80             # -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
81             # splits a tab-delimited entry into a hash
82             # -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
83             sub _hashifySongEntry {
84 0     0     my($self,$line)=@_;
85 0           my(@e)=split("\t",$line);
86             {
87 0   0       NUM => $e[0] || 0,
      0        
      0        
      0        
      0        
88             NAME => $e[1] || "",
89             CAT => $e[2] || "",
90             SONG => $e[3] || "",
91             ARTIST => $e[4] || "",
92             };
93             }
94              
95             # -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
96             # obtain general radio status
97             # -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
98             sub status {
99 0     0 0   my($self)=@_;
100 0           my %ret;
101 0           map {
102 0           my($k,$v)=split("\t",$_);
103 0           $ret{$k}=$v;
104             } $self->_doop("status");
105 0           %ret;
106             }
107              
108             # -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
109             # event support (i.e., song changing)
110             # -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
111             sub events {
112 0     0 0   my($self,$status)=@_;
113 0 0         die "Xmpcr::mute: incorrect parameters" if ! $status;
114 0           my @ret=$self->_doop("events $status");
115 0 0         scalar(@ret)==0 ? undef : $ret[0];
116             }
117              
118             # -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
119             # find out which channels have changed songs
120             # -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
121             sub processEvents {
122 0     0 0   my($self)=@_;
123 0           my($rin,$buf)="";
124 0           my @events=@{ $self->{queuedEvents} };
  0            
125 0           $self->{queuedEvents}=[];
126 0           vec($rin,fileno($self->{s}),1)=1;
127 0 0         if (select($rin,undef,undef,.05)) {
128 0           sysread($self->{s},$buf,16000);
129 0 0         if ($buf) {
130 0           map {
131 0           s/^\+\t//;
132 0           push(@events,$_);
133             } split("\n",$buf);
134             }
135             }
136             map {
137 0           $_=$self->_hashifySongEntry($_);
  0            
138             } @events;
139 0           @events;
140             }
141             # -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
142             # return the server socket FD for select() calls
143             # -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
144             sub eventFd {
145 0     0 0   my($self)=@_;
146 0           return fileno($self->{s});
147             }
148              
149             # -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
150             # a general send/receive method.
151             # -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
152             sub _doop {
153 0     0     my($self,$cmd)=@_;
154 0           my($ret,@ret)=("");
155 0 0         syswrite($self->{s},$cmd . "\n") if $cmd;
156              
157 0           my($rin,$rout)="";
158 0           vec($rin,fileno($self->{s}),1)=1;
159 0           while(1) {
160 0           my $buf;
161 0           sysread($self->{s},$buf,1024);
162 0           $ret .= $buf;
163 0 0 0       last if ! $buf or $ret =~ /Ready\n$/;
164             }
165 0           for my $line (split("\n",$ret)) {
166 0 0         if ($line =~ /^\+/) {
    0          
167 0           push(@{ $self->{queuedEvents} },$line) ;
  0            
168             } elsif ($line eq "Ready") {
169             } else {
170 0           push(@ret,$line);
171             }
172             }
173 0           @ret;
174             }
175              
176             1;