Audio-Radio-V4L
view release on metacpan or search on metacpan
lib/Audio/Radio/V4L.pm view on Meta::CPAN
=head2 new()
Usage : new Audio::Radio::V4L
Purpose : creates a new radio object
Returns : the new object
Argument : none
=cut
################################################## subroutine header end ##
sub new() {
my $class = shift;
my $self = bless {}, $class;
$self;
}
################################################ subroutine header begin ##
=head2 open()
Usage : $radio->open("/dev/radio")
Purpose : opens the radio-device, initializes values (max-freq, min-freq)
Returns : self
Argument : the device
Throws : croaks on problems
=cut
################################################## subroutine header end ##
sub open() {
my $self = shift;
my $devicename = shift || "/dev/radio";
my $devicenumber = shift;
(defined $devicenumber) || ($devicenumber = 0);
$self->{ _devicenumber } = $devicenumber;
$self->{ _fh } && $self->close();
open($self->{ _fh }, $devicename)
or croak "Could not open radio $devicename: $!";
$self->_initialize_values_from_device();
$self;
}
sub _initialize_values_from_device() {
my $self = shift;
# struct from linux/videodev.h
my $videotuner = pack("iZ32LLLss",$self->{ _devicenumber },"",0,0,0,0);
ioctl(
$self->{ _fh },
$self->_get_VIDIOCGTUNER,
$videotuner
);
$self->{ _vt } = $videotuner;
my @values = unpack("iZ32LLLss", $videotuner);
lib/Audio/Radio/V4L.pm view on Meta::CPAN
=head2 get_devicename()
Usage : $radio->get_devicename()
Returns : returns the devicename of the opened radio
Argument : none
=cut
################################################## subroutine header end ##
sub get_devicename() {
my $self = shift;
$self->{ _fh } or croak "No device opened!";
$self->{ _devicename };
}
################################################ subroutine header begin ##
=head2 get_freq_min()
Usage : $radio->get_freq_min()
Returns : the minimal supported frequency of the radio
Argument : none
=cut
################################################## subroutine header end ##
sub get_freq_min() {
my $self = shift;
$self->{ _fh } or croak "No device opened!";
$self->{ _rangelow } / $self->_get_frequency_factor();
}
################################################ subroutine header begin ##
=head2 get_freq_max()
Usage : $radio->get_freq_max()
Returns : the maximal supported frequency of the radio
Argument : none
=cut
################################################## subroutine header end ##
sub get_freq_max() {
my $self = shift;
$self->{ _fh } or croak "No device opened!";
$self->{ _rangehigh } / $self->_get_frequency_factor();
}
################################################ subroutine header begin ##
=head2 close()
Usage : $radio->close()
Purpose : closes the device
Returns : self
Argument : none
Throws : croaks on problems
=cut
################################################## subroutine header end ##
sub close() {
my $self = shift;
croak "No radio to close" unless $self->{ _fh };
close( $self->{ _fh } )
or croak "Could not close radio: $!";
delete $self->{ _fh };
$self;
}
################################################ subroutine header begin ##
=head2 set_frequency()
Usage : $radio->set_frequency( 106500 );
Purpose : sets the frequency of the device
Returns : self
Argument : the frequency in khz
=cut
################################################## subroutine header end ##
sub set_frequency() {
my $self = shift;
my $frequency = shift;
croak "Open the radio first!" unless $self->{ _fh };
ioctl(
$self->{ _fh },
$self->_get_VIDIOCSFREQ,
pack(
"L",
int( $frequency * $self->_get_frequency_factor() )
)
)
or croak "Could not set frequency: $!";
$self;
}
sub _get_VIDIOCSFREQ() {
return 0x4004760f;
# return __get_VIDIOCSFREQ();
}
#use Inline C => <<'END_OF_C';
# #include <linux/videodev.h>
# long __get_VIDIOCSFREQ() {
# return VIDIOCSFREQ;
# }
#
#END_OF_C
sub _get_VIDIOCGTUNER() {
return 0xC0347604;
# return __get_VIDIOCGTUNER();
}
#use Inline C => <<'END_OF_C';
# #include <linux/videodev.h>
# long __get_VIDIOCGTUNER() {
# return VIDIOCGTUNER;
# }
#
#END_OF_C
sub _get_VIDEO_TUNER_LOW() {
return 8;
# return __get_VIDEO_TUNER_LOW;
}
#use Inline C => <<'END_OF_C';
# #include <linux/videodev.h>
# long __get_VIDEO_TUNER_LOW() {
# return VIDEO_TUNER_LOW;
# }
#
#END_OF_C
sub _get_frequency_factor() {
my $self = shift;
$self->{ _deviceflags } & _get_VIDEO_TUNER_LOW() ?
16
: .016;
}
1;
#
=head1 BUGS
( run in 0.489 second using v1.01-cache-2.11-cpan-65fba6d93b7 )