changeset:   1641:d24cb0b83aa4
user:        Mickael Royer <mickael.royer@gmail.com>
date:        Wed Nov 03 09:07:28 2010 +0100
summary:     [player] Set volume by media type (song, video, webradio) and save all volume states when deejayd quit

Index: deejayd.new/deejayd/player/_base.py
===================================================================
--- deejayd.new.orig/deejayd/player/_base.py	2010-11-26 22:24:37.000000000 +0100
+++ deejayd.new/deejayd/player/_base.py	2010-11-26 22:32:14.499757031 +0100
@@ -17,6 +17,7 @@
 # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 
 import os,subprocess
+import cPickle as pickle
 
 from deejayd.component import SignalingComponent
 from deejayd.plugins import PluginError, IPlayerPlugin
@@ -47,11 +48,16 @@
         self._source = None
         self._media_file = None
         self._replaygain = config.getboolean("general","replaygain")
-
+        self.__volume = {"song": 100, "video": 100, "webradio": 100}
 
     def load_state(self):
         # Restore volume
-        self.set_volume(float(self.db.get_state("volume")))
+        recorded_volume = self.db.get_state("volume")
+        try:
+            self.__volume = pickle.loads(recorded_volume.encode("utf-8"))
+        except pickle.UnpicklingError: # old record
+            self.__volume["song"] = int(recorded_volume)
+
         # Restore current media
         media_pos = int(self.db.get_state("current"))
         source = self.db.get_state("current_source")
@@ -123,11 +129,41 @@
         self._change_file(self._source.get(nb,type,source))
 
     def get_volume(self):
-        raise NotImplementedError
+        return self.__volume[self.__get_vol_type()]
+
+    def set_volume(self, v, sig = True):
+        new_volume = min(100, int(v))
+        type = self.__get_vol_type()
+        self.__volume[type] = new_volume
+
+        # replaygain support
+        vol = self.__volume[type]
+        if self._replaygain and self._media_file is not None:
+            try: scale = self._media_file.replay_gain()
+            except AttributeError: pass # replaygain not supported
+            else:
+                vol = max(0.0, min(4.0, float(vol)/100.0 * scale))
+                vol = min(100, int(vol * 100))
+
+        # specific player implementation
+        self._set_volume(vol, sig)
 
-    def set_volume(self,v):
+    def _set_volume(self, v, sig = True):
         raise NotImplementedError
 
+    def __get_vol_type(self):
+        if self._media_file is None:
+            mediatype_by_source = {
+                    "playlist": "song",
+                    "panel": "song",
+                    "video": "video",
+                    "dvd": "video",
+                    "webradio": "webradio"
+                }
+            return mediatype_by_source[self._source.current]
+        else:
+            return self._media_file['type']
+
     def get_position(self):
         raise NotImplementedError
 
@@ -242,7 +278,7 @@
         # save state
         current = self._media_file or {"pos": "-1", "source": "none"}
         states = [
-            (str(self.get_volume()), "volume"),
+            (pickle.dumps(self.__volume), "volume"),
             (current["pos"], "current"),
             (current["source"], "current_source"),
             (str(self.get_position()), "current_pos"),
Index: deejayd.new/deejayd/player/gstreamer.py
===================================================================
--- deejayd.new.orig/deejayd/player/gstreamer.py	2010-11-26 22:24:37.000000000 +0100
+++ deejayd.new/deejayd/player/gstreamer.py	2010-11-26 22:32:14.499757031 +0100
@@ -34,7 +34,6 @@
 
     def __init__(self, db, plugin_manager, config):
         UnknownPlayer.__init__(self, db, plugin_manager, config)
-        self.__volume = 100
 
         # Open a Audio pipeline
         pipeline =  self.config.get("gstreamer", "audio_output")
@@ -152,26 +151,16 @@
         self.start_play()
 
         # replaygain reset
-        self.set_volume(self.__volume, sig=False)
+        self.set_volume(self.get_volume(), sig=False)
 
         if sig: self.dispatch_signame('player.status')
         self.dispatch_signame('player.current')
 
-    def get_volume(self):
-        return self.__volume
-
-    def set_volume(self, vol, sig=True):
-        self.__volume = min(100, int(vol))
-        v = float(self.__volume)/100
-        # replaygain support
-        if self._replaygain and self._media_file is not None:
-            try: scale = self._media_file.replay_gain()
-            except AttributeError: pass # replaygain not supported
-            else:
-                v = max(0.0, min(4.0, v * scale))
-                v = float(min(100, int(v * 100)))/100
+    def _set_volume(self, vol, sig=True):
+        v = float(vol)/100
         self.bin.set_property('volume', v)
-        if sig: self.dispatch_signame('player.status')
+        if sig:
+            self.dispatch_signame('player.status')
 
     def get_position(self):
         if gst.STATE_NULL != self.__get_gst_state() and \
Index: deejayd.new/deejayd/player/xine.py
===================================================================
--- deejayd.new.orig/deejayd/player/xine.py	2010-11-26 22:24:37.000000000 +0100
+++ deejayd.new/deejayd/player/xine.py	2010-11-26 22:32:26.447757007 +0100
@@ -59,9 +59,6 @@
         # init vars
         self.__supports_gapless = self.__xine.has_gapless()
 
-        self.__audio_volume = 100
-        self.__video_volume = 100
-
         self.__window = None
         self.__stream = None
         self.__osd = None
@@ -101,7 +98,7 @@
                         {"lang": _("Audio channel %d") % (i+1,), "ix": i})
             self._media_file["audio"] = audio_channels
 
-        needs_video = self.current_is_video()
+        needs_video = self._media_file["type"] == "video"
         if self.__stream:
             stream_should_change = (needs_video and\
                                     not self.__stream.has_video())\
@@ -142,7 +139,7 @@
                 raise ex
 
         if self.__window:
-            self.__window.show(self.current_is_video())
+            self.__window.show(needs_video)
 
         # init video information
         if needs_video:
@@ -246,27 +243,7 @@
     def _player_get_slang(self):
         return self.__stream.get_param(xine.Stream.XINE_PARAM_SPU_CHANNEL)
 
-    def get_volume(self):
-        if self.current_is_video():
-            return self.__video_volume
-        else:
-            return self.__audio_volume
-
-    def set_volume(self, vol, sig = True):
-        new_volume = min(100, int(vol))
-        if self.current_is_video():
-            self.__video_volume = new_volume
-        else:
-            self.__audio_volume = new_volume
-
-        # replaygain support
-        vol = self.get_volume()
-        if self._replaygain and self._media_file is not None:
-            try: scale = self._media_file.replay_gain()
-            except AttributeError: pass # replaygain not supported
-            else:
-                vol = max(0.0, min(4.0, float(vol)/100.0 * scale))
-                vol = min(100, int(vol * 100))
+    def _set_volume(self, vol, sig = True):
         if self.__stream:
             self.__stream.set_volume(vol)
         if sig:
@@ -310,10 +287,6 @@
             self.supported_extensions = self.__xine.get_supported_extensions()
         return format.strip(".") in self.supported_extensions
 
-    def current_is_video(self):
-        return self._media_file is not None\
-               and self._media_file['type'] == 'video'
-
     def close(self):
         UnknownPlayer.close(self)
         self.__xine.destroy()
