class TunerControl: """ Class that controls the tuner device """ def __init__(self, xine): """ TunerControl constructor """ self.xine = xine self.ivtv_init = False self.fc = FreevoChannels() self.curr_channel = None self.embed = None self.stack = [ ] def _kill_(self): """ TunerControl destructor """ if self.embed: ivtv_dev.setvbiembed(self.embed) def Stop(self): """ stop """ self.ivtv_init = False def GetChannelName(self): """ get channel info """ tuner_id, chan_name, prog_info = self.fc.getChannelInfo(showtime=False) return (chan_name) def GetProgramName(self): """ get channel name """ tuner_id, chan_name, prog_info = self.fc.getChannelInfo(showtime=True) return prog_info def GetInfo(self): """ get channel info """ tuner_id, chan_id, chan_name, start_t, stop_t, prog_s = self.fc.getChannelInfoRaw() return (start_t, stop_t, prog_s) def ShowInfo(self): """ show channel info """ if self.curr_channel is not None: tuner_id, chan_name, prog_info = self.fc.getChannelInfo(showtime=False) self.xine.ShowMessage(msg = '%s: %s' % (chan_name, prog_info)) def PushChannel(self): """ push the current channel on the channel stack """ if self.curr_channel is not None: self.stack.append(self.curr_channel) logger.debug('TunerControl: Pushed channel %s', self.curr_channel) logger.debug('TunerControl: Channel stack = %s', self.stack) def UnpushChannel(self): """ remove the top channel from the channel stack """ if len(self.stack) == 0: logger.debug('TunerControl: Channel stack is empty') else: channel = self.stack.pop() logger.debug('TunerControl: Unpushed channel %s', channel) logger.debug('TunerControl: Channel stack = %s', self.stack) def PopChannel(self): """ pop the top channel from the channel stack and switch channel """ if len(self.stack) == 0: logger.debug('TunerControl: Channel stack is empty') else: channel = self.stack.pop() logger.debug('TunerControl: Popped channel %s', channel) self.SetVideoGroup(channel) logger.debug('TunerControl: Channel stack = %s', self.stack) def SwapChannel(self): """swap the current display channel and the top of the stack channel """ if self.curr_channel is not None: toswap = self.curr_channel if len(self.stack) == 0: logger.debug('TunerControl: Channel stack is empty') else: channel = self.stack.pop() logger.debug('TunerControl: Popped channel %s', channel) self.SetVideoGroup(channel) self.stack.append(toswap) logger.debug('TunerControl: Pushed channel %s', toswap) logger.debug('TunerControl: Channel stack = %s', self.stack) def SetChannelByName(self, channel=None, clearstack=False): """ tune to a new channel by name """ last_channel = self.curr_channel next_channel = None channel_index = -1 if clearstack: self.stack = [ ] self.curr_channel = None if channel is None: # get a channel next_channel = self.fc.getChannel() try: # lookup the channel name in TV_CHANNELS for pos in range(len(config.TV_CHANNELS)): entry = config.TV_CHANNELS[pos] if str(channel) == str(entry[2]): channel_index = pos next_channel = channel break except ValueError: pass if next_channel is None: logger.warning('TunerControl: Cannot find tuner channel %r in the TV channel listing', channel) else: self.SetChannelByIndex(channel_index + 1) def SetChannelByIndex(self, channel, tvlike=0): """ tune to a channel by index from the TV_CHANNELS list """ next_channel = self.fc.getManChannel(channel, tvlike) logger.debug('TunerControl: Explicit channel selection by index = %r', next_channel) self.PushChannel() self.SetVideoGroup(next_channel) def SetChannelByNumber(self, channel): """ tune to a channel by actual channel number """ logger.debug('TunerControl: Explicit channel selection by number = %r', channel) self.PushChannel() self.SetVideoGroup(channel) def NextChannel(self): """ jump to the next channel in the TV_CHANNELS list """ next_channel = self.fc.getNextChannel() logger.debug('TunerControl: Next channel selection = %r', next_channel) self.PushChannel() self.SetVideoGroup(next_channel) def PrevChannel(self): """ jump to the previous channel in the TV_CHANNELS list """ prev_channel = self.fc.getPrevChannel() logger.debug('TunerControl: Previous channel selection = %r', prev_channel) self.PushChannel() self.SetVideoGroup(prev_channel) def SetVideoGroup(self, channel): """ select a channel's video group and tune to that channel """ try: channel_num = int(channel) except ValueError: channel_num = 0 logger.debug('TunerControl: Channel: %r', channel) new_vg = self.fc.getVideoGroup(channel, True) logger.debug('TunerControl: Group: type=%r, desc=%r', new_vg.group_type, new_vg.desc) logger.debug('TunerControl: Input: type=%r, num=%r', new_vg.input_type, new_vg.input_num) if new_vg.group_type != 'ivtv': logger.error('TunerControl: VideoGroup %s is not supported', new_vg) pop = AlertBox(text=_('This plugin only supports the ivtv video group!')) pop.show() return # check if videogroup switch is needed switch_vg = not self.ivtv_init or self.curr_channel is None or \ new_vg != self.fc.getVideoGroup(self.curr_channel, True) if switch_vg: # switch to a different video group logger.info('TunerControl: Set VideoGroup: %s', new_vg) ivtv_dev = ivtv.IVTV(new_vg.vdev) ivtv_dev.init_settings() self.xine.SetInput(new_vg.input_num) # disable embedded vbi data self.embed = ivtv_dev.getvbiembed() ivtv_dev.setvbiembed(0) if not self.ivtv_init: # set channel directly on v4l device, if channel is not negative if channel_num >= 0: self.fc.chanSet(channel, True) self.curr_channel = channel self.ivtv_init = True else: # set channel through xine process freq = self.fc.chanSet(channel, True, 'ivtv_xine_tv', None) if freq != 0: # channel has frequency logger.debug('TunerControl: Set frequency: %s', freq) self.xine.SetFrequency(freq) else: # channel has no frequency logger.debug('TunerControl: Channel has no frequency') self.curr_channel = channel self.xine.SeekEnd() self.ShowInfo() self.SetAudioByChannel(channel) def SetAudioByChannel(self, channel=-1): """ Set the PVR sound level This is a mix : The base volume is set by the avol option in each TV_VIDEO_GROUP. The value is hardware dependant. seems bo be between 0 and 65535. If this value is missing in the tv_video_group, that sub does nothing If the value is present, the actual audio value is this value time the 6th field in TV_CHANNELS (expressed in % ) """ try: # lookup the channel name in TV_CHANNELS for pos in range(len(config.TV_CHANNELS)): entry = config.TV_CHANNELS[pos] if str(channel) == str(entry[2]): channel_index = pos break except ValueError: pass logger.debug('SetAudioByChannel: Channel: %r TV_CHANNEL pos(%d)', channel, channel_index) vg = self.fc.getVideoGroup(channel, True) try: ivtv_avol = vg.avol except AttributeError: ivtv_avol = 0 if ivtv_avol <= 0: logger.debug('SetAudioByChannel: The tv_video group for %r doesn\'t set the volume', channel) else: # Is there a specific volume level in TV_CHANNELS_VOLUME ivtv_dev = ivtv.IVTV(vg.vdev) avol_percent = 100 try: # lookup the channel name in TV_CHANNELS for pos in range(len(config.TV_CHANNELS_VOLUME)): if config.TV_CHANNELS_VOLUME[pos][0] == config.TV_CHANNELS[channel_index][0]: avol_percent = config.TV_CHANNELS_VOLUME[pos][1] break except: pass try: avol_percent = int(avol_percent) except ValueError: avol_percent = 100 avol = int(ivtv_avol * avol_percent / 100) if avol > 65535: avol = 65535 if avol < 0: avol = 0 logger.debug('SetAudioByChannel: Current PVR Sound level is : %s', ivtv_dev.getctrl(0x00980905)) logger.debug('SetAudioByChannel: Set the PVR Sound Level to : %s (%s * %s)', avol, ivtv_avol, avol_percent) ivtv_dev.setctrl(0x00980905, avol) logger.debug('SetAudioByChannel: New PVR Sound level is : %s', ivtv_dev.getctrl(0x00980905))
class TunerControl: """ Class that controls the tuner device """ def __init__(self, xine): """ TunerControl constructor """ self.xine = xine self.ivtv_init = False self.fc = FreevoChannels() self.curr_channel = None self.embed = None self.stack = [] self.timer = OneShotTimer(self.timer_handler) def _kill_(self): """ TunerControl destructor """ if self.embed: ivtv_dev.setvbiembed(self.embed) def program_timer(self): """ program the timer to start of next show on the current channel """ _debug_('TunerControl: Program timer') # set timer to mark the next program start_t, stop_t, prog_s = self.GetInfo() if stop_t > 0: stop_t = stop_t - time.time() self.timer.start(stop_t) _debug_( 'TunerControl: Timer set to mark next program in: %s seconds' % stop_t) else: _debug_('TunerControl: Timer not set, stop_t not available') self.ShowInfo() def timer_handler(self): """ handle timer event """ _debug_('TunerControl: Timer event, mark new show') self.xine.SetMark() self.program_timer() def Stop(self): """ stop """ self.ivtv_init = False def GetName(self): """ get channel name """ tuner_id, chan_name, prog_info = self.fc.getChannelInfo(showtime=True) return prog_info def GetInfo(self): """ get channel info """ tuner_id, chan_id, chan_name, start_t, stop_t, prog_s = self.fc.getChannelInfoRaw( ) return (start_t, stop_t, prog_s) def ShowInfo(self): """ show channel info """ if self.curr_channel != None: # show channel info #vg = self.fc.getVideoGroup(self.curr_channel, True) tuner_id, chan_name, prog_info = self.fc.getChannelInfo( showtime=False) self.xine.ShowMessage(msg='%s: %s' % (chan_name, prog_info)) def PushChannel(self): """ push the current channel on the channel stack """ if self.curr_channel != None: self.stack.append(self.curr_channel) _debug_('TunerControl: Pushed channel %s' % self.curr_channel) _debug_('TunerControl: Channel stack = %s' % self.stack) def UnpushChannel(self): """ remove the top channel fromthe channel stack """ if len(self.stack) == 0: _debug_('TunerControl: Channel stack is empty') else: channel = self.stack.pop() _debug_('TunerControl: Unpushed channel %s' % channel) _debug_('TunerControl: Channel stack = %s' % self.stack) def PopChannel(self): """ pop the top channel from the channel stack and switch channel """ if len(self.stack) == 0: _debug_('TunerControl: Channel stack is empty') else: channel = self.stack.pop() _debug_('TunerControl: Popped channel %s' % channel) self.SetVideoGroup(channel) _debug_('TunerControl: Channel stack = %s' % self.stack) def SetChannelByName(self, channel=None, clearstack=False): """ tune to a new channel by name """ last_channel = self.curr_channel next_channel = None channel_index = -1 if clearstack == True: self.stack = [] self.curr_channel = None if channel == None: # get a channel next_channel = self.fc.getChannel() try: # lookup the channel name in TV_CHANNELS for pos in range(len(config.TV_CHANNELS)): entry = config.TV_CHANNELS[pos] if str(channel) == str(entry[2]): channel_index = pos next_channel = channel break except ValueError: pass if (next_channel == None): _debug_( 'TunerControl: Cannot find tuner channel %r in the TV channel listing' % channel, DWARNING) else: self.SetChannelByIndex(channel_index + 1) def SetChannelByIndex(self, channel): """ tune to a channel by index from the TV_CHANNELS list """ # tune channel by index next_channel = self.fc.getManChannel(channel) _debug_('TunerControl: Explicit channel selection by index = %r' % next_channel) self.PushChannel() self.SetVideoGroup(next_channel) def SetChannelByNumber(self, channel): """ tune to a channel by actual channel number """ # tune channel by number _debug_('TunerControl: Explicit channel selection by number = %r' % channel) self.PushChannel() self.SetVideoGroup(channel) def NextChannel(self): """ jump to the next channel in the TV_CHANNELS list """ next_channel = self.fc.getNextChannel() _debug_('TunerControl: Next channel selection = %r' % next_channel) self.PushChannel() self.SetVideoGroup(next_channel) def PrevChannel(self): """ jump to the previous channel in the TV_CHANNELS list """ prev_channel = self.fc.getPrevChannel() _debug_('TunerControl: Previous channel selection = %r' % prev_channel) self.PushChannel() self.SetVideoGroup(prev_channel) def SetVideoGroup(self, channel): """ select a channel's video group and tune to that channel """ _debug_('TunerControl: Channel: %r' % channel) new_vg = self.fc.getVideoGroup(channel, True) _debug_('TunerControl: Group: type=%r, desc=%r' % (new_vg.group_type, new_vg.desc)) _debug_('TunerControl: Input: type=%r, num=%r' % (new_vg.input_type, new_vg.input_num)) if (new_vg.group_type != 'ivtv'): _debug_( 'TunerControl: Video group %r is not supported' % new_vg.group_type, DERROR) pop = AlertBox( text=_('This plugin only supports the ivtv video group!')) pop.show() return # check if videogroup switch is needed switch_vg = (self.ivtv_init == False) or \ (self.curr_channel == None) or \ (new_vg != self.fc.getVideoGroup(self.curr_channel, True)) if switch_vg == True: # switch to a different video group _debug_('TunerControl: Set video group: %s' % new_vg.vdev, DINFO) ivtv_dev = ivtv.IVTV(new_vg.vdev) ivtv_dev.init_settings() self.xine.SetInput(new_vg.input_num) # disable embedded vbi data self.embed = ivtv_dev.getvbiembed() ivtv_dev.setvbiembed(0) if self.ivtv_init == False: # set channel directly on v4l device self.ivtv_init = True self.fc.chanSet(channel, True) self.curr_channel = channel if config.XINE_TV_LIVE_RECORD: # video stream is marked implicitly # start timer to mark next show self.program_timer() else: self.ShowInfo() else: # set channel through xine process # get channel frequency freq = self.fc.chanSet(channel, True, 'ivtv_xine_tv', None) if freq != 0: # channel has frequency _debug_('TunerControl: Set frequency: %s' % freq) self.xine.SetFrequency(freq) else: # channel has no frequency _debug_('TunerControl: Channel has no frequency') self.curr_channel = channel if config.XINE_TV_LIVE_RECORD: # explicitly mark video stream self.xine.SetMark() # start timer to mark next show self.program_timer() else: self.xine.SeekEnd() self.ShowInfo()
class TunerControl: """ Class that controls the tuner device """ def __init__(self, xine): """ TunerControl constructor """ self.xine = xine self.ivtv_init = False self.fc = FreevoChannels() self.curr_channel = None self.embed = None self.stack = [] def _kill_(self): """ TunerControl destructor """ if self.embed: ivtv_dev.setvbiembed(self.embed) def Stop(self): """ stop """ self.ivtv_init = False def GetChannelName(self): """ get channel info """ tuner_id, chan_name, prog_info = self.fc.getChannelInfo(showtime=False) return (chan_name) def GetProgramName(self): """ get channel name """ tuner_id, chan_name, prog_info = self.fc.getChannelInfo(showtime=True) return prog_info def GetInfo(self): """ get channel info """ tuner_id, chan_id, chan_name, start_t, stop_t, prog_s = self.fc.getChannelInfoRaw( ) return (start_t, stop_t, prog_s) def ShowInfo(self): """ show channel info """ if self.curr_channel is not None: tuner_id, chan_name, prog_info = self.fc.getChannelInfo( showtime=False) self.xine.ShowMessage(msg='%s: %s' % (chan_name, prog_info)) def PushChannel(self): """ push the current channel on the channel stack """ if self.curr_channel is not None: self.stack.append(self.curr_channel) logger.debug('TunerControl: Pushed channel %s', self.curr_channel) logger.debug('TunerControl: Channel stack = %s', self.stack) def UnpushChannel(self): """ remove the top channel from the channel stack """ if len(self.stack) == 0: logger.debug('TunerControl: Channel stack is empty') else: channel = self.stack.pop() logger.debug('TunerControl: Unpushed channel %s', channel) logger.debug('TunerControl: Channel stack = %s', self.stack) def PopChannel(self): """ pop the top channel from the channel stack and switch channel """ if len(self.stack) == 0: logger.debug('TunerControl: Channel stack is empty') else: channel = self.stack.pop() logger.debug('TunerControl: Popped channel %s', channel) self.SetVideoGroup(channel) logger.debug('TunerControl: Channel stack = %s', self.stack) def SwapChannel(self): """swap the current display channel and the top of the stack channel """ if self.curr_channel is not None: toswap = self.curr_channel if len(self.stack) == 0: logger.debug('TunerControl: Channel stack is empty') else: channel = self.stack.pop() logger.debug('TunerControl: Popped channel %s', channel) self.SetVideoGroup(channel) self.stack.append(toswap) logger.debug('TunerControl: Pushed channel %s', toswap) logger.debug('TunerControl: Channel stack = %s', self.stack) def SetChannelByName(self, channel=None, clearstack=False): """ tune to a new channel by name """ last_channel = self.curr_channel next_channel = None channel_index = -1 if clearstack: self.stack = [] self.curr_channel = None if channel is None: # get a channel next_channel = self.fc.getChannel() try: # lookup the channel name in TV_CHANNELS for pos in range(len(config.TV_CHANNELS)): entry = config.TV_CHANNELS[pos] if str(channel) == str(entry[2]): channel_index = pos next_channel = channel break except ValueError: pass if next_channel is None: logger.warning( 'TunerControl: Cannot find tuner channel %r in the TV channel listing', channel) else: self.SetChannelByIndex(channel_index + 1) def SetChannelByIndex(self, channel, tvlike=0): """ tune to a channel by index from the TV_CHANNELS list """ next_channel = self.fc.getManChannel(channel, tvlike) logger.debug('TunerControl: Explicit channel selection by index = %r', next_channel) self.PushChannel() self.SetVideoGroup(next_channel) def SetChannelByNumber(self, channel): """ tune to a channel by actual channel number """ logger.debug('TunerControl: Explicit channel selection by number = %r', channel) self.PushChannel() self.SetVideoGroup(channel) def NextChannel(self): """ jump to the next channel in the TV_CHANNELS list """ next_channel = self.fc.getNextChannel() logger.debug('TunerControl: Next channel selection = %r', next_channel) self.PushChannel() self.SetVideoGroup(next_channel) def PrevChannel(self): """ jump to the previous channel in the TV_CHANNELS list """ prev_channel = self.fc.getPrevChannel() logger.debug('TunerControl: Previous channel selection = %r', prev_channel) self.PushChannel() self.SetVideoGroup(prev_channel) def SetVideoGroup(self, channel): """ select a channel's video group and tune to that channel """ try: channel_num = int(channel) except ValueError: channel_num = 0 logger.debug('TunerControl: Channel: %r', channel) new_vg = self.fc.getVideoGroup(channel, True) logger.debug('TunerControl: Group: type=%r, desc=%r', new_vg.group_type, new_vg.desc) logger.debug('TunerControl: Input: type=%r, num=%r', new_vg.input_type, new_vg.input_num) if new_vg.group_type != 'ivtv': logger.error('TunerControl: VideoGroup %s is not supported', new_vg) pop = AlertBox( text=_('This plugin only supports the ivtv video group!')) pop.show() return # check if videogroup switch is needed switch_vg = not self.ivtv_init or self.curr_channel is None or \ new_vg != self.fc.getVideoGroup(self.curr_channel, True) if switch_vg: # switch to a different video group logger.info('TunerControl: Set VideoGroup: %s', new_vg) ivtv_dev = ivtv.IVTV(new_vg.vdev) ivtv_dev.init_settings() self.xine.SetInput(new_vg.input_num) # disable embedded vbi data self.embed = ivtv_dev.getvbiembed() ivtv_dev.setvbiembed(0) if not self.ivtv_init: # set channel directly on v4l device, if channel is not negative if channel_num >= 0: self.fc.chanSet(channel, True) self.curr_channel = channel self.ivtv_init = True else: # set channel through xine process freq = self.fc.chanSet(channel, True, 'ivtv_xine_tv', None) if freq != 0: # channel has frequency logger.debug('TunerControl: Set frequency: %s', freq) self.xine.SetFrequency(freq) else: # channel has no frequency logger.debug('TunerControl: Channel has no frequency') self.curr_channel = channel self.xine.SeekEnd() self.ShowInfo() self.SetAudioByChannel(channel) def SetAudioByChannel(self, channel=-1): """ Set the PVR sound level This is a mix : The base volume is set by the avol option in each TV_VIDEO_GROUP. The value is hardware dependant. seems bo be between 0 and 65535. If this value is missing in the tv_video_group, that sub does nothing If the value is present, the actual audio value is this value time the 6th field in TV_CHANNELS (expressed in % ) """ try: # lookup the channel name in TV_CHANNELS for pos in range(len(config.TV_CHANNELS)): entry = config.TV_CHANNELS[pos] if str(channel) == str(entry[2]): channel_index = pos break except ValueError: pass logger.debug('SetAudioByChannel: Channel: %r TV_CHANNEL pos(%d)', channel, channel_index) vg = self.fc.getVideoGroup(channel, True) try: ivtv_avol = vg.avol except AttributeError: ivtv_avol = 0 if ivtv_avol <= 0: logger.debug( 'SetAudioByChannel: The tv_video group for %r doesn\'t set the volume', channel) else: # Is there a specific volume level in TV_CHANNELS_VOLUME ivtv_dev = ivtv.IVTV(vg.vdev) avol_percent = 100 try: # lookup the channel name in TV_CHANNELS for pos in range(len(config.TV_CHANNELS_VOLUME)): if config.TV_CHANNELS_VOLUME[pos][0] == config.TV_CHANNELS[ channel_index][0]: avol_percent = config.TV_CHANNELS_VOLUME[pos][1] break except: pass try: avol_percent = int(avol_percent) except ValueError: avol_percent = 100 avol = int(ivtv_avol * avol_percent / 100) if avol > 65535: avol = 65535 if avol < 0: avol = 0 logger.debug('SetAudioByChannel: Current PVR Sound level is : %s', ivtv_dev.getctrl(0x00980905)) logger.debug( 'SetAudioByChannel: Set the PVR Sound Level to : %s (%s * %s)', avol, ivtv_avol, avol_percent) ivtv_dev.setctrl(0x00980905, avol) logger.debug('SetAudioByChannel: New PVR Sound level is : %s', ivtv_dev.getctrl(0x00980905))