From 703141c15b214edaff14a73a476db5def3472042 Mon Sep 17 00:00:00 2001 From: Thomas Adamcik Date: Sat, 1 Sep 2012 01:32:52 +0200 Subject: [PATCH] Make sure bad data to OUTPUT does not deadlock. - Moves GStreamer initialization out of on-start as it is not obvious to me how to stop rest of setup on other ways. - Note that gst.GError != gobject.GError as far as except is concerned. --- mopidy/core.py | 4 +++- mopidy/gstreamer.py | 13 +++++++++++-- tests/gstreamer_test.py | 6 +++++- 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/mopidy/core.py b/mopidy/core.py index 596e0fe5..ddbf9b8b 100644 --- a/mopidy/core.py +++ b/mopidy/core.py @@ -20,7 +20,7 @@ sys.argv[1:] = gstreamer_args from mopidy import (get_version, settings, OptionalDependencyError, SettingsError, DATA_PATH, SETTINGS_PATH, SETTINGS_FILE) -from mopidy.gstreamer import GStreamer +from mopidy.gstreamer import GStreamer, GStreamerError from mopidy.utils import get_class from mopidy.utils.log import setup_logging from mopidy.utils.path import get_or_create_folder, get_or_create_file @@ -45,6 +45,8 @@ def main(): loop.run() except SettingsError as e: logger.error(e.message) + except GStreamerError as e: + logger.error(e) except KeyboardInterrupt: logger.info(u'Interrupted. Exiting...') except Exception as e: diff --git a/mopidy/gstreamer.py b/mopidy/gstreamer.py index 0dd02937..8d349fcc 100644 --- a/mopidy/gstreamer.py +++ b/mopidy/gstreamer.py @@ -1,5 +1,6 @@ import pygst pygst.require('0.10') +import gobject import gst import logging @@ -13,6 +14,10 @@ from mopidy.backends.base import Backend logger = logging.getLogger('mopidy.gstreamer') +class GStreamerError(Exception): + pass + + class GStreamer(ThreadingActor): """ Audio output through `GStreamer `_. @@ -39,7 +44,6 @@ class GStreamer(ThreadingActor): self._volume = None self._output = None - def on_start(self): self._setup_pipeline() self._setup_output() self._setup_message_processor() @@ -61,7 +65,12 @@ class GStreamer(ThreadingActor): self._pipeline.get_by_name('convert').get_pad('sink')) def _setup_output(self): - self._output = gst.parse_bin_from_description(settings.OUTPUT, True) + try: + self._output = gst.parse_bin_from_description(settings.OUTPUT, True) + except gobject.GError as e: + raise GStreamerError('%r while creating %r' % (e.message, + settings.OUTPUT)) + self._pipeline.add(self._output) gst.element_link_many(self._volume, self._output) logger.debug('Output set to %s', settings.OUTPUT) diff --git a/tests/gstreamer_test.py b/tests/gstreamer_test.py index 012c9002..b370981a 100644 --- a/tests/gstreamer_test.py +++ b/tests/gstreamer_test.py @@ -14,7 +14,6 @@ class GStreamerTest(unittest.TestCase): settings.BACKENDS = ('mopidy.backends.local.LocalBackend',) self.song_uri = path_to_uri(path_to_data_dir('song1.wav')) self.gstreamer = GStreamer() - self.gstreamer.on_start() def prepare_uri(self, uri): self.gstreamer.prepare_change() @@ -71,3 +70,8 @@ class GStreamerTest(unittest.TestCase): @unittest.SkipTest def test_set_position(self): pass # TODO + + @unittest.SkipTest + def test_invalid_output_raises_error(self): + pass # TODO +