def start(self, socket_address): """ Start the player to play from the specified TCP port. """ self.mrl_index = 0 if self.command is None: config_file_opt = [] config_file = dialog.utils.get_xine_config_file() print 'Config file: ', config_file if config_file: config_file_opt = ['--config', config_file] # Create the command used to start xine. self.command = [ '--prio=%s' % config.MPLAYER_NICE ] + \ config.XINE_COMMAND.split(' ') + \ [ '--stdctl', '-V', config.XINE_VO_DEV, '-A', config.XINE_AO_DEV ] + \ config.XINE_ARGS_DEF.split(' ') + \ config_file_opt if config.OSD_SINGLE_WINDOW: self.command += ['-W', str(osd.video_window.id), '--no-mouse'] osd.video_window.show() if not rc.PYLIRC and '--no-lirc' in self.command: self.command.remove('--no-lirc') # NOTE: We add the slave server MRL twice so that we can toggle between # them, this allows use to effectively reset Xine rendering pipeline and # make it possible to seek quickly. mrl = 'slave://%s:%d' % socket_address self.app = childapp.ChildApp2(self.command + \ [mrl, mrl])
def __change_state(self, new_state): """ Internal function to move to a new state. If new_state is different to the current state, set self.state to new_state and perform any state initialisation for the new state. """ if self.state == new_state: # No change in state nothing todo! return _debug_('Changing state from %s to %s' % (self.state, new_state)) self.state = new_state # State Initialisation code if self.state == STATE_IDLE: rc.app(None) rc.post_event(PLAY_END) self.udp_receiver.send_events = False elif self.state == STATE_TUNING: self.start_slave_server_at_end = True elif self.state == STATE_BUFFERING: self.wait_for_data_count = WAIT_FOR_DATA_COUNT elif self.state == STATE_PLAYING: self.slave_server.reader_at_end = self.start_slave_server_at_end self.slave_server.end_offset = self.udp_receiver.average_pps * WAIT_FOR_DATA_COUNT * 188 self.mrl_index = 0 self.app = childapp.ChildApp2(self.command) self.start_slave_server_at_end = False self.__draw_state_screen()
def play(self, options, item): """ play a videoitem with vlc """ self.options = options self.item = item mode = item.mode url = item.url self.item_info = None self.item_length = -1 self.item.elapsed = 0 try: _debug_('Vlc.play(): url=%s' % url) except UnicodeError: _debug_('Vlc.play(): [non-ASCII data]') if config.VLC_OPTIONS: vlc_options = config.VLC_OPTIONS command = self.cmd + ' ' + vlc_options + ' --intf dummy -f --key-quit=esc "%s"' % url rc.app(self) self.app = childapp.ChildApp2(command) return None
def Play(self, mode, tuner_channel=None): """ play with xine """ if not tuner_channel: tuner_channel = self.fc.getChannel() if plugin.getbyname('MIXER'): plugin.getbyname('MIXER').reset() command = copy.copy(self.command) if not config.XINE_HAS_NO_LIRC and '--no-lirc' in command: command.remove('--no-lirc') if config.OSD_SINGLE_WINDOW: command += ['-W', str(osd.video_window.id), '--no-mouse'] osd.video_window.show() command.append('dvb://' + tuner_channel) logger.debug('Starting cmd=%s', command) rc.add_app(self) self.app = childapp.ChildApp2(command) dialog.enable_overlay_display(AppTextDisplay(self.ShowMessage)) return None
def start(self, socket_address): """ Start the player to play from the specified TCP port. """ self.mrl_index = 0 if self.command is None: # Build the MPlayer command self.command = ['--prio=%s' % config.MPLAYER_NICE, config.MPLAYER_CMD] self.command += ['-slave'] self.command += config.MPLAYER_ARGS_DEF.split(' ') if dialog.overlay_display_supports_dialogs: self.command += ['-osdlevel','0'] if config.DEBUG_CHILDAPP: self.command += ['-v'] # Set audio out device self.command += ['-ao'] + config.MPLAYER_AO_DEV.split(' ') # Set video out device self.command += ['-vo', config.MPLAYER_VO_DEV + config.MPLAYER_VO_DEV_OPTS] # mode specific args mode = 'default' self.command += config.MPLAYER_ARGS[mode].split(' ') # add any additional arguments if config.MPLAYER_VF_INTERLACED: self.command += ['-vf', config.MPLAYER_VF_INTERLACED] elif config.MPLAYER_VF_PROGRESSIVE: self.command += ['-vf', config.MPLAYER_VF_PROGRESSIVE] if config.OSD_SINGLE_WINDOW: self.command += ['-wid', str(osd.video_window.id)] osd.video_window.show() # NOTE: We add the slave server MRL twice so that we can toggle between # them, this allows use to effectively reset mplayer's rendering pipeline and # make it possible to seek quickly. mrl = 'http://%s:%d' % socket_address self.app = childapp.ChildApp2(self.command + [mrl, mrl])
def Play(self, mode, tuner_channel=None): """ play with xine """ if not tuner_channel: tuner_channel = self.fc.getChannel() if plugin.getbyname('MIXER'): plugin.getbyname('MIXER').reset() command = copy.copy(self.command) if not config.XINE_HAS_NO_LIRC and '--no-lirc' in command: command.remove('--no-lirc') command.append('dvb://' + tuner_channel) _debug_('Xine.play(): Starting cmd=%s' % command) rc.app(self) self.app = childapp.ChildApp2(command) return None
def Play(self, mode, tuner_channel=None): if not tuner_channel: tuner_channel = self.fc.getChannel() vg = self.current_vg = self.fc.getVideoGroup(tuner_channel, True) # Convert to MPlayer TV setting strings norm = 'norm=%s' % vg.tuner_norm input = 'input=%s' % vg.input_num device = 'device=%s' % vg.vdev w, h = config.TV_VIEW_SIZE outfmt = 'outfmt=%s' % config.TV_VIEW_OUTFMT # Build the MPlayer command args = (config.MPLAYER_NICE, config.MPLAYER_CMD, config.MPLAYER_VO_DEV, config.MPLAYER_VO_DEV_OPTS, config.MPLAYER_AO_DEV, config.MPLAYER_ARGS_DEF) 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() ivtv_dev.close() self.fc.chanSet(tuner_channel, True) tvcmd = vg.vdev if config.MPLAYER_ARGS.has_key('ivtv'): args += (config.MPLAYER_ARGS['ivtv'], ) elif vg.group_type == 'webcam': self.fc.chanSet(tuner_channel, True, app='mplayer') tvcmd = '' if config.MPLAYER_ARGS.has_key('webcam'): args += (config.MPLAYER_ARGS['webcam'], ) elif vg.group_type == 'dvb': self.fc.chanSet(tuner_channel, True, app='mplayer') tvcmd = '' args += ('"dvb://%s" %s' % (tuner_channel, config.MPLAYER_ARGS['dvb']), ) elif vg.group_type == 'tvalsa': freq_khz = self.fc.chanSet(tuner_channel, True, app='mplayer') tuner_freq = '%1.3f' % (freq_khz / 1000.0) tvcmd = ('tv:// -tv driver=%s:%s:freq=%s:%s:%s:' '%s:width=%s:height=%s:%s %s' % (config.TV_DRIVER, vg.adev, tuner_freq, device, input, norm, w, h, outfmt, config.TV_OPTS)) if config.MPLAYER_ARGS.has_key('tv'): args += (config.MPLAYER_ARGS['tv'], ) else: # group_type == 'normal' freq_khz = self.fc.chanSet(tuner_channel, True, app='mplayer') tuner_freq = '%1.3f' % (freq_khz / 1000.0) tvcmd = ('tv:// -tv driver=%s:freq=%s:%s:%s:' '%s:width=%s:height=%s:%s %s' % (config.TV_DRIVER, tuner_freq, device, input, norm, w, h, outfmt, config.TV_OPTS)) if config.MPLAYER_ARGS.has_key('tv'): args += (config.MPLAYER_ARGS['tv'], ) elif mode == 'vcr': tvcmd = ('tv:// -tv driver=%s:%s:%s:' '%s:width=%s:height=%s:%s %s' % (config.TV_DRIVER, device, input, norm, w, h, outfmt, config.TV_OPTS)) if config.MPLAYER_ARGS.has_key('tv'): args += (config.MPLAYER_ARGS['tv'], ) else: print 'Mode "%s" is not implemented' % mode # XXX ui.message() return args += (tvcmd, ) mpl = '--prio=%s %s -vo %s %s -ao %s %s -slave %s %s' % args command = mpl _debug_('command=\"%s\"', (command)) 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.app = childapp.ChildApp2(command) 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 play(self, options, item): """ play a dvd with xine """ self.item = item if config.EVENTS.has_key(item.mode): self.app_mode = item.mode else: self.app_mode = 'video' if plugin.getbyname('MIXER'): plugin.getbyname('MIXER').reset() command = copy.copy(self.command) if item['deinterlace']: command.append('-D') if not config.XINE_HAS_NO_LIRC and '--no-lirc' in command: command.remove('--no-lirc') self.max_audio = 0 self.current_audio = -1 self.max_subtitle = 0 self.current_subtitle = -1 if item.mode == 'dvd': for track in item.info['tracks']: self.max_audio = max(self.max_audio, len(track['audio'])) for track in item.info['tracks']: self.max_subtitle = max(self.max_subtitle, len(track['subtitles'])) if item.mode == 'dvd' and hasattr(item, 'filename') and item.filename and \ item.filename.endswith('.iso'): # dvd:///full/path/to/image.iso/ command.append('dvd://%s/' % item.filename) elif item.mode == 'dvd' and hasattr(item.media, 'devicename'): # dvd:///dev/dvd/2 command.append('dvd://%s/%s' % (item.media.devicename, item.url[6:])) elif item.mode == 'dvd': # no devicename? Probably a mirror image on the HD command.append(item.url) elif item.mode == 'vcd': # vcd:///dev/cdrom -- NO track support (?) command.append('vcd://%s' % item.media.devicename) elif item.mimetype == 'cue': command.append('vcd://%s' % item.filename) self.app_mode = 'vcd' else: command.append(item.url) _debug_('Xine.play(): Starting cmd=%s' % command) rc.app(self) self.app = childapp.ChildApp2(command) return None
def Play(self, mode, tuner_channel=None): """ """ logger.log(9, 'MPlayer.Play(mode=%r, tuner_channel=%r)', mode, tuner_channel) # Try to see if the channel is not tunable try: channel = int(tuner_channel) except ValueError: channel = 0 vg = self.current_vg = self.fc.getVideoGroup(tuner_channel, True) if not tuner_channel: tuner_channel = self.fc.getChannel() # Convert to MPlayer TV setting strings device = 'device=%s' % vg.vdev input = 'input=%s' % vg.input_num norm = 'norm=%s' % vg.tuner_norm w, h = config.TV_VIEW_SIZE outfmt = 'outfmt=%s' % config.TV_VIEW_OUTFMT # Build the MPlayer command line args = { 'nice': config.MPLAYER_NICE, 'cmd': config.MPLAYER_CMD, 'vo': '-vo %s' % config.MPLAYER_VO_DEV, 'vo_opts': config.MPLAYER_VO_DEV_OPTS, 'vc': '', 'ao': '-ao %s' % config.MPLAYER_AO_DEV, 'ao_opts': config.MPLAYER_AO_DEV_OPTS, 'default_args': config.MPLAYER_ARGS_DEF.split(), 'mode_args': config.MPLAYER_ARGS.has_key(mode) and config.MPLAYER_ARGS[mode].split() or [], 'geometry': (config.CONF.x or config.CONF.y) and '-geometry %d:%d' % (config.CONF.x, config.CONF.y) or '', 'verbose': '', 'dvd-device': '', 'cdrom-device': '', 'alang': '', 'aid': '', 'slang': '', 'sid': '', 'playlist': '', 'field-dominance': '', 'edl': '', 'mc': '', 'delay': '', 'sub': '', 'audiofile': '', 'af': [], 'vf': [], 'tv': '', 'url': '', 'disable_osd': False, } if dialog.overlay_display_supports_dialogs: # Disable the mplayer OSD if we have a better option. args['disable_osd'] = True if mode == 'tv': if vg.group_type == 'ivtv': ivtv_dev = ivtv.IVTV(vg.vdev) ivtv_dev.init_settings() ivtv_dev.setinputbyname(vg.input_type) cur_std = ivtv_dev.getstd() import tv.v4l2 try: new_std = tv.v4l2.NORMS.get(vg.tuner_norm) if cur_std != new_std: ivtv_dev.setstd(new_std) except: logger.error( 'Error! Videogroup norm value "%s" not from NORMS: %s', vg.tuner_norm, tv.v4l2.NORMS.keys()) ivtv_dev.close() # Do not set the channel if negative if channel >= 0: self.fc.chanSet(tuner_channel, True) args['url'] = vg.vdev if config.MPLAYER_ARGS.has_key('ivtv'): args['mode_args'] = config.MPLAYER_ARGS['ivtv'].split() elif vg.group_type == 'webcam': self.fc.chanSet(tuner_channel, True, app='mplayer') args['url'] = '' if config.MPLAYER_ARGS.has_key('webcam'): args['mode_args'] = config.MPLAYER_ARGS['webcam'].split() elif vg.group_type == 'dvb': self.fc.chanSet(tuner_channel, True, app='mplayer') args['url'] = ('dvb://%s' % (tuner_channel, )) args['mode_args'] = config.MPLAYER_ARGS['dvb'].split() elif vg.group_type == 'tvalsa': freq_khz = self.fc.chanSet(tuner_channel, True, app='mplayer') tuner_freq = '%1.3f' % (freq_khz / 1000.0) args['tv'] = '-tv driver=%s:%s:freq=%s:%s:%s:%s:width=%s:height=%s:%s %s' % \ (config.TV_DRIVER, vg.adev, tuner_freq, device, input, norm, w, h, outfmt, config.TV_OPTS) args['url'] = 'tv://' if config.MPLAYER_ARGS.has_key('tv'): args['mode_args'] = config.MPLAYER_ARGS['tv'].split() else: # group_type == 'normal' freq_khz = self.fc.chanSet(tuner_channel, True, app='mplayer') tuner_freq = '%1.3f' % (freq_khz / 1000.0) args['tv'] = '-tv driver=%s:freq=%s:%s:%s:%s:width=%s:height=%s:%s %s' % \ (config.TV_DRIVER, tuner_freq, device, input, norm, w, h, outfmt, config.TV_OPTS) args['url'] = 'tv://' if config.MPLAYER_ARGS.has_key('tv'): args['mode_args'] = config.MPLAYER_ARGS['tv'].split() elif mode == 'vcr': args['tv'] = '-tv driver=%s:%s:%s:%s:width=%s:height=%s:%s %s' % \ (config.TV_DRIVER, device, input, norm, w, h, outfmt, config.TV_OPTS) args['url'] = 'tv://' if config.MPLAYER_ARGS.has_key('tv'): args['mode_args'] = config.MPLAYER_ARGS['tv'].split() else: logger.error('Mode "%s" is not implemented', mode) return logger.debug('mplayer args = %r', args) vo = ['%(vo)s' % args, '%(vo_opts)s' % args] vo = filter(len, vo) vo = ':'.join(vo) ao = ['%(ao)s' % args, '%(ao_opts)s' % args] ao = filter(len, ao) ao = ':'.join(ao) command = ['--prio=%(nice)s' % args] command += ['%(cmd)s' % args] command += ['-slave'] command += str('%(verbose)s' % args).split() command += str('%(geometry)s' % args).split() command += vo.split() command += str('%(vc)s' % args).split() command += ao.split() command += args['default_args'] command += args['mode_args'] command += str('%(dvd-device)s' % args).split() command += str('%(cdrom-device)s' % args).split() command += str('%(alang)s' % args).split() command += str('%(aid)s' % args).split() command += str('%(audiofile)s' % args).split() command += str('%(slang)s' % args).split() command += str('%(sid)s' % args).split() command += str('%(sub)s' % args).split() command += str('%(field-dominance)s' % args).split() command += str('%(edl)s' % args).split() command += str('%(mc)s' % args).split() command += str('%(delay)s' % args).split() if args['af']: command += ['-af', '%s' % ','.join(args['af'])] if args['vf']: command += ['-vf', '%s' % ','.join(args['vf'])] command += str('%(tv)s' % args).split() command += args['disable_osd'] and ['-osdlevel', '0'] or [] if config.OSD_SINGLE_WINDOW: command += ['-wid', str(osd.video_window.id)] osd.video_window.show() # use software scaler? if '-nosws' in command: command.remove('-nosws') elif '-framedrop' not in command: command += config.MPLAYER_SOFTWARE_SCALER.split() #if options: # command += options command = filter(len, command) #command = self.sort_filter(command) url = '%(url)s' % args command += [url] logger.debug('%r', command) 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.MIXER_MAJOR_CTRL == 'VOL': mixer_vol = mixer.getMainVolume() mixer.setMainVolume(0) elif mixer and config.MIXER_MAJOR_CTRL == 'PCM': mixer_vol = mixer.getPcmVolume() mixer.setPcmVolume(0) # Start up the TV task self.app = childapp.ChildApp2(command) rc.add_app(self) # Suppress annoying audio clicks time.sleep(0.4) # XXX Hm.. This is hardcoded and very unflexible. if mixer and mode == 'vcr': mixer.setMicVolume(config.MIXER_VOLUME_VCR_IN) elif mixer: mixer.setLineinVolume(config.MIXER_VOLUME_TV_IN) mixer.setIgainVolume(config.MIXER_VOLUME_TV_IN) if mixer and config.MIXER_MAJOR_CTRL == 'VOL': mixer.setMainVolume(mixer_vol) elif mixer and config.MIXER_MAJOR_CTRL == 'PCM': mixer.setPcmVolume(mixer_vol) dialog.enable_overlay_display(AppTextDisplay(self.show_message)) logger.debug('%s: started %s app', time.time(), self.mode)