diff --git a/docs/config.rst b/docs/config.rst index 63e62622..3872ecd3 100644 --- a/docs/config.rst +++ b/docs/config.rst @@ -80,6 +80,17 @@ Core configuration values Setting the config value to blank turns off volume control. + +.. confval:: audio/mixer_volume + + Audio mixer initial volume. + + Expects an Integer between 0 and 100. + + Sets the initial volume of the audio mixer. Setting the config value to blank + sets the initial volume for the software mixer to 100. + + .. confval:: audio/mixer_track Audio mixer track to use. diff --git a/mopidy/audio/actor.py b/mopidy/audio/actor.py index feeee820..ca023125 100644 --- a/mopidy/audio/actor.py +++ b/mopidy/audio/actor.py @@ -184,6 +184,7 @@ class Audio(pykka.ThreadingActor): def _setup_mixer(self): mixer_desc = self._config['audio']['mixer'] track_desc = self._config['audio']['mixer_track'] + volume = self._config['audio']['mixer_volume'] if mixer_desc is None: logger.info('Not setting up audio mixer') @@ -192,6 +193,9 @@ class Audio(pykka.ThreadingActor): if mixer_desc == 'software': self._software_mixing = True logger.info('Audio mixer is using software mixing') + if volume is not None: + self.set_volume(volume) + logger.info('Audio mixer volume set to %d', volume) return try: @@ -223,11 +227,16 @@ class Audio(pykka.ThreadingActor): self._mixer_track = track self._mixer_scale = ( self._mixer_track.min_volume, self._mixer_track.max_volume) + logger.info( 'Audio mixer set to "%s" using track "%s"', str(mixer.get_factory().get_name()).decode('utf-8'), str(track.label).decode('utf-8')) + if volume is not None: + self.set_volume(volume) + logger.info('Audio mixer volume set to %d', volume) + def _select_mixer_track(self, mixer, track_label): # Ignore tracks without volumes, then look for track with # label equal to the audio/mixer_track config value, otherwise fallback diff --git a/mopidy/config/__init__.py b/mopidy/config/__init__.py index d6400fad..2b740549 100644 --- a/mopidy/config/__init__.py +++ b/mopidy/config/__init__.py @@ -25,6 +25,7 @@ _loglevels_schema = LogLevelConfigSchema('loglevels') _audio_schema = ConfigSchema('audio') _audio_schema['mixer'] = String() _audio_schema['mixer_track'] = String(optional=True) +_audio_schema['mixer_volume'] = Integer(optional=True, minimum=0, maximum=100) _audio_schema['output'] = String() _audio_schema['visualizer'] = String(optional=True) diff --git a/mopidy/config/convert.py b/mopidy/config/convert.py index 7012b56e..a3ae5273 100644 --- a/mopidy/config/convert.py +++ b/mopidy/config/convert.py @@ -36,6 +36,7 @@ def convert(settings): helper('audio/mixer', 'MIXER') helper('audio/mixer_track', 'MIXER_TRACK') + helper('audio/mixer_volume', 'MIXER_VOLUME') helper('audio/output', 'OUTPUT') helper('proxy/hostname', 'SPOTIFY_PROXY_HOST') diff --git a/mopidy/config/default.conf b/mopidy/config/default.conf index 0ca9597d..839c983d 100644 --- a/mopidy/config/default.conf +++ b/mopidy/config/default.conf @@ -7,6 +7,7 @@ config_file = [audio] mixer = software mixer_track = +mixer_volume = output = autoaudiosink visualizer = diff --git a/tests/audio/actor_test.py b/tests/audio/actor_test.py index eac299cf..3f7e56ce 100644 --- a/tests/audio/actor_test.py +++ b/tests/audio/actor_test.py @@ -23,6 +23,7 @@ class AudioTest(unittest.TestCase): 'audio': { 'mixer': 'fakemixer track_max_volume=65536', 'mixer_track': None, + 'mixer_volume': None, 'output': 'fakesink', 'visualizer': None, } @@ -73,6 +74,7 @@ class AudioTest(unittest.TestCase): 'audio': { 'mixer': 'fakemixer track_max_volume=40', 'mixer_track': None, + 'mixer_volume': None, 'output': 'fakesink', 'visualizer': None, } @@ -88,6 +90,7 @@ class AudioTest(unittest.TestCase): 'audio': { 'mixer': 'fakemixer track_max_volume=0', 'mixer_track': None, + 'mixer_volume': None, 'output': 'fakesink', 'visualizer': None, }