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:
parent
e840bce233
commit
703141c15b
@ -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:
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user