diff --git a/mopidy/backends/gstreamer.py b/mopidy/backends/gstreamer.py index c945c684..9572882b 100644 --- a/mopidy/backends/gstreamer.py +++ b/mopidy/backends/gstreamer.py @@ -1,6 +1,8 @@ import logging import gst +import gobject +import thread from mopidy.models import Track, Playlist from mopidy.backends import (BaseBackend, @@ -9,6 +11,14 @@ from mopidy.backends import (BaseBackend, logger = logging.getLogger(u'backends.gstreamer') +def loop(): + gobject.threads_init() + + while True: + gobject.MainLoop().get_context().iteration(True) + +thread.start_new_thread(loop, tuple()) + class GStreamerBackend(BaseBackend): def __init__(self, *args, **kwargs): super(GStreamerBackend, self).__init__(*args, **kwargs) @@ -36,6 +46,9 @@ class GStreamerPlaybackController(BasePlaybackController): sink = gst.element_factory_make("fakesink", "fakesink") self.bin.set_property("video-sink", sink) + self.bus.add_signal_watch() + self.bus.connect('message', self._message) + self.stop() def _set_state(self, state): @@ -50,6 +63,10 @@ class GStreamerPlaybackController(BasePlaybackController): elif new == gst.STATE_PAUSED: self.state = self.PAUSED + def _message(self, bus, message): + if message.type == gst.MESSAGE_EOS: + self.next() + def play(self, track=None, position=None): playlist = self.backend.current_playlist.playlist @@ -107,4 +124,5 @@ class GStreamerPlaybackController(BasePlaybackController): def destroy(self): self.bin.set_state(gst.STATE_NULL) + self.bus.remove_signal_watch() del self.bin diff --git a/tests/backends/basetests.py b/tests/backends/basetests.py index fac3927e..d6b3ab1b 100644 --- a/tests/backends/basetests.py +++ b/tests/backends/basetests.py @@ -662,8 +662,13 @@ class BasePlaybackControllerTest(object): def test_previous_track_with_shuffle(self): raise NotImplementedError + @populate_playlist def test_end_of_song_starts_next_track(self): - raise NotImplementedError + tracks = self.backend.current_playlist.playlist.tracks + self.playback.play() + self.playback.seek(tracks[0].length - 10) + time.sleep(0.1) + self.assertEqual(self.playback.current_track, tracks[1]) def test_end_of_playlist_stops(self): raise NotImplementedError