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]

