diff --git a/mopidy/outputs/gstreamer.py b/mopidy/outputs/gstreamer.py index 44e12afb..332f2beb 100644 --- a/mopidy/outputs/gstreamer.py +++ b/mopidy/outputs/gstreamer.py @@ -42,8 +42,11 @@ class GStreamerProcess(BaseProcess): http://jameswestby.net/weblog/tech/14-caution-python-multiprocessing-and-glib-dont-mix.html. """ - pipeline_description = \ - 'appsrc name=data ! volume name=volume ! autoaudiosink name=sink' + pipeline_description = ' ! '.join([ + 'appsrc name=src uridecodebin name=uri', + 'volume name=volume', + 'autoaudiosink name=sink', + ]) def __init__(self, core_queue, output_queue): super(GStreamerProcess, self).__init__() @@ -52,10 +55,9 @@ class GStreamerProcess(BaseProcess): self.gst_pipeline = None self.gst_bus = None self.gst_bus_id = None - self.gst_uri_src = None + self.gst_uri_bin = None self.gst_data_src = None self.gst_volume = None - self.gst_sink = None def run_inside_try(self): self.setup() @@ -72,9 +74,9 @@ class GStreamerProcess(BaseProcess): messages_thread.start() self.gst_pipeline = gst.parse_launch(self.pipeline_description) - self.gst_data_src = self.gst_pipeline.get_by_name('data') + self.gst_data_src = self.gst_pipeline.get_by_name('src') + self.gst_uri_bin = self.gst_pipeline.get_by_name('uri') self.gst_volume = self.gst_pipeline.get_by_name('volume') - self.gst_sink = self.gst_pipeline.get_by_name('sink') # Setup bus and message processor self.gst_bus = self.gst_pipeline.get_bus() @@ -121,9 +123,8 @@ class GStreamerProcess(BaseProcess): def play_uri(self, uri): """Play audio at URI""" self.set_state('READY') - self.gst_uri_src.set_property('uri', uri) - self.set_state('PLAYING') - # TODO Return status + self.gst_uri_bin.set_property('uri', uri) + return self.set_state('PLAYING') def deliver_data(self, caps_string, data): """Deliver audio data to be played""" diff --git a/tests/backends/local_test.py b/tests/backends/local_test.py index 23a12bca..a5222276 100644 --- a/tests/backends/local_test.py +++ b/tests/backends/local_test.py @@ -19,6 +19,7 @@ from tests import SkipTest, data_folder song = data_folder('song%s.wav') generate_song = lambda i: path_to_uri(song % i) +raise SkipTest # FIXME can be switched to generic test class LocalCurrentPlaylistControllerTest(BaseCurrentPlaylistControllerTest, diff --git a/tests/outputs/__init__.py b/tests/outputs/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/outputs/gstreamer_test.py b/tests/outputs/gstreamer_test.py new file mode 100644 index 00000000..f483a68a --- /dev/null +++ b/tests/outputs/gstreamer_test.py @@ -0,0 +1,56 @@ +import multiprocessing +import unittest + +from mopidy.utils import path_to_uri +from mopidy.process import pickle_connection +from mopidy.outputs.gstreamer import GStreamerOutput + +from tests import data_folder, SkipTest + +class GStreamerOutputTest(unittest.TestCase): + def setUp(self): + self.song_uri = path_to_uri(data_folder('song1.wav')) + self.output_queue = multiprocessing.Queue() + self.core_queue = multiprocessing.Queue() + self.output = GStreamerOutput(self.core_queue, self.output_queue) + + def tearDown(self): + self.output.destroy() + + def send_recv(self, message): + (my_end, other_end) = multiprocessing.Pipe() + message.update({'reply_to': pickle_connection(other_end)}) + self.output_queue.put(message) + my_end.poll(None) + return my_end.recv() + + def send(self, message): + self.output_queue.put(message) + + def test_play_uri_existing_file(self): + message = {'command': 'play_uri', 'uri': self.song_uri} + self.assertEqual(True, self.send_recv(message)) + + def test_play_uri_non_existing_file(self): + message = {'command': 'play_uri', 'uri': self.song_uri + 'bogus'} + self.assertEqual(False, self.send_recv(message)) + + def test_default_get_volume_result(self): + message = {'command': 'get_volume'} + self.assertEqual(100, self.send_recv(message)) + + def test_set_volume(self): + self.send({'command': 'set_volume', 'volume': 50}) + self.assertEqual(50, self.send_recv({'command': 'get_volume'})) + + def test_set_volume_to_zero(self): + self.send({'command': 'set_volume', 'volume': 0}) + self.assertEqual(0, self.send_recv({'command': 'get_volume'})) + + def test_set_volume_to_one_hundred(self): + self.send({'command': 'set_volume', 'volume': 100}) + self.assertEqual(100, self.send_recv({'command': 'get_volume'})) + + @SkipTest + def test_set_state(self): + raise NotImplementedError