Linux-DVB-DVBT
view release on metacpan or search on metacpan
lib/Linux/DVB/DVBT.pm view on Meta::CPAN
print "---------\n";
foreach my $tsid (sort {int($a) <=> int($b)} keys %{$scan_info_href->{'tsids'}})
{
print "\n TSID $tsid\n" ;
foreach my $line (@{$scan_info_href->{'tsids'}{$tsid}{'comments'}})
{
print " $line\n" ;
}
}
print "\n";
print "Channel Info\n";
print "------------\n";
foreach my $chan (sort keys %{$scan_info_href->{'chans'}})
{
print "\n $chan\n" ;
foreach my $line (@{$scan_info_href->{'chans'}{$chan}{'comments'}})
{
print " $line\n" ;
}
}
print "\n";
}
# callback
if ($self->scan_cb_end)
{
$callback_info{'estimated_percent'} = 100 ;
$callback_info{'total_freqs'} = scalar(keys %freq_list) ;
$callback_info{'done_freqs'} = scalar(keys %freq_list) ;
$callback_info{'scan_info'} = $self->tuning() ;
$callback_info{'current_freq'} = 0 ;
my $cb = $self->scan_cb_end() ;
&$cb(\%callback_info) ;
}
## return tuning settings
return $self->tuning() ;
}
#============================================================================================
=back
=head3 TUNING
=over 4
=cut
#============================================================================================
#----------------------------------------------------------------------------
=item B<is_busy()>
Returns 0 is the currently selected adapter frontend is not busy; 1 if it is.
=cut
sub is_busy
{
my $self = shift ;
my $is_busy = dvb_is_busy($self->{dvb}) ;
return $is_busy ;
}
#----------------------------------------------------------------------------
=item B<set_frontend(%params)>
Tune the frontend to the specified frequency etc. HASH %params contains:
'frequency'
'inversion'
'bandwidth'
'code_rate_high'
'code_rate_low'
'modulation'
'transmission'
'guard_interval'
'hierarchy'
'timeout'
'tsid'
(If you don't know what these parameters should be set to, then I recommend you just use the L</select_channel($channel_name)> method)
Returns 0 if ok; error code otherwise
=cut
sub set_frontend
{
my $self = shift ;
my (%params) = @_ ;
# hardware closed?
if ($self->dvb_closed())
{
# Raise an error
return $self->handle_error("DVB tuner has been closed") ;
}
# Set up the frontend
my $rc = dvb_tune($self->{dvb}, {%params}) ;
print STDERR "dvb_tune() returned $rc\n" if $DEBUG ;
# If tuning went ok, then save params
#
# Currently:
# -11 = Device busy
# -15 / -16 = Failed to tune
#
if ($rc == 0)
{
$self->frontend_params( {%params} ) ;
}
return $rc ;
}
#----------------------------------------------------------------------------
=item B<set_demux($video_pid, $audio_pid, $subtitle_pid, $teletext_pid)>
Selects a particular video/audio stream (and optional subtitle and/or teletext streams) and sets the
demultiplexer to those streams (ready for recording).
(If you don't know what these parameters should be set to, then I recommend you just use the L</select_channel($channel_name)> method)
Returns 0 for success; error code otherwise.
=cut
sub set_demux
{
my $self = shift ;
my ($video_pid, $audio_pid, $subtitle_pid, $teletext_pid, $tsid, $demux_params_href) = @_ ;
print STDERR "set_demux( <$video_pid>, <$audio_pid>, <$teletext_pid> )\n" if $DEBUG ;
my $error = 0 ;
if ($video_pid && !$error)
{
$error = $self->add_demux_filter($video_pid, "video", $tsid, $demux_params_href) ;
}
if ($audio_pid && !$error)
{
$error = $self->add_demux_filter($audio_pid, "audio", $tsid, $demux_params_href) ;
}
if ($teletext_pid && !$error)
{
$error = $self->add_demux_filter($teletext_pid, "teletext", $tsid, $demux_params_href) ;
}
if ($subtitle_pid && !$error)
{
$error = $self->add_demux_filter($subtitle_pid, "subtitle", $tsid, $demux_params_href) ;
}
return $error ;
}
#----------------------------------------------------------------------------
=item B<select_channel($channel_name)>
Tune the frontend & the demux based on $channel_name.
This method uses a "fuzzy" search to match the specified channel name with the name broadcast by the network.
The case of the name is not important, and neither is whitespace. The search also checks for both numeric and
name instances of a number (e.g. "1" and "one").
lib/Linux/DVB/DVBT.pm view on Meta::CPAN
Note that some tuner hardware may not support some (or any) of the above measurements.
=cut
sub tsid_signal_quality
{
my $self = shift ;
my ($tsid) = @_ ;
# hardware closed?
if ($self->dvb_closed())
{
# Raise an error
return $self->handle_error("DVB tuner has been closed") ;
}
# ensure we have the tuning info
my $tuning_href = $self->get_tuning_info() ;
if (! $tuning_href)
{
return $self->handle_error("Unable to get tuning information") ;
}
# check/create list of TSIDs
my @tsids ;
if ($tsid)
{
# check it
if (!exists($tuning_href->{'ts'}{$tsid}))
{
# Raise an error
return $self->handle_error("Unknown TSID $tsid") ;
}
push @tsids, $tsid ;
}
else
{
# create
@tsids = keys %{$tuning_href->{'ts'}} ;
}
## handle errors
my $errmode = $self->{errmode} ;
$self->{errmode} = 'message' ;
## get info
my %info ;
foreach my $tsid (@tsids)
{
## Tune frontend
my $frontend_params_href = $tuning_href->{'ts'}{$tsid} ;
my $error_code ;
if ($error_code = $self->set_frontend(%$frontend_params_href, 'timeout' => $self->timeout))
{
print STDERR "set_frontend() returned $error_code\n" if $DEBUG ;
$info{$tsid}{'error'} = "Unable to tune frontend. " . dvb_error_str() ;
if ($info{$tsid}{'error'} =~ /busy/i)
{
## stop now since the device is in use
last ;
}
}
else
{
## get info
$info{$tsid} = $self->signal_quality($tsid) ;
$info{$tsid}{'error'} = undef ;
}
}
## restore error handling
$self->{errmode} = $errmode ;
## return info
return %info ;
}
#============================================================================================
=back
=head3 RECORDING
=over 4
=cut
#============================================================================================
#----------------------------------------------------------------------------
=item B<record($file, $duration)>
(New version that uses the underlying multiplex recording methods).
Streams the selected channel information (see L</select_channel($channel_name)>) into the file $file for $duration.
The duration may be specified either as an integer number of minutes, or in HH:MM format (for hours & minutes), or in
HH:MM:SS format (for hours, minutes, seconds).
Note that (if possible) the method creates the directory path to the file if it doersn't already exist.
=cut
sub record
{
my $self = shift ;
my ($file, $duration) = @_ ;
print STDERR "record($file, $duration)" if $DEBUG ;
## need filename
return $self->handle_error("No valid filename specified") unless ($file) ;
( run in 1.597 second using v1.01-cache-2.11-cpan-0d23b851a93 )