Package: minirok
Version: 2.1-1
Severity: wishlist
Tags: patch

Hi, I added a simple volume control to minirok - it needs to be polished, but
I'm sending the patch so that I get some feedback (whether it's even acceptable
by developer).

Btw, I'm not sure how to send attachments to this bug reporting system, so
I'm including the git patch as cleartext (it's against the today's GIT head):


------------------------------
0001-Added-support-for-volume-changing.patch
------------------------------



>From b730f049276cc9b2cfd494cd40c3f0609d717088 Mon Sep 17 00:00:00 2001
From: Andrej Krutak <[email protected]>
Date: Tue, 23 Mar 2010 23:21:21 +0100
Subject: [PATCH] Added support for volume changing

---
 minirok/engine.py    |   19 +++++++++++++++++++
 minirok/statusbar.py |   44 ++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 63 insertions(+), 0 deletions(-)

diff --git a/minirok/engine.py b/minirok/engine.py
index 1bfb8d0..b258991 100644
--- a/minirok/engine.py
+++ b/minirok/engine.py
@@ -42,6 +42,15 @@ class GStreamerEngine(QtCore.QObject):
             if gst.registry_get_default().find_plugin(plugin) is not None:
                 self._supported_extensions.extend(extensions)
 
+        self.last_volume = 100
+
+        self.bin = None
+        self.reset()
+
+    def reset(self):
+        if self.bin is not None:
+            self.stop()
+    
         self.uri = None
         self._status = State.STOPPED
         self.bin = gst.element_factory_make('playbin')
@@ -62,6 +71,7 @@ class GStreamerEngine(QtCore.QObject):
         self.time_fmt = gst.Format(gst.FORMAT_TIME)
         self.seek_pending = False
 
+        self.set_volume(self.last_volume);
     ##
 
     def _set_status(self, value):
@@ -84,6 +94,8 @@ class GStreamerEngine(QtCore.QObject):
     ##
 
     def play(self, path):
+        self.reset()
+
         self.uri = 'file://' + os.path.abspath(path)
         self.bin.set_property('uri', self.uri)
         self.bin.set_state(gst.STATE_NULL)
@@ -122,6 +134,13 @@ class GStreamerEngine(QtCore.QObject):
 
     ##
 
+    def set_volume(self, volume):
+        self.bin.set_property("volume", volume/100.0)
+        self.last_volume = volume
+        
+    def get_volume(self):
+        return self.bin.get_property("volume")*100.0
+        
     def _message_eos(self, bus, message):
         self.bin.set_state(gst.STATE_NULL)
         self.status = State.STOPPED
diff --git a/minirok/statusbar.py b/minirok/statusbar.py
index cf40118..3983380 100644
--- a/minirok/statusbar.py
+++ b/minirok/statusbar.py
@@ -23,6 +23,7 @@ class StatusBar(kdeui.KStatusBar):
         kdeui.KStatusBar.__init__(self, *args)
 
         self.seek_to = None
+        self.volume = None
 
         self.timer = util.QTimerWithPause(self)
         self.blink_timer = QtCore.QTimer(self)
@@ -33,17 +34,25 @@ class StatusBar(kdeui.KStatusBar):
         self.slider = QtGui.QSlider(QtCore.Qt.Horizontal, self)
         self.label1 = TimeLabel(self)
         self.label2 = NegativeTimeLabel(self)
+        self.volume_slider = QtGui.QSlider(QtCore.Qt.Horizontal, self)
 
         self.slider.setTracking(False)
         self.slider.setMaximumWidth(150)
         self.slider.setFocusPolicy(QtCore.Qt.NoFocus)
 
+        self.volume_slider.setTracking(True)
+        self.volume_slider.setMaximumWidth(100)
+        self.volume_slider.setFocusPolicy(QtCore.Qt.NoFocus)
+        self.volume_slider.setRange(0, 100)
+        self.volume_slider.setValue(100)
+        
         self.setContentsMargins(0, 0, 4, 0)
         self.addPermanentWidget(self.repeat, 0)
         self.addPermanentWidget(self.random, 0)
         self.addPermanentWidget(self.label1, 0)
         self.addPermanentWidget(self.slider, 0)
         self.addPermanentWidget(self.label2, 0)
+        self.addPermanentWidget(self.volume_slider, 0)
 
         self.slot_stop()
 
@@ -60,6 +69,9 @@ class StatusBar(kdeui.KStatusBar):
         self.connect(self.slider, QtCore.SIGNAL('sliderReleased()'),
                 lambda: self.handle_slider_event(self.SLIDER_RELEASED))
 
+        self.connect(self.volume_slider, QtCore.SIGNAL('valueChanged(int)'),
+                self.handle_volume_slider_event)
+                
         self.connect(minirok.Globals.playlist, QtCore.SIGNAL('new_track'),
                 self.slot_start)
 
@@ -78,12 +90,25 @@ class StatusBar(kdeui.KStatusBar):
                 'Toggle random mode', self.random.mousePressEvent,
                 QtGui.QIcon(util.get_png('random_small')), 'Ctrl+R')
 
+        self.action_seek_forward = util.create_action('action_seek_forward',
+                'Seek forward', self.slot_seek_forward, 
global_shortcut='Meta+Right')
+        
+        self.action_seek_backward = util.create_action('action_seek_backward',
+                'Seek backward', self.slot_seek_backward, 
global_shortcut='Meta+Left')
+                
+        self.action_volume_up = util.create_action('action_volume_up',
+                'Increase volume', self.slot_volume_up, 
global_shortcut='Meta+Up')
+        
+        self.action_volume_down = util.create_action('action_volume_down',
+                'Decrease volume', self.slot_volume_down, 
global_shortcut='Meta+Down')
+
     def slot_update(self):
         self.elapsed = minirok.Globals.engine.get_position()
         self.remaining = self.length - self.elapsed
         self.slider.setValue(self.elapsed)
         self.label1.set_time(self.elapsed)
         self.label2.set_time(self.remaining) # XXX what if length was unset
+        self.volume_slider.setValue(minirok.Globals.engine.get_volume())
 
     def slot_start(self):
         tags = minirok.Globals.playlist.get_current_tags()
@@ -140,6 +165,25 @@ class StatusBar(kdeui.KStatusBar):
         else:
             minirok.logger.warn('unknown slider event %r', what)
 
+    def handle_volume_slider_event(self):
+        minirok.Globals.engine.set_volume(self.volume_slider.value())
+            
+    def slot_seek_forward(self):
+        self.slider.setValue(self.slider.value()+5)
+        self.seek_to=self.slider.value()
+        self.handle_slider_event(self.SLIDER_RELEASED)
+        
+    def slot_seek_backward(self):
+        self.slider.setValue(self.slider.value()-5)
+        self.seek_to=self.slider.value()
+        self.handle_slider_event(self.SLIDER_RELEASED)
+
+    def slot_volume_up(self):
+        self.volume_slider.setValue(self.volume_slider.value()+5)
+
+    def slot_volume_down(self):
+        self.volume_slider.setValue(self.volume_slider.value()-5)
+        
     def _connect_timer(self, disconnect=False):
         f = disconnect and self.disconnect or self.connect
         f(self.timer, QtCore.SIGNAL('timeout()'), self.slot_update)
-- 
1.7.0



-- 
To UNSUBSCRIBE, email to [email protected]
with a subject of "unsubscribe". Trouble? Contact [email protected]

Reply via email to