Andrew G. Wilson wrote:
it's way more solid, doesn't fall over on bad data like myth does, and from its CPU usage, it seems to be using the HW mpeg decoder on EPIA - so I'm quite tempted to use it.

mplayer doesn't like bad data either but it does work with radio which xine doesn't.


But.. as xine is primarily a video player rather than a TV app, it's not obvious how to change channels!

Good question. The only way I found is with a playlist but it's a bit useless. So I wrote a little perl script using Xdialog; you have to exit xine to change channels - not great for channel hopping but it works. I assume it's an interim solution until xine is completed.


Can anyone who's using xine spend 5 minutes explaining how to set it up to do channel changing,

See above.


volume adjustment,

g for GUI and drive it like a video.

pause/ff/rew,

on live tv?

and aspect
changing?

don't know - f is good for full screen mode.


Script attached - it's only small so I hope bad nettiquette is forgiven.

Dick


The best way is with Xine. You can do xine dvb://1 where the number references the line in channels.conf.

You need a channels.conf in ~/.xine. You can use scan to create it.

Alternatively you can use tzap to select a channel and in another xterm cat /dev/dvb/adaptor0/dvr0 to a file or redirect it to mplayer. In this case the channels.conf needs to be in ~/.tzap. I use symbolic link so there's only one channels.conf.

Dick


#!/usr/bin/perl

# xtv - Selects TV channel
# Copyright (C) 2004 R.J.Middleton
# e-mail: [EMAIL PROTECTED]
# 
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.

# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.

# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.

sub help_info { print <<"End of Info;" ; }
############################################################################
#                                    
# File Name ......................... xtv
# Written By ........................ Dick Middleton
# Date .............................. 04-Feb-04
#
# Description : Reads ~/.tzap/channels.conf to get list of channel names
#
############################################################################
End of Info;

@_ = split('/', $0);            # extract program name
$pn = pop(@_);                  # basename
$dr = join('/', @_);            # dirname

use Getopt::Std;
use Proc::Simple;
use Proc::Killfam;

$option_set = "h";              # valid option characters
&getopts($option_set) || die "$pn aborted: Incorrect option\n";
&help_info && exit(0) if $opt_h;

# chop($today = `date +%d-%b-%y`); # today's date

$chanfile = "$ENV{HOME}/.tzap/channels.conf";

sub MPLAYER{1;};
sub XINE{0;};
sub DEBUG{0;};

@players = qw(Xine Mplayer);
@prog =qw(TV Radio);


#BBC ONE 
Scot:570166670:INVERSION_OFF:BANDWIDTH_8_MHZ:FEC_3_4:FEC_3_4:QAM_16:TRANSMISSION_MODE_2K:GUARD_INTERVAL_1_32:HIERARCHY_NONE:201:202:4220

open(ZAP, $chanfile) || die "$pn failed to open file $chanfile: $!\n";

while (<ZAP>) {
    ($ident, $frq, $inv, $bw, $fec1, $fec2, $mod, $mode, $grd, $hrc, $vpid, $apid, 
$flag) = split(/:/);
    if ($apid) {                # must have audio
        my $type = !$vpid;
        push(@chanlist, { 
            row => $row,        # row number of file
            ident => $ident,    # station name
            type => $type       # false = tv, true = radio
            });
    }
    $row++;
}

close(ZAP);

sub listize {
    my ($num) = 1;
    my ($list, $chan);

    foreach $chan (@_) {
        $list .= qq( "$num" "$chan" off );
        $num++;
    }
    $list;
}

sub get_ident_list {
    my ($type) = @_;
    my (@list);
    @stations = ();

    foreach my $chp (@chanlist) {
        if ($$chp{type} == $type) {
            push(@stations, $chp);
            push(@list, $$chp{ident});
        }
    }
    @list;
}

if ($pn =~ /tv/) {
    $type = 0;
    $plist = listize(@players);
    $pargs = qq( --radiolist "Player" 0x0 3  $plist);
}
else {
    $type = 1;
    $player = $players[MPLAYER];
}
@chans = get_ident_list($type);
$clist = listize(@chans);

$title = qq(Freeview $prog[$type] Channels);
$cargs = qq( --radiolist "$title" 0x0 10 $clist);
$xargs = qq( --stdout --no-tags);

@sel = `Xdialog $xargs $pargs $cargs`;
chomp @sel;

$sel = shift(@sel);

unless ($type) {                # Choose player

    exit unless $sel;

    $sel--;
    $player = $players[$sel];

    $sel = shift(@sel);         # Selected program
}


while ($sel > 0 && $sel < $#chans) {
    my $chan;
    $sel--;

    if ($player eq $players[MPLAYER]) {
        $chan = $chans[$sel];
        if (DEBUG) {
            print "mplayer $chan\n";
        }
        else {
            my $tzap = Proc::Simple->new();

            $tzap->start(qq(tzap -r "$chan" > /dev/null));

            system(qq(mplayer -really-quiet - < /dev/dvb/adapter0/dvr0 > /dev/null 2> 
/dev/null));
            killfam 'TERM', ($tzap->pid());
            wait;
        }
    }
    elsif ($player eq $players[XINE]) {
        $chan = $stations[$sel]->{row};
        if (DEBUG) {
            print "xine chan: $chan\n";
        }
        else {
            `xine -p=h --no-splash  dvb://$chan`;
        }
    }

    $sel = `Xdialog $xargs $cargs`;
    chomp $sel;
    
}

# Local Variables:
# mode:perl
# End:
#                           ===//===

Reply via email to