From b796d7c859b7a8f8208aa02d766ac66cb8b0c68f Mon Sep 17 00:00:00 2001 From: Thomas Adamcik Date: Sat, 1 Sep 2012 13:34:16 +0200 Subject: [PATCH] Add create fakemixer element for testing. - GStreamer tests now use this instead of a real mixer. - fakemixer and the autoaudiomixer still need to be moved. - We should probably use a fakesink as output as well. --- mopidy/gstreamer.py | 75 +++++++++++++++++++++++++++++++++++++++- mopidy/utils/__init__.py | 2 +- tests/gstreamer_test.py | 1 + 3 files changed, 76 insertions(+), 2 deletions(-) diff --git a/mopidy/gstreamer.py b/mopidy/gstreamer.py index 60e601f3..17657729 100644 --- a/mopidy/gstreamer.py +++ b/mopidy/gstreamer.py @@ -21,6 +21,8 @@ class GStreamerError(Exception): # TODO: we might want to add some ranking to the mixers we know about? # TODO: move to mixers module and do from mopidy.mixers import * to install # elements. +# TODO: use gst.Bin so we can add the real mixer and have state sync +# automatically. class AutoAudioMixer(gst.Element, gst.ImplementsInterface, gst.interfaces.Mixer): __gstdetails__ = ('AutoAudioMixer', 'Mixer', @@ -31,7 +33,7 @@ class AutoAudioMixer(gst.Element, gst.ImplementsInterface, gst.interfaces.Mixer) gst.Element.__init__(self) self._mixer = self._find_mixer() self._mixer.set_state(gst.STATE_READY) - logger.debug('AutoAudioMixer choose: %s', self._mixer.get_name()) + logger.debug('AutoAudioMixer chose: %s', self._mixer.get_name()) def _find_mixer(self): registry = gst.registry_get_default() @@ -101,6 +103,77 @@ gobject.type_register(AutoAudioMixer) gst.element_register (AutoAudioMixer, 'autoaudiomixer', gst.RANK_MARGINAL) +def create_fake_track(label, min_volume, max_volume, num_channels, flags): + class Track(gst.interfaces.MixerTrack): + def __init__(self): + super(Track, self).__init__() + self.volumes = (100,) * self.num_channels + + @gobject.property + def label(self): + return label + + @gobject.property + def min_volume(self): + return min_volume + + @gobject.property + def max_volume(self): + return max_volume + + @gobject.property + def num_channels(self): + return num_channels + + @gobject.property + def flags(self): + return flags + + return Track() + +class FakeMixer(gst.Element, gst.ImplementsInterface, gst.interfaces.Mixer): + __gstdetails__ = ('FakeMixer', + 'Mixer', + 'Fake mixer for use in tests.', + 'Thomas Adamcik') + + track_label = gobject.property(type=str, default='Master') + + track_min_volume = gobject.property(type=int, default=0) + + track_max_volume = gobject.property(type=int, default=100) + + track_num_channels = gobject.property(type=int, default=2) + + track_flags = gobject.property(type=int, + default=(gst.interfaces.MIXER_TRACK_MASTER | + gst.interfaces.MIXER_TRACK_OUTPUT)) + + def __init__(self): + gst.Element.__init__(self) + + def list_tracks(self): + track = create_fake_track(self.track_label, + self.track_min_volume, + self.track_max_volume, + self.track_num_channels, + self.track_flags) + return [track] + + def get_volume(self, track): + return track.volumes + + def set_volume(self, track, volumes): + track.volumes = volumes + + def set_record(self, track, record): + pass + + +gobject.type_register(FakeMixer) +gst.element_register (FakeMixer, 'fakemixer', gst.RANK_MARGINAL) + + class GStreamer(ThreadingActor): """ Audio output through `GStreamer `_. diff --git a/mopidy/utils/__init__.py b/mopidy/utils/__init__.py index e35c98a4..35ec916a 100644 --- a/mopidy/utils/__init__.py +++ b/mopidy/utils/__init__.py @@ -8,7 +8,7 @@ import sys logger = logging.getLogger('mopidy.utils') -# TODO: user itertools.chain.from_iterable(the_list)? +# TODO: use itertools.chain.from_iterable(the_list)? def flatten(the_list): result = [] for element in the_list: diff --git a/tests/gstreamer_test.py b/tests/gstreamer_test.py index b370981a..9d33901d 100644 --- a/tests/gstreamer_test.py +++ b/tests/gstreamer_test.py @@ -12,6 +12,7 @@ from tests import unittest, path_to_data_dir class GStreamerTest(unittest.TestCase): def setUp(self): settings.BACKENDS = ('mopidy.backends.local.LocalBackend',) + settings.MIXER = 'fakemixer' self.song_uri = path_to_uri(path_to_data_dir('song1.wav')) self.gstreamer = GStreamer()