Audio-Radio-Sirius
view release on metacpan or search on metacpan
lib/Audio/Radio/Sirius.pm view on Meta::CPAN
my ($mutereq) = @_;
if (!defined($mutereq)) { return $self->{mute}; } # accessor
if (!( ($mutereq == 0) || ($mutereq == 1) ) ) {
carp "Mute must be either 0 or 1.";
return 0;
}
my $mutehex = $self->_num_to_signed_hex($mutereq);
my $cmd = $COMMANDS{'mute'} . $mutehex;
if (!$self->_send_command($cmd)) {
carp "Tuner did not respond to mute command.";
return 0;
}
return 1;
}
=head2 channel (channel number, offset)
Can be used without a parameter to get the current channel number or with a parameter to change channels. When used with a parameter, returns true
on success and false on failure. Offset is -1 to select the channel before the specified number, 1 to select the channel above the specified number,
or 0 (default) to simply go to the specified channel.
my $current_channel = $tuner->channel;
my $result = $tuner->channel(6, 1); # Tune to channel 7
$tuner->channel(100); # Tune directly to channel 100
=cut
sub channel {
my $self = shift;
if (!ref($self)) { croak "$self isn't an object"; }
my ($chanreq, $offsetreq) = @_;
my $offset = 0;
if (!defined($chanreq)) { return $self->{channel}; } # accessor
if (defined($offsetreq) && ($offsetreq =~ /0|1|-1/) ) { $offset = $offsetreq; }
### TODO: Channel validation.
# channel command: $COMMAND, channel, [0,1,-1], $COMMAND suffix
my $chanhex = $self->_num_to_unsigned_hex($chanreq);
my $offsethex = $self->_num_to_signed_hex($offset);
my $cmd = $COMMANDS{channel} . $chanhex . $offsethex . $COMMANDS{channel_suffix};
return $self->_send_command($cmd);
}
=head2 monitor (cycles)
Monitor is called to watch for updates from the tuner. The Sirius tuner is pretty chatty and sends relevant data, such as Artist/Title updates,
PIDs, signal strength, and other information. Calling monitor initiates reads of this data.
Reads happen automatically when commands are executed (for example changing the channel or muting the tuner). Still, monitor generally needs
to be called as often as possible to gather the latest data from the Tuner.
A monitor cycle will take a minimum of one second. If data is received, this timer resets. In other words, monitor may take longer than you anticipate.
The amount of time monitor takes will depend on the C<verbosity> of the tuner.
If no number of cycles is specified, monitor runs one cycle.
B<Note:> As of version 0.02, the cycle parameter is no longer a true count of the number of cycles. The number specified is multiplied by 20.
Each cycle now sleeps 50 msec so the result is roughly the same, although this may increase the drift of cycles vs. seconds even more.
$tuner->monitor(5); # spin 5 times
=cut
sub monitor {
my $self = shift;
if (!ref($self)) { croak "$self isn't an object"; }
my ($spins) = @_;
if (!defined($spins)) { $spins = 1; }
$spins = $spins * 20;
foreach (1..$spins) {
$self->_receive_if_waiting;
sleep (.05); # chill .05 second
}
}
=head2 set_callback (callback type, function reference)
When the tuner sends an update, such as new artist/title information on the current channel, it may be helpful to execute some code which handles this
event. To accomidate this, you may define function callbacks activated when each event occurs. Note that some of the parameters below are marked with
an asterisk. This indicates that they may be undefined when your function is called. You should account for this in your callback function.
=head3 channel_update (channel, *pid, *artist, *title, *composer)
$tuner->set_callback ('channel_update', \&channel);
sub channel {
my ($channel, $pid, $artist, $title, $composer) = @_;
print "Channel $channel is now playing $title.\n";
}
=head3 signal_update
Not yet implemented.
=head3 time_update
Not yet implemented.
=head3 status_update
Not yet implemented.
=cut
sub set_callback {
my $self = shift;
if (!ref($self) eq 'CODE') { croak "$self isn't an object"; }
my ($reqtype, $funcref) = @_;
if (!ref $funcref) { croak "$funcref must be a reference to a function"; }
if (!exists($DEFAULTS{'_callbacks'}{$reqtype}) ) { croak "$reqtype is not a supported update type"; }
( run in 2.178 seconds using v1.01-cache-2.11-cpan-98e64b0badf )