core: Trigger position changed from audio events.

Makes sure to only fire when the position changed to our intended seek target.
Otherwise we would also be triggering this when playback starts.
This commit is contained in:
Thomas Adamcik 2015-12-03 23:00:52 +01:00
parent e74eafb38a
commit aeb881896b
3 changed files with 14 additions and 4 deletions

View File

@ -90,6 +90,9 @@ class Core(
def stream_changed(self, uri): def stream_changed(self, uri):
self.playback._on_stream_changed(uri) self.playback._on_stream_changed(uri)
def position_changed(self, position):
self.playback._on_position_changed(position)
def state_changed(self, old_state, new_state, target_state): def state_changed(self, old_state, new_state, target_state):
# XXX: This is a temporary fix for issue #232 while we wait for a more # XXX: This is a temporary fix for issue #232 while we wait for a more
# permanent solution with the implementation of issue #234. When the # permanent solution with the implementation of issue #234. When the

View File

@ -26,6 +26,7 @@ class PlaybackController(object):
self._current_tl_track = None self._current_tl_track = None
self._pending_tl_track = None self._pending_tl_track = None
self._pending_position = None
self._last_position = None self._last_position = None
self._previous = False self._previous = False
@ -220,6 +221,11 @@ class PlaybackController(object):
self.set_state(PlaybackState.PLAYING) self.set_state(PlaybackState.PLAYING)
self._trigger_track_playback_started() self._trigger_track_playback_started()
def _on_position_changed(self, position):
if self._pending_position == position:
self._trigger_seeked(position)
self._pending_position = None
def _on_about_to_finish_callback(self): def _on_about_to_finish_callback(self):
"""Callback that performs a blocking actor call to the real callback. """Callback that performs a blocking actor call to the real callback.
@ -455,14 +461,12 @@ class PlaybackController(object):
self.next() self.next()
return True return True
self._pending_position = time_position
backend = self._get_backend(self.get_current_tl_track()) backend = self._get_backend(self.get_current_tl_track())
if not backend: if not backend:
return False return False
success = backend.playback.seek(time_position).get() return backend.playback.seek(time_position).get()
if success:
self._trigger_seeked(time_position)
return success
def stop(self): def stop(self):
"""Stop playing.""" """Stop playing."""

View File

@ -434,6 +434,7 @@ class EventEmissionTest(BaseTest):
self.core.playback.play(tl_tracks[0]) self.core.playback.play(tl_tracks[0])
self.replay_events() self.replay_events()
self.core.playback.seek(1000) self.core.playback.seek(1000)
self.replay_events()
listener_mock.reset_mock() listener_mock.reset_mock()
self.core.playback.stop() self.core.playback.stop()
@ -456,6 +457,7 @@ class EventEmissionTest(BaseTest):
self.core.playback.play(tl_tracks[0]) self.core.playback.play(tl_tracks[0])
self.replay_events() self.replay_events()
self.core.playback.seek(1000) self.core.playback.seek(1000)
self.replay_events()
listener_mock.reset_mock() listener_mock.reset_mock()
self.core.playback.next() self.core.playback.next()
@ -504,6 +506,7 @@ class EventEmissionTest(BaseTest):
listener_mock.reset_mock() listener_mock.reset_mock()
self.core.playback.seek(1000) self.core.playback.seek(1000)
self.replay_events()
listener_mock.send.assert_called_once_with( listener_mock.send.assert_called_once_with(
'seeked', time_position=1000) 'seeked', time_position=1000)