Update of /cvsroot/freevo/freevo/src/audio/plugins In directory sc8-pr-cvs1:/tmp/cvs-serv6311
Added Files: xine.py Log Message: Audio plugin for xine. The needed patch is not in xine-ui yet --- NEW FILE: xine.py --- #if 0 /* # ----------------------------------------------------------------------- # xine.py - the Freevo XINE module for audio # ----------------------------------------------------------------------- # $Id: xine.py,v 1.1 2003/08/17 15:46:12 dischi Exp $ # # Notes: Use xine (or better fbxine) to play audio files. This requires # xine-ui > 0.9.22 (when writing this plugin this means cvs) # # Todo: test it # # # ----------------------------------------------------------------------- # $Log: xine.py,v $ # Revision 1.1 2003/08/17 15:46:12 dischi # Audio plugin for xine. The needed patch is not in xine-ui yet # # # ----------------------------------------------------------------------- # Freevo - A Home Theater PC framework # Copyright (C) 2002 Krister Lagerstrom, et al. # Please see the file freevo/Docs/CREDITS for a complete list of authors. # # 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 MER- # CHANTABILITY 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., # 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # ----------------------------------------------------------------------- */ #endif import time, os import threading, signal import popen2, re import config # Configuration handler. reads config file. import util # Various utilities import childapp # Handle child applications import rc # The RemoteControl class. from event import * import plugin # RegExp import re DEBUG = config.DEBUG TRUE = 1 FALSE = 0 # contains an initialized Xine() object xine = None class PluginInterface(plugin.Plugin): """ Xine plugin for the video player. """ def __init__(self): global xine plugin.Plugin.__init__(self) if xine: return try: config.CONF.fbxine except: print '\nERROR:\nfbxine not found, plugin deactivated' return xine_version = 0 xine_cvs = 0 child = popen2.Popen3('%s --version' % config.CONF.fbxine, 1, 100) while(1): data = child.fromchild.readline() if not data: break m = re.match('^.* v?([0-9])\.([0-9]+)\.([0-9]*).*', data) if m: if data.find('cvs') >= 0: xine_cvs = 1 xine_version =int('%02d%02d%02d' % (int(m.group(1)), int(m.group(2)), int(m.group(3)))) child.wait() if xine_cvs: xine_version += 1 if xine_version < 923: print '\nERROR:\nfbxine version to old, plugin deactivated' print 'You need xine-ui > 0.9.22\n' return # create the xine object xine = util.SynchronizedObject(Xine(xine_version)) # register it as the object to play plugin.register(xine, plugin.AUDIO_PLAYER) class Xine: """ the main class to control xine """ def __init__(self, version): self.thread = Xine_Thread() self.thread.setDaemon(1) self.thread.start() self.mode = None self.xine_version = version self.app_mode = 'audio' self.command = '%s -V none -A %s --stdctl' % (config.CONF.fbxine, config.XINE_AO_DEV) if rc.PYLIRC: self.command = '%s --no-lirc' % self.command def play(self, item, playerGUI): """ play an audio file with xine """ if item.url: filename = item.url else: filename = item.filename self.playerGUI = playerGUI if plugin.getbyname('MIXER'): plugin.getbyname('MIXER').reset() self.item = item self.thread.item = item command = self.command if DEBUG: print 'Xine.play(): Starting thread, cmd=%s' % command self.thread.mode = 'play' self.thread.command = '%s %s' % (command, filename) self.thread.mode_flag.set() return None def is_playing(self): return self.thread.mode != 'idle' def refresh(self): self.playerGUI.refresh() def stop(self): """ Stop xine and set thread to idle """ self.thread.mode = 'stop' self.thread.mode_flag.set() self.thread.item = None while self.thread.mode == 'stop': time.sleep(0.3) def eventhandler(self, event): """ eventhandler for xine control. If an event is not bound in this function it will be passed over to the items eventhandler """ if event in ( PLAY_END, USER_END ): self.stop() return self.item.eventhandler(event) 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() self.playerGUI.stop() return self.item.eventhandler(event) 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 # nothing found? Try the eventhandler of the object who called us return self.item.eventhandler(event) # ====================================================================== 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 self.elapsed = 0 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) def stdout_cb(self, line): if line.startswith("time: "): # get current time self.item.elapsed = int(line[6:]) if self.item.elapsed != self.elapsed: xine.refresh() self.elapsed = self.item.elapsed # ====================================================================== 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 self.app.exit_type == "End of file": rc.post_event(PLAY_END) elif self.app.exit_type == "Quit": rc.post_event(USER_END) else: rc.post_event(PLAY_END) if DEBUG: print 'Xine_Thread.run(): Stopped' self.mode = 'idle' else: self.mode = 'idle' ------------------------------------------------------- This SF.Net email sponsored by: Free pre-built ASP.NET sites including Data Reports, E-commerce, Portals, and Forums are available now. Download today and enter to win an XBOX or Visual Studio .NET. http://aspnet.click-url.com/go/psa00100003ave/direct;at.aspnet_072303_01/01 _______________________________________________ Freevo-cvslog mailing list [EMAIL PROTECTED] https://lists.sourceforge.net/lists/listinfo/freevo-cvslog