diff options
author | Manuel Kaufmann <humitos@gmail.com> | 2013-01-24 19:41:42 (GMT) |
---|---|---|
committer | Gonzalo Odiard <godiard@gmail.com> | 2013-01-25 14:02:02 (GMT) |
commit | 0796e465b075ca7b2c6570475c854c46815363a3 (patch) | |
tree | 919475d1000672a66b90538d7d1abba2d5082094 | |
parent | afedc32335628f023aa2f90dc0c3e6c34122b7dc (diff) |
Make reseek more CPU friendly
When the user starts draging the seeker Jukebox will really re-seek
past 250 miliseconds in the same value. This allows to re-seek the
stream faster because the proccessing is done just when it's really
necessary.
Signed-off-by: Manuel Kaufmann <humitos@gmail.com>
-rw-r--r-- | controls.py | 54 |
1 files changed, 31 insertions, 23 deletions
diff --git a/controls.py b/controls.py index 0ad105d..119095c 100644 --- a/controls.py +++ b/controls.py @@ -33,6 +33,7 @@ class Controls(GObject.GObject): add, remove, etc) toolbar""" SCALE_UPDATE_INTERVAL = 1000 + RESEEK_TIMEOUT = 250 # ms def __init__(self, activity, toolbar): GObject.GObject.__init__(self) @@ -41,8 +42,8 @@ class Controls(GObject.GObject): self.toolbar = toolbar self._scale_update_id = -1 - self._scale_changed_id = -1 - self._seek_timeout_id = -1 + self._scale_value_changed_id = -1 + self._scale_reseek_timeout_id = -1 self.open_button = ToolButton('list-add') self.open_button.set_tooltip(_('Add track')) @@ -225,8 +226,8 @@ class Controls(GObject.GObject): def __scale_button_press_cb(self, widget, event): self.button.set_sensitive(False) - self.was_playing = self.activity.player.is_playing() - if self.was_playing: + self._was_playing = self.activity.player.is_playing() + if self._was_playing: self.activity.player.pause() # don't timeout-update position during seek @@ -235,34 +236,41 @@ class Controls(GObject.GObject): self._scale_update_id = -1 # make sure we get changed notifies - if self._scale_changed_id == -1: - self._scale_changed_id = self.hscale.connect('value-changed', + if self._scale_value_changed_id == -1: + self._scale_value_changed_id = self.hscale.connect('value-changed', self.__scale_value_changed_cb) def __scale_value_changed_cb(self, scale): - # see seek.c:seek_cb - real = long(scale.get_value() * self.p_duration / 100) # in ns - self.activity.player.seek(real) - # allow for a preroll + if self._scale_reseek_timeout_id != -1: + GObject.source_remove(self._scale_reseek_timeout_id) + + self._scale_reseek_timeout_id = GObject.timeout_add( + self.RESEEK_TIMEOUT, self._reseek) + + def _reseek(self): + self._scale_reseek_timeout_id = -1 + location = long(self.activity.control.hscale.get_value() * \ + self.p_duration / 100) # in ns + self.activity.player.seek(location) + # Allow for a preroll self.activity.player.get_state(timeout=50 * Gst.MSECOND) # 50 ms + return False def __scale_button_release_cb(self, widget, event): - # see seek.cstop_seek - widget.disconnect(self._scale_changed_id) - self._scale_changed_id = -1 + if self._scale_reseek_timeout_id != -1: + GObject.source_remove(self._scale_reseek_timeout_id) + self._scale_reseek_timeout_id = -1 + self._reseek() + + widget.disconnect(self._scale_value_changed_id) + self._scale_value_changed_id = -1 self.button.set_sensitive(True) - if self._seek_timeout_id != -1: - GObject.source_remove(self._seek_timeout_id) - self._seek_timeout_id = -1 - else: - if self.was_playing: - self.activity.player.play() - if self._scale_update_id != -1: - # self.error('Had a previous update timeout id') - pass - else: + if self._was_playing: + self.activity.player.play() + + if self._scale_update_id == -1: self._scale_update_id = GObject.timeout_add( self.SCALE_UPDATE_INTERVAL, self.__update_scale_cb) |