From 2b018606805e611e298573e730bc25d12a530244 Mon Sep 17 00:00:00 2001 From: Thomas Adamcik Date: Sat, 1 Sep 2012 14:01:11 +0200 Subject: [PATCH] Make it possible to override GStreamer settings in tests. - Specifically you can now pass in values instead of relying on global settings. --- mopidy/gstreamer.py | 34 +++++++++++++++++++--------------- tests/gstreamer_test.py | 5 +++-- 2 files changed, 22 insertions(+), 17 deletions(-) diff --git a/mopidy/gstreamer.py b/mopidy/gstreamer.py index 17657729..74b66410 100644 --- a/mopidy/gstreamer.py +++ b/mopidy/gstreamer.py @@ -131,6 +131,7 @@ def create_fake_track(label, min_volume, max_volume, num_channels, flags): return Track() + class FakeMixer(gst.Element, gst.ImplementsInterface, gst.interfaces.Mixer): __gstdetails__ = ('FakeMixer', 'Mixer', @@ -181,10 +182,12 @@ class GStreamer(ThreadingActor): **Settings:** - :attr:`mopidy.settings.OUTPUT` + - :attr:`mopidy.settings.MIXER` + - :attr:`mopidy.settings.MIXER_TRACK` """ - def __init__(self): + def __init__(self, output=None, mixer=None, mixer_track=None): super(GStreamer, self).__init__() self._default_caps = gst.Caps(""" audio/x-raw-int, @@ -201,8 +204,9 @@ class GStreamer(ThreadingActor): self._mixer = None self._setup_pipeline() - self._setup_output() - self._setup_mixer() + self._setup_output(output or settings.OUTPUT) + self._setup_mixer(mixer or settings.MIXER, + mixer_track or settings.MIXER_TRACK) self._setup_message_processor() def _setup_pipeline(self): @@ -223,29 +227,29 @@ class GStreamer(ThreadingActor): self._uridecodebin.connect('pad-added', self._on_new_pad, self._pipeline.get_by_name('queue').get_pad('sink')) - def _setup_output(self): + def _setup_output(self, output_description): try: - self._output = gst.parse_bin_from_description(settings.OUTPUT, True) + self._output = gst.parse_bin_from_description(output_description, True) except gobject.GError as e: raise GStreamerError('%r while creating %r' % (e.message, - settings.OUTPUT)) + output_description)) self._pipeline.add(self._output) gst.element_link_many(self._pipeline.get_by_name('queue'), self._output) - logger.debug('Output set to %s', settings.OUTPUT) + logger.debug('Output set to %s', output_description) - def _setup_mixer(self): - if not settings.MIXER: + def _setup_mixer(self, mixer_element, track_label): + if not mixer_element: logger.debug('Not adding mixer.') return - mixer = gst.element_factory_make(settings.MIXER) + mixer = gst.element_factory_make(mixer_element) if mixer.set_state(gst.STATE_READY) != gst.STATE_CHANGE_SUCCESS: - logger.warning('Adding mixer %r failed.', settings.MIXER) + logger.warning('Adding mixer %r failed.', mixer_element) return - track = self._select_mixer_track(mixer) + track = self._select_mixer_track(mixer, track_label) if not track: logger.warning('Could not find usable mixer track.') return @@ -254,12 +258,12 @@ class GStreamer(ThreadingActor): logger.info('Mixer set to %s using %s', mixer.get_factory().get_name(), track.label) - def _select_mixer_track(self, mixer): + def _select_mixer_track(self, mixer, track_label): # Look for track with label == MIXER_TRACK, otherwise fallback to # master track which is also an output. for track in mixer.list_tracks(): - if settings.MIXER_TRACK: - if track.label == settings.MIXER_TRACK: + if track_label: + if track.label == track_label: return track elif track.flags & (gst.interfaces.MIXER_TRACK_MASTER | gst.interfaces.MIXER_TRACK_OUTPUT): diff --git a/tests/gstreamer_test.py b/tests/gstreamer_test.py index 9d33901d..a4f740b4 100644 --- a/tests/gstreamer_test.py +++ b/tests/gstreamer_test.py @@ -11,10 +11,11 @@ from tests import unittest, path_to_data_dir 'Our Windows build server does not support GStreamer yet') class GStreamerTest(unittest.TestCase): def setUp(self): + # TODO: does this modify global settings without reseting it? + # TODO: should use a fake backend stub for this test? settings.BACKENDS = ('mopidy.backends.local.LocalBackend',) - settings.MIXER = 'fakemixer' self.song_uri = path_to_uri(path_to_data_dir('song1.wav')) - self.gstreamer = GStreamer() + self.gstreamer = GStreamer(mixer='fakemixer') def prepare_uri(self, uri): self.gstreamer.prepare_change()