Author: dmeyer
Date: Tue Aug 22 20:12:23 2006
New Revision: 1891

Modified:
   trunk/WIP/player/src/backends/gstreamer/child.py
   trunk/WIP/player/src/backends/gstreamer/player.py
   trunk/WIP/player/src/backends/mplayer/player.py
   trunk/WIP/player/src/backends/xine/child.py
   trunk/WIP/player/src/backends/xine/player.py
   trunk/WIP/player/src/generic.py
   trunk/WIP/player/src/ptypes.py
   trunk/WIP/player/test/play.py

Log:
make seeking work with all player

Modified: trunk/WIP/player/src/backends/gstreamer/child.py
==============================================================================
--- trunk/WIP/player/src/backends/gstreamer/child.py    (original)
+++ trunk/WIP/player/src/backends/gstreamer/child.py    Tue Aug 22 20:12:23 2006
@@ -10,6 +10,7 @@
 kaa.notifier.init('gtk', x11=False)
 
 from kaa.player.utils import Player
+from kaa.player.ptypes import *
 
 from gst_types import Status
 
@@ -20,8 +21,8 @@
         self._gst = None
         self._status_object = Status(self._send_status)
         self._status_last = None
-
-
+        self._streaminfo = {}
+        
     def get_status(self):
         return self._status_object.get_status()
     
@@ -72,7 +73,10 @@
                     return True
                 # print e, e.code, e.domain
             return True
-        # print msg
+        if msg.type == gst.MESSAGE_TAG:
+            taglist = msg.parse_tag()
+            for key in taglist.keys():
+                self._streaminfo[key] = taglist[key]
         return True
     
         
@@ -92,18 +96,18 @@
 
     def open(self, uri):
         self._gst.set_property('uri', uri)
-        self._gst.set_state(gst.STATE_PLAYING)
         self.status = Status.OPENING
+        self._streaminfo = {}
+        
+
+    def play(self):
+        self._gst.set_state(gst.STATE_PLAYING)
 
 
     def pause(self):
         self._gst.set_state(gst.STATE_PAUSED)
 
 
-    def resume(self):
-        self._gst.set_state(gst.STATE_PLAYING)
-
-
     def stop(self):
         self._gst.set_state(gst.STATE_NULL)
         self.status = Status.IDLE
@@ -113,5 +117,17 @@
         sys.exit(0)
 
 
+    def seek(self, value, type):
+        pos = 0
+        if type == SEEK_RELATIVE:
+            pos = self._gst.query_position(gst.FORMAT_TIME)[0] + value * 
1000000000
+        if type == SEEK_ABSOLUTE:
+            pos = value * 1000000000
+        if type == SEEK_PERCENTAGE and 'duration' in self._streaminfo:
+            pos = (self._streaminfo['duration'] / 100) * value
+        self._gst.seek(1.0, gst.FORMAT_TIME,
+                       gst.SEEK_FLAG_FLUSH | gst.SEEK_FLAG_ACCURATE,
+                       gst.SEEK_TYPE_SET, pos, gst.SEEK_TYPE_NONE, 0)
+        
 player = GStreamer(sys.argv[1])
 kaa.notifier.loop()

Modified: trunk/WIP/player/src/backends/gstreamer/player.py
==============================================================================
--- trunk/WIP/player/src/backends/gstreamer/player.py   (original)
+++ trunk/WIP/player/src/backends/gstreamer/player.py   Tue Aug 22 20:12:23 2006
@@ -25,10 +25,10 @@
 
     def _span(self):
         script = os.path.join(os.path.dirname(__file__), 'child.py')
-        self.player = ChildProcess(self, script, str(self._instance_id))
-        self.player.signals["completed"].connect_weak(self._exited)
-        
self.player.set_stop_command(kaa.notifier.WeakCallback(self._end_child))
-        self.player.start()
+        self._gst = ChildProcess(self, script, str(self._instance_id))
+        self._gst.signals["completed"].connect_weak(self._exited)
+        self._gst.set_stop_command(kaa.notifier.WeakCallback(self._end_child))
+        self._gst.start()
         self._state = STATE_IDLE
 
 
@@ -38,7 +38,7 @@
 
     def _end_child(self):
         self._state = STATE_SHUTDOWN
-        self.player.die()
+        self._gst.die()
 
 
     # child handling
@@ -62,9 +62,10 @@
         self._mrl = mrl
         if self._state == STATE_NOT_RUNNING:
             self._span()
+        self._position = 0.0
 
 
-    def play(self, video=True):
+    def play(self):
         """
         Start playing. If playback is paused, resume. If not wait
         async until either the playing has started or an error
@@ -73,32 +74,30 @@
         wid = None
         if self._window:
             wid = self._window.get_id()
-        self.player.setup(wid=wid)
-
-        self._position = 0.0
-
-        self.player.open(self._mrl)
+        self._gst.setup(wid=wid)
+        self._gst.open(self._mrl)
+        self._gst.play()
         self._state = STATE_OPENING
         return
 
 
     def pause(self):
-        self.player.pause()
+        self._gst.pause()
         self._state = STATE_PAUSED
 
 
     def resume(self):
-        self.player.resume()
+        self._gst.play()
         self._state = STATE_PLAYING
 
         
     def stop(self):
-        self.player.stop()
+        self._gst.stop()
 
 
     def die(self):
         self.stop()
-        self.player.die()
+        self._gst.die()
         self._state = STATE_SHUTDOWN
 
 
@@ -114,6 +113,10 @@
         return self._position
 
 
+    def seek(self, value, type):
+        self._gst.seek(value, type)
+
+
     def nav_command(self, input):
         return False
     

Modified: trunk/WIP/player/src/backends/mplayer/player.py
==============================================================================
--- trunk/WIP/player/src/backends/mplayer/player.py     (original)
+++ trunk/WIP/player/src/backends/mplayer/player.py     Tue Aug 22 20:12:23 2006
@@ -423,14 +423,9 @@
         if self.get_state() == STATE_PAUSED:
             self._slave_cmd("pause")
 
-    def seek_relative(self, offset):
-        self._slave_cmd("seek %f 0" % offset)
-
-    def seek_absolute(self, position):
-        self._slave_cmd("seek %f 2" % position)
-
-    def seek_percentage(self, percent):
-        self._slave_cmd("seek %f 1" % percent)
+    def seek(self, value, type):
+        s = [SEEK_RELATIVE, SEEK_PERCENTAGE, SEEK_ABSOLUTE]
+        self._slave_cmd("seek %f %s" % (value, s.index(type)))
 
     def stop(self):
         self.die()

Modified: trunk/WIP/player/src/backends/xine/child.py
==============================================================================
--- trunk/WIP/player/src/backends/xine/child.py (original)
+++ trunk/WIP/player/src/backends/xine/child.py Tue Aug 22 20:12:23 2006
@@ -10,7 +10,7 @@
 from kaa.config import Group, Var
 
 from kaa.player.utils import Player
-
+from kaa.player.ptypes import *
 
 # Config group for xine player
 config = Group(desc = 'Options for xine player', schema = [
@@ -56,6 +56,7 @@
         if not self._stream:
             return
 
+        # FIXME: this gets not updated very often, I have no idea why
         t = self._stream.get_pos_length()
         status = self._stream.get_status()
         speed = self._stream.get_parameter(xine.PARAM_SPEED)
@@ -64,7 +65,6 @@
         # Where status is one of XINE_STATUS_ constants, and speed
         # is one of XINE_SPEED constants.
         cur_status = (t[0], t[1], t[2], status, speed)
-
         if cur_status != self._status_last:
             self._status_last = cur_status
             self.parent.set_status(*cur_status)
@@ -235,7 +235,7 @@
             print "Open failed:", self._stream.get_error()
             return
         self.parent.set_stream_info(True, self._get_stream_info())
-        self._status.start(0.1)
+        self._status.start(0.001)
 
 
     def osd_update(self, alpha, visible, invalid_regions):
@@ -265,13 +265,13 @@
         self._stream.set_parameter(xine.PARAM_SPEED, xine.SPEED_NORMAL)
 
 
-    def seek(self, whence, value):
-        if whence == 0:
+    def seek(self, value, type):
+        if type == SEEK_RELATIVE:
             self._stream.seek_relative(value)
-        elif whence == 1:
+        if type == SEEK_ABSOLUTE:
             self._stream.seek_absolute(value)
-        elif whence == 2:
-            self._stream.play(pos = value)
+        if type == SEEK_PERCENTAGE:
+            self._stream.play(pos = (value / 100.0) * 65535)
 
 
     def stop(self):

Modified: trunk/WIP/player/src/backends/xine/player.py
==============================================================================
--- trunk/WIP/player/src/backends/xine/player.py        (original)
+++ trunk/WIP/player/src/backends/xine/player.py        Tue Aug 22 20:12:23 2006
@@ -191,7 +191,7 @@
         self._mrl = "%s:%s" % (scheme, path)
 
 
-    def play(self, video=True):
+    def play(self):
         if not self._xine:
             self._spawn()
 
@@ -222,17 +222,8 @@
         self._xine.die()
 
         
-    def seek_relative(self, offset):
-        self._xine.seek(0, offset)
-
-
-    def seek_absolute(self, position):
-        self._xine.seek(1, position)
-
-
-    def seek_percentage(self, percent):
-        pos = (percent / 100.0) * 65535
-        self._xine.seek(2, pos)
+    def seek(self, value, type):
+        self._xine.seek(value, type)
 
 
     def get_info(self):

Modified: trunk/WIP/player/src/generic.py
==============================================================================
--- trunk/WIP/player/src/generic.py     (original)
+++ trunk/WIP/player/src/generic.py     Tue Aug 22 20:12:23 2006
@@ -263,27 +263,15 @@
 
 
     @required_states(STATE_IDLE, STATE_PLAYING, STATE_PAUSED)
-    def seek_relative(self, offset):
+    def seek(self, value, type=SEEK_RELATIVE):
         """
-        Seek relative.
+        Seek. Possible types are SEEK_RELATIVE, SEEK_ABSOLUTE and 
SEEK_PERCENTAGE.
         """
-        self._player.seek_relative(offset)
-
-
-    @required_states(STATE_IDLE, STATE_PLAYING, STATE_PAUSED)
-    def seek_absolute(self, position):
-        """
-        Seek absolute.
-        """
-        self._player.seek_absolute(position)
-
-
-    @required_states(STATE_IDLE, STATE_PLAYING, STATE_PAUSED)
-    def seek_percentage(self, percent):
-        """
-        Seek percentage.
-        """
-        self._player.seek_percent(position)
+        if self.get_state() == STATE_IDLE:
+            # FIXME: make it possible to seek between open() and play() and
+            # add STATE_IDLE to required_states.
+            return False
+        self._player.seek(value, type)
 
 
     def get_position(self):

Modified: trunk/WIP/player/src/ptypes.py
==============================================================================
--- trunk/WIP/player/src/ptypes.py      (original)
+++ trunk/WIP/player/src/ptypes.py      Tue Aug 22 20:12:23 2006
@@ -44,3 +44,8 @@
 STATE_PLAYING = 'STATE_PLAYING'
 STATE_PAUSED = 'STATE_PAUSED'
 STATE_SHUTDOWN = 'STATE_SHUTDOWN'
+
+SEEK_RELATIVE = 'SEEK_RELATIVE'
+SEEK_ABSOLUTE = 'SEEK_ABSOLUTE'
+SEEK_PERCENTAGE = 'SEEK_PERCENTAGE'
+

Modified: trunk/WIP/player/test/play.py
==============================================================================
--- trunk/WIP/player/test/play.py       (original)
+++ trunk/WIP/player/test/play.py       Tue Aug 22 20:12:23 2006
@@ -22,6 +22,8 @@
         player.pause_toggle()
     elif key == "q":
         player.stop()
+    elif key in ("up", "down", "left", "right"):
+        player.seek({"up": 60, "down": -60, "left": -10, "right": 10}[key])
     elif key == "f" and player.get_window():
         win = player.get_window()
         win.set_fullscreen(not win.get_fullscreen())
@@ -40,4 +42,10 @@
 
 kaa.notifier.OneShotTimer(next, 'xine').start(0)
 
+def print_pos():
+    print '\r', player.get_position(),
+    sys.stdout.flush()
+    return True
+
+kaa.notifier.Timer(print_pos).start(0.1)
 kaa.main()

-------------------------------------------------------------------------
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-cvslog mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/freevo-cvslog

Reply via email to