Hi Evan,

I think the version I'm using is from the post below to the devel list (I got it a long time back but only got around to setting up df_xine for my matrox now). There was another post back in April to the users list saying there's an updated version here http://www.t3i.nl/ I tried that last night and got a traceback on what looks like an issue with v4l.py and python2.4 Anyway one of them should work for you. Let us know how you get on.

John

On Saturday, January 28, 2006, 3:54:23 AM, TheHog wrote:

> > Hi,

> > I'm looking for the tv.ivtv_basic_tv.py plugin. I found a reference on the
> > following page (a patch), but I cant find the plugin.

> > http://www.mail-archive.com/[email protected]/msg02305.html

> > It is not in svn. Where can I find it?

> > Thanks for your time,
> > Richard.


Try the attached xine tv plugin. It's based upon the ivtv_basic plugin IIRC but
never made it into an official release. Put it in your tv/plugins dir and
Activate it with plugin.activate('tv.ivtv_xine_tv') in local_conf.py. Oh and it
does timeshifting as well.


   /Robert

Evan Hisey wrote:
John-
  I missed that plugin. Where did you find it? it is one of the only
features that tivo does my freevo box can't

Evan

On 8/15/06, John Molohan <[EMAIL PROTECTED]> wrote:
Hi all,

I'm just wondering if anyone is using the live pause feature with the
ivtv_xine_tv plugin? I tried it out last night and it works a treat in
1.5.3. It's not much publicised
and in fact I'm not even sure it's in svn for 1.5. If you are using it
do you find any issues with it?

 From what I understand xine can pause from dvb input in the same
manner. Can you do this in 1.5.x? Does anyone use it?

I'd like to advertise the fact that 1.5.x can pause live tv and stick
something up on the site so I want to make sure I have all the details
first. I see there was an article on newsforge/linux.com that gave a
massive surge of traffic to freevo.org. I want to make sure that users
get the right info from the site if something like this happens again.

John

-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
Freevo-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/freevo-users


-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
Freevo-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/freevo-users
import config

import time, os
import threading
import signal
import skin


import util    # Various utilities
from event import *
import osd     # The OSD class, used to communicate with the OSD daemon
import rc      # The RemoteControl class.
import childapp # Handle child applications
import tv.epg_xmltv as epg # The Electronic Program Guide
import tv.ivtv as ivtv
import plugin

#import event as em 
from tv.channels import FreevoChannels


from event import *

import plugin

# Set to 1 for debug output
DEBUG = config.DEBUG

TRUE = 1
FALSE = 0


# Create the OSD object
osd = osd.get_singleton()

class PluginInterface(plugin.Plugin):
    """
    Plugin to watch tv with xine.
    """
    def __init__(self):
        plugin.Plugin.__init__(self)

        plugin.register(IVTV_TV(), plugin.TV)


class IVTV_TV:

    __muted    = 0
    __igainvol = 0
    
    def __init__(self):
        self.thread = Xine_Thread()
        self.thread.setDaemon(1)
        self.thread.start()
        self.tuner_chidx = 0    # Current channel, index into config.TV_CHANNELS
        self.app_mode = 'tv'
        self.app       = None
        self.videodev = None
        self.fc = FreevoChannels() 
        self.current_vg = None 


        
    def TunerSetChannel(self, tuner_channel):
        for pos in range(len(config.TV_CHANNELS)):
            channel = config.TV_CHANNELS[pos]
            if channel[2] == tuner_channel:
                self.tuner_chidx = pos
                return
        print 'ERROR: Cannot find tuner channel "%s" in the TV channel listing' 
% tuner_channel
        self.tuner_chidx = 0


    def TunerGetChannelInfo(self):
        '''Get program info for the current channel'''
        
        tuner_id = config.TV_CHANNELS[self.tuner_chidx][2]
        chan_name = config.TV_CHANNELS[self.tuner_chidx][1]
        chan_id = config.TV_CHANNELS[self.tuner_chidx][0]

        channels = epg.get_guide().GetPrograms(start=time.time(),
                                               stop=time.time(), 
chanids=[chan_id])

        if channels and channels[0] and channels[0].programs:
            start_s = time.strftime('%H:%M', 
time.localtime(channels[0].programs[0].start))
            stop_s = time.strftime('%H:%M', 
time.localtime(channels[0].programs[0].stop))
            ts = '(%s-%s)' % (start_s, stop_s)
            prog_info = '%s %s' % (ts, channels[0].programs[0].title)
        else:
            prog_info = 'No info'
            
        return tuner_id, chan_name, prog_info


    def TunerGetChannel(self):
        return config.TV_CHANNELS[self.tuner_chidx][2]


    def TunerNextChannel(self):
        self.tuner_chidx = (self.tuner_chidx+1) % len(config.TV_CHANNELS)


    def TunerPrevChannel(self):
        self.tuner_chidx = (self.tuner_chidx-1) % len(config.TV_CHANNELS)

        
    def Play(self, mode, tuner_channel=None, channel_change=0):

        print 'PLAY CHAN: %s' % tuner_channel

        if tuner_channel != None:
            
            try:
                self.TunerSetChannel(tuner_channel)
            except ValueError:
                pass

        if not tuner_channel: 
            tuner_channel = self.fc.getChannel()
            print 'PLAY CHAN: %s' % tuner_channel

        vg = self.current_vg = self.fc.getVideoGroup(tuner_channel) 
        print 'PLAY GROUP: %s' % vg.desc

        if mode == 'tv':                
         if vg.group_type == 'ivtv':
            ivtv_dev = ivtv.IVTV(vg.vdev)
            ivtv_dev.init_settings()
            ivtv_dev.setinput(vg.input_num)
            ivtv_dev.print_settings()
            self.fc.chanSet(tuner_channel)

            command = '%s -V xxmc --no-splash --no-lirc --stdctl 
pvr:///media/recording/livepause' % config.XINE_COMMAND

        else:
            print 'Mode "%s" is not implemented' % mode  # XXX ui.message()
            return


        self.mode = mode

        # XXX Mixer manipulation code.
        # TV is on line in
        # VCR is mic in
        # btaudio (different dsp device) will be added later
        mixer = plugin.getbyname('MIXER')
        
        if mixer and config.MAJOR_AUDIO_CTRL == 'VOL':
            mixer_vol = mixer.getMainVolume()
            mixer.setMainVolume(0)
        elif mixer and config.MAJOR_AUDIO_CTRL == 'PCM':
            mixer_vol = mixer.getPcmVolume()
            mixer.setPcmVolume(0)

        # Start up the TV task
        self.thread.mode = 'play'
        self.thread.command = command
        self.thread.mode_flag.set()
        
        self.prev_app = rc.app()
        rc.app(self)

        if osd.focused_app():
            osd.focused_app().hide()

        # Suppress annoying audio clicks
        time.sleep(0.4)
        # XXX Hm.. This is hardcoded and very unflexible.
        if mixer and mode == 'vcr':
            mixer.setMicVolume(config.VCR_IN_VOLUME)
        elif mixer:
            mixer.setLineinVolume(config.TV_IN_VOLUME)
            mixer.setIgainVolume(config.TV_IN_VOLUME)
            
        if mixer and config.MAJOR_AUDIO_CTRL == 'VOL':
            mixer.setMainVolume(mixer_vol)
        elif mixer and config.MAJOR_AUDIO_CTRL == 'PCM':
            mixer.setPcmVolume(mixer_vol)

        if DEBUG: print '%s: started %s app' % (time.time(), self.mode)

        
    def Stop(self):
        mixer = plugin.getbyname('MIXER')
        mixer.setLineinVolume(0)
        mixer.setMicVolume(0)
        mixer.setIgainVolume(0) # Input on emu10k cards.

        self.thread.mode = 'stop'
        self.thread.mode_flag.set()

        rc.app(self.prev_app)
        if osd.focused_app():
           osd.focused_app().show() 
           
        while self.thread.mode == 'stop':
            time.sleep(0.05)
        print 'stopped %s app' % self.mode
        


    def eventhandler(self, event, menuw=None):
        print '%s: %s app got %s event' % (time.time(), self.mode, event)
        s_event = '%s' % event
            
        if event == STOP or event == PLAY_END:
            self.Stop()
            rc.post_event(PLAY_END)
            return TRUE
        
        if event == PAUSE or event == PLAY:
            self.thread.app.write('pause\n')
            return True

        if event == STOP:
            self.thread.app.write('quit\n')
            for i in range(10):
                if self.thread.mode == 'idle':
                    break
                time.sleep(0.3)
            else:
                # sometimes xine refuses to die
                self.Stop()
            return TRUE

     
        if event in [ TV_CHANNEL_UP, TV_CHANNEL_DOWN] or 
s_event.startswith('INPUT_'):
            if event == TV_CHANNEL_UP:
                nextchan = self.fc.getNextChannel()
            elif event == TV_CHANNEL_DOWN:
                nextchan = self.fc.getPrevChannel()
            else:
                chan = int( s_event[6] )
                nextchan = self.fc.getManChannel(chan)
                        
            print 'NEXT CHAN: %s' % nextchan
            nextvg = self.fc.getVideoGroup(nextchan)
            print 'NEXT GROUP: %s' % nextvg.desc

            if self.current_vg != nextvg:
                self.Stop(channel_change=1)
                self.Play('tv', nextchan)
                return TRUE

            if self.mode == 'vcr':
                return   

            elif self.current_vg.group_type == 'ivtv':
                self.fc.chanSet(nextchan)
                self.thread.app.write('seek 999999 0\n')
            else:
                freq_khz = self.fc.chanSet(nextchan, app=self.thread.app)
                new_freq = '%1.3f' % (freq_khz / 1000.0)
                self.thread.app.write('tv_set_freq %s\n' % new_freq)
        
            self.current_vg = self.fc.getVideoGroup(self.fc.getChannel())
            
            # Display a channel changed message  (mplayer ?  api osd xine ?) 
            tuner_id, chan_name, prog_info = self.fc.getChannelInfo()
            now = time.strftime('%H:%M')
            msg = '%s %s (%s): %s' % (now, chan_name, tuner_id, prog_info)
            cmd = 'osd_show_text "%s"\n' % msg
            self.thread.app.write(cmd)
            return TRUE
            

        if event == SEEK:
            pos = int(event.arg)
            if pos < 0:
                action='SeekRelative-'
                pos = 0 - pos
            else:
                action='SeekRelative+'
            if pos <= 15:
                pos = 15
            elif pos <= 30:
                pos = 30
            else:
                pos = 30
            self.thread.app.write('%s%s\n' % (action, pos))
            return TRUE 
        
        if event == TOGGLE_OSD:
            self.thread.app.write('OSDStreamInfos\n')
            return True
                   
# ======================================================================

class XineApp(childapp.ChildApp):
    """
    class controlling the in and output from the xine process
    """

    def __init__(self, app, item):
        self.item = item
        childapp.ChildApp.__init__(self, app)
        self.exit_type = None
        
    def kill(self):
        # Use SIGINT instead of SIGKILL to make sure Xine shuts
        # down properly and releases all resources before it gets
        # reaped by childapp.kill().wait()
        childapp.ChildApp.kill(self, signal.SIGINT)


# ======================================================================

class Xine_Thread(threading.Thread):
    """
    Thread to wait for a xine command to play
    """

    def __init__(self):
        threading.Thread.__init__(self)
        
        self.mode      = 'idle'
        self.mode_flag = threading.Event()
        self.command   = ''
        self.app       = None
        self.item  = None

        
    def run(self):
        while 1:
            if self.mode == 'idle':
                self.mode_flag.wait()
                self.mode_flag.clear()

            elif self.mode == 'play':
                if DEBUG:
                    print 'Xine_Thread.run(): Started, cmd=%s' % self.command
                    
                self.app = XineApp(self.command, self.item)

                while self.mode == 'play' and self.app.isAlive():
                    time.sleep(0.1)

                self.app.kill()

                if self.mode == 'play':
                    if DEBUG: print 'posting play_end'
                    rc.post_event(PLAY_END)
                        
                if DEBUG:
                    print 'Xine_Thread.run(): Stopped'

                self.mode = 'idle'
                
            else:
                self.mode = 'idle'
-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
Freevo-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/freevo-users

Reply via email to