Author: dmeyer
Date: Fri Jan  5 19:52:07 2007
New Revision: 2363

Modified:
   trunk/popcorn/src/backends/base.py
   trunk/popcorn/src/backends/gstreamer/player.py
   trunk/popcorn/src/backends/mplayer/player.py
   trunk/popcorn/src/backends/xine/player.py

Log:
Add policy when to call property change functions


Modified: trunk/popcorn/src/backends/base.py
==============================================================================
--- trunk/popcorn/src/backends/base.py  (original)
+++ trunk/popcorn/src/backends/base.py  Fri Jan  5 19:52:07 2007
@@ -26,6 +26,9 @@
 #
 # -----------------------------------------------------------------------------
 
+__all__ = [ 'MediaPlayer', 'runtime_property', 'APPLY_ALWAYS',
+            'IGNORE_UNLESS_PLAYING', 'DEFER_UNTIL_PLAYING' ]
+
 # python imports
 import sets
 import os
@@ -42,6 +45,19 @@
 # get logging object
 log = logging.getLogger('popcorn')
 
+APPLY_ALWAYS          = 'APPLY_ALWAYS'
+IGNORE_UNLESS_PLAYING = 'IGNORE_UNLESS_PLAYING'
+DEFER_UNTIL_PLAYING   = 'DEFER_UNTIL_PLAYING'
+
+def runtime_policy(type):
+    """
+    Decorator to mark a property function
+    """
+    def decorator(func):
+        func._runtime_policy = type
+        return func
+    return decorator
+
 
 class MediaPlayer(object):
     """
@@ -77,6 +93,12 @@
         self._frame_shmkey = int(key, 16)
         self._frame_shmem = None
 
+        self._property_callbacks = {}
+        self._property_playing = []
+        for name, func in [ (func, getattr(self, func)) for func in dir(self) 
]:
+            if callable(func) and hasattr(func, '_runtime_policy'):
+                name = name[10:].replace('_', '-')
+                self._property_callbacks[name] = func
 
     #
     # state handling
@@ -99,6 +121,11 @@
             return
         old_state = self._state_object
         self._state_object = state
+        if state == STATE_PLAYING and self._property_playing:
+            # now set changed properties
+            for key, value in self._property_playing:
+                self.set_property(key, value)
+            self._property_playing = []
         self._state_changed.emit(old_state, state)
 
     _state = property(get_state, _set_state, None, 'state of the player')
@@ -169,14 +196,14 @@
         """
         Return if the player is paused.
         """
-        return self.state == STATE_PAUSED
+        return self._state == STATE_PAUSED
 
 
     def is_playing(self):
         """
         Return if the player is playing.
         """
-        return self.state == STATE_PLAYING
+        return self._state == STATE_PLAYING
 
 
     def set_size(self, size):
@@ -319,8 +346,23 @@
         """
         Set a property to a new value.
         """
-        func = getattr(self, '_prop_%s' % prop.replace('-', '_'), None)
-        if not func or not func(value) == False:
+        if not prop in self._property_callbacks:
+            # no special handler, set and return
+            self._properties[prop] = value
+            return
+        func = self._property_callbacks[prop]
+        if self._state not in (STATE_PAUSED, STATE_PLAYING):
+            # We are not in playback mode.
+            if func._runtime_policy == DEFER_UNTIL_PLAYING:
+                # delay property call until playing
+                self._property_playing.append((prop, value))
+                return
+            if func._runtime_policy == IGNORE_UNLESS_PLAYING:
+                # just set and return
+                self._properties[prop] = value
+                return
+        # call property function
+        if func(value) is not False:
             self._properties[prop] = value
 
 

Modified: trunk/popcorn/src/backends/gstreamer/player.py
==============================================================================
--- trunk/popcorn/src/backends/gstreamer/player.py      (original)
+++ trunk/popcorn/src/backends/gstreamer/player.py      Fri Jan  5 19:52:07 2007
@@ -34,7 +34,8 @@
 from kaa.notifier import WeakCallback
 
 # kaa.popcorn imports
-from kaa.popcorn.backends.base import MediaPlayer
+from kaa.popcorn.backends.base import MediaPlayer, runtime_policy, \
+     APPLY_ALWAYS, IGNORE_UNLESS_PLAYING, DEFER_UNTIL_PLAYING
 from kaa.popcorn.ptypes import *
 from kaa.popcorn.config import config
 from kaa.popcorn.utils import ChildProcess
@@ -125,7 +126,8 @@
         self._gst.seek(value, type)
 
 
-    def _prop_audio_delay(self, delay):
+    @runtime_policy(DEFER_UNTIL_PLAYING)
+    def _set_prop_audio_delay(self, delay):
         """
         Sets audio delay. Positive value defers audio by delay.
         """

Modified: trunk/popcorn/src/backends/mplayer/player.py
==============================================================================
--- trunk/popcorn/src/backends/mplayer/player.py        (original)
+++ trunk/popcorn/src/backends/mplayer/player.py        Fri Jan  5 19:52:07 2007
@@ -43,7 +43,8 @@
 import kaa.display
 
 # kaa.popcorn base imports
-from kaa.popcorn.backends.base import MediaPlayer
+from kaa.popcorn.backends.base import MediaPlayer, runtime_policy, \
+     APPLY_ALWAYS, IGNORE_UNLESS_PLAYING, DEFER_UNTIL_PLAYING
 from kaa.popcorn.ptypes import *
 from kaa.popcorn.config import config
 
@@ -557,28 +558,32 @@
     # Property settings
     #
 
-    def _prop_audio_delay(self, delay):
+    @runtime_policy(DEFER_UNTIL_PLAYING)
+    def _set_prop_audio_delay(self, delay):
         """
         Sets audio delay. Positive value defers audio by delay.
         """
         self._mplayer.audio_delay(-delay, 1)
 
 
-    def _prop_audio_track(self, id):
+    @runtime_policy(IGNORE_UNLESS_PLAYING)
+    def _set_prop_audio_track(self, id):
         """
         Change audio track (mpeg and mkv only)
         """
         self._mplayer.switch_audio(id)
 
 
-    def _prop_subtitle_track(self, id):
+    @runtime_policy(IGNORE_UNLESS_PLAYING)
+    def _set_prop_subtitle_track(self, id):
         """
         Change subtitle track
         """
         self._mplayer.sub_select(id)
 
 
-    def _prop_subtitle_filename(self, filename):
+    @runtime_policy(IGNORE_UNLESS_PLAYING)
+    def _set_prop_subtitle_filename(self, filename):
         """
         Change subtitle filename
         """

Modified: trunk/popcorn/src/backends/xine/player.py
==============================================================================
--- trunk/popcorn/src/backends/xine/player.py   (original)
+++ trunk/popcorn/src/backends/xine/player.py   Fri Jan  5 19:52:07 2007
@@ -40,7 +40,8 @@
 import kaa.xine as xine
 
 # kaa.popcorn imports
-from kaa.popcorn.backends.base import MediaPlayer
+from kaa.popcorn.backends.base import MediaPlayer, runtime_policy, \
+     APPLY_ALWAYS, IGNORE_UNLESS_PLAYING, DEFER_UNTIL_PLAYING
 from kaa.popcorn.ptypes import *
 from kaa.popcorn.config import config
 from kaa.popcorn.utils import ChildProcess
@@ -311,7 +312,8 @@
         self._xine.seek(value, type)
 
 
-    def _prop_audio_delay(self, delay):
+    @runtime_policy(DEFER_UNTIL_PLAYING)
+    def _set_prop_audio_delay(self, delay):
         """
         Sets audio delay. Positive value defers audio by delay.
         """

-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys - and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
Freevo-cvslog mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/freevo-cvslog

Reply via email to