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.
This commit is contained in:
Thomas Adamcik 2012-09-01 01:32:52 +02:00
parent e840bce233
commit 703141c15b
3 changed files with 19 additions and 4 deletions

View File

@ -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:

View File

@ -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 <http://gstreamer.freedesktop.org/>`_.
@ -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)

View File

@ -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