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