From 03b836ed64d7e6d04f6e70084e04f5cbf3ea7eb9 Mon Sep 17 00:00:00 2001 From: Thomas Adamcik Date: Sat, 1 Sep 2012 15:04:22 +0200 Subject: [PATCH] Removed autoaudiosink's device selection. The way this code was testing devices locked the element to using the wrong device. The incorrect device had a max volume of 39 on the Master track, really making accurate volume changes impossible. Instead of trying to make any guesses about this I'm leaving it to the element to have sensible defaults. Code will also ensure that it returns a newly created copy of the mixer, not one we have already used. --- mopidy/gstreamer.py | 40 ++++++++++++++++------------------------ 1 file changed, 16 insertions(+), 24 deletions(-) diff --git a/mopidy/gstreamer.py b/mopidy/gstreamer.py index bc0058dd..3c5f4ed3 100644 --- a/mopidy/gstreamer.py +++ b/mopidy/gstreamer.py @@ -49,42 +49,34 @@ class AutoAudioMixer(gst.Element, gst.ImplementsInterface, gst.interfaces.Mixer) elif not factory.has_interface('GstMixer'): continue - element = factory.create() - if not element: - continue + if self._test_mixer(factory): + return factory.create() - # Element has devices, try each one. - if hasattr(element, 'probe_get_values_name'): - devices = element.probe_get_values_name('device') + return None - for device in devices: - element.set_property('device', device) - if self._check_mixer(element): - return element + def _test_mixer(self, factory): + element = factory.create() + if not element: + return False - # Otherwise just test it as is. - elif self._check_mixer(element): - return element - - def _check_mixer(self, element): try: - # Only allow elements that succesfully become ready. result = element.set_state(gst.STATE_READY) if result != gst.STATE_CHANGE_SUCCESS: return False - # Only allow elements that have a least one output track. - output_flag = gst.interfaces.MIXER_TRACK_OUTPUT - return bool(self._find_track(element, output_flag)) + # Trust that the default device is sane and just check tracks. + return self._test_tracks(element) finally: element.set_state(gst.STATE_NULL) - def _find_track(self, element, flags): - # Return first track that matches flags. + def _test_tracks(self, element): + # Only allow elements that have a least one output track. + flags = gst.interfaces.MIXER_TRACK_OUTPUT + for track in element.list_tracks(): if track.flags & flags: - return track - return None + return True + return False def list_tracks(self): return self._mixer.list_tracks() @@ -452,7 +444,7 @@ class GStreamer(ThreadingActor): 100 == max volume for given system. None == no mixer present, i.e. volume unknown. - :rtype: int in range [0..100] + :rtype: int in range [0..100] or :class:`None` """ if self._mixer is None: return None