From f5a923b9d16e4c63942a033d1bdb2ab150aae342 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Mon, 27 Jan 2014 08:20:25 +0100 Subject: OutputAll: convert to class, move instance to class Partition Another big chunk of code for multi-player support. --- src/mixer/MixerAll.cxx | 90 ++++++++++++++++++++------------------------------ src/mixer/MixerAll.hxx | 64 ----------------------------------- src/mixer/Volume.cxx | 26 +++++++++------ src/mixer/Volume.hxx | 10 ++++-- 4 files changed, 57 insertions(+), 133 deletions(-) delete mode 100644 src/mixer/MixerAll.hxx (limited to 'src/mixer') diff --git a/src/mixer/MixerAll.cxx b/src/mixer/MixerAll.cxx index 3cc92baee..483660a45 100644 --- a/src/mixer/MixerAll.cxx +++ b/src/mixer/MixerAll.cxx @@ -18,11 +18,10 @@ */ #include "config.h" -#include "MixerAll.hxx" +#include "output/MultipleOutputs.hxx" #include "MixerControl.hxx" #include "MixerInternal.hxx" #include "MixerList.hxx" -#include "output/OutputAll.hxx" #include "output/OutputInternal.hxx" #include "pcm/Volume.hxx" #include "util/Error.hxx" @@ -34,39 +33,33 @@ static constexpr Domain mixer_domain("mixer"); static int -output_mixer_get_volume(unsigned i) +output_mixer_get_volume(const audio_output &ao) { - struct audio_output *output; - int volume; - - assert(i < audio_output_count()); - - output = audio_output_get(i); - if (!output->enabled) + if (!ao.enabled) return -1; - Mixer *mixer = output->mixer; + Mixer *mixer = ao.mixer; if (mixer == nullptr) return -1; Error error; - volume = mixer_get_volume(mixer, error); + int volume = mixer_get_volume(mixer, error); if (volume < 0 && error.IsDefined()) FormatError(error, "Failed to read mixer for '%s'", - output->name); + ao.name); return volume; } int -mixer_all_get_volume(void) +MultipleOutputs::GetVolume() const { - unsigned count = audio_output_count(), ok = 0; - int volume, total = 0; + unsigned ok = 0; + int total = 0; - for (unsigned i = 0; i < count; i++) { - volume = output_mixer_get_volume(i); + for (auto ao : outputs) { + int volume = output_mixer_get_volume(*ao); if (volume >= 0) { total += volume; ++ok; @@ -80,59 +73,47 @@ mixer_all_get_volume(void) } static bool -output_mixer_set_volume(unsigned i, unsigned volume) +output_mixer_set_volume(audio_output &ao, unsigned volume) { - struct audio_output *output; - bool success; - - assert(i < audio_output_count()); assert(volume <= 100); - output = audio_output_get(i); - if (!output->enabled) + if (!ao.enabled) return false; - Mixer *mixer = output->mixer; + Mixer *mixer = ao.mixer; if (mixer == nullptr) return false; Error error; - success = mixer_set_volume(mixer, volume, error); + bool success = mixer_set_volume(mixer, volume, error); if (!success && error.IsDefined()) FormatError(error, "Failed to set mixer for '%s'", - output->name); + ao.name); return success; } bool -mixer_all_set_volume(unsigned volume) +MultipleOutputs::SetVolume(unsigned volume) { - bool success = false; - unsigned count = audio_output_count(); - assert(volume <= 100); - for (unsigned i = 0; i < count; i++) - success = output_mixer_set_volume(i, volume) + bool success = false; + for (auto ao : outputs) + success = output_mixer_set_volume(*ao, volume) || success; return success; } static int -output_mixer_get_software_volume(unsigned i) +output_mixer_get_software_volume(const audio_output &ao) { - struct audio_output *output; - - assert(i < audio_output_count()); - - output = audio_output_get(i); - if (!output->enabled) + if (!ao.enabled) return -1; - Mixer *mixer = output->mixer; + Mixer *mixer = ao.mixer; if (mixer == nullptr || !mixer->IsPlugin(software_mixer_plugin)) return -1; @@ -140,13 +121,13 @@ output_mixer_get_software_volume(unsigned i) } int -mixer_all_get_software_volume(void) +MultipleOutputs::GetSoftwareVolume() const { - unsigned count = audio_output_count(), ok = 0; - int volume, total = 0; + unsigned ok = 0; + int total = 0; - for (unsigned i = 0; i < count; i++) { - volume = output_mixer_get_software_volume(i); + for (auto ao : outputs) { + int volume = output_mixer_get_software_volume(*ao); if (volume >= 0) { total += volume; ++ok; @@ -160,16 +141,15 @@ mixer_all_get_software_volume(void) } void -mixer_all_set_software_volume(unsigned volume) +MultipleOutputs::SetSoftwareVolume(unsigned volume) { - unsigned count = audio_output_count(); - assert(volume <= PCM_VOLUME_1); - for (unsigned i = 0; i < count; i++) { - struct audio_output *output = audio_output_get(i); - if (output->mixer != nullptr && - output->mixer->plugin == &software_mixer_plugin) - mixer_set_volume(output->mixer, volume, IgnoreError()); + for (auto ao : outputs) { + const auto mixer = ao->mixer; + + if (mixer != nullptr && + mixer->plugin == &software_mixer_plugin) + mixer_set_volume(mixer, volume, IgnoreError()); } } diff --git a/src/mixer/MixerAll.hxx b/src/mixer/MixerAll.hxx deleted file mode 100644 index f868f64b5..000000000 --- a/src/mixer/MixerAll.hxx +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (C) 2003-2014 The Music Player Daemon Project - * http://www.musicpd.org - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -/** \file - * - * Functions which affect the mixers of all audio outputs. - */ - -#ifndef MPD_MIXER_ALL_HXX -#define MPD_MIXER_ALL_HXX - -#include "Compiler.h" - -/** - * Returns the average volume of all available mixers (range 0..100). - * Returns -1 if no mixer can be queried. - */ -gcc_pure -int -mixer_all_get_volume(void); - -/** - * Sets the volume on all available mixers. - * - * @param volume the volume (range 0..100) - * @return true on success, false on failure - */ -bool -mixer_all_set_volume(unsigned volume); - -/** - * Similar to mixer_all_get_volume(), but gets the volume only for - * software mixers. See #software_mixer_plugin. This function fails - * if no software mixer is configured. - */ -gcc_pure -int -mixer_all_get_software_volume(void); - -/** - * Similar to mixer_all_set_volume(), but sets the volume only for - * software mixers. See #software_mixer_plugin. This function cannot - * fail, because the underlying software mixers cannot fail either. - */ -void -mixer_all_set_software_volume(unsigned volume); - -#endif diff --git a/src/mixer/Volume.cxx b/src/mixer/Volume.cxx index 4c897b21f..aaae5d9ee 100644 --- a/src/mixer/Volume.cxx +++ b/src/mixer/Volume.cxx @@ -19,7 +19,7 @@ #include "config.h" #include "Volume.hxx" -#include "MixerAll.hxx" +#include "output/MultipleOutputs.hxx" #include "Idle.hxx" #include "GlobalEvents.hxx" #include "util/StringUtil.hxx" @@ -59,36 +59,40 @@ void volume_init(void) GlobalEvents::Register(GlobalEvents::MIXER, mixer_event_callback); } -int volume_level_get(void) +int +volume_level_get(const MultipleOutputs &outputs) { if (last_hardware_volume >= 0 && !hardware_volume_clock.CheckUpdate(1000)) /* throttle access to hardware mixers */ return last_hardware_volume; - last_hardware_volume = mixer_all_get_volume(); + last_hardware_volume = outputs.GetVolume(); return last_hardware_volume; } -static bool software_volume_change(unsigned volume) +static bool +software_volume_change(MultipleOutputs &outputs, unsigned volume) { assert(volume <= 100); volume_software_set = volume; - mixer_all_set_software_volume(volume); + outputs.SetSoftwareVolume(volume); return true; } -static bool hardware_volume_change(unsigned volume) +static bool +hardware_volume_change(MultipleOutputs &outputs, unsigned volume) { /* reset the cache */ last_hardware_volume = -1; - return mixer_all_set_volume(volume); + return outputs.SetVolume(volume); } -bool volume_level_change(unsigned volume) +bool +volume_level_change(MultipleOutputs &outputs, unsigned volume) { assert(volume <= 100); @@ -96,11 +100,11 @@ bool volume_level_change(unsigned volume) idle_add(IDLE_MIXER); - return hardware_volume_change(volume); + return hardware_volume_change(outputs, volume); } bool -read_sw_volume_state(const char *line) +read_sw_volume_state(const char *line, MultipleOutputs &outputs) { char *end = nullptr; long int sv; @@ -111,7 +115,7 @@ read_sw_volume_state(const char *line) line += sizeof(SW_VOLUME_STATE) - 1; sv = strtol(line, &end, 10); if (*end == 0 && sv >= 0 && sv <= 100) - software_volume_change(sv); + software_volume_change(outputs, sv); else FormatWarning(volume_domain, "Can't parse software volume: %s", line); diff --git a/src/mixer/Volume.hxx b/src/mixer/Volume.hxx index 06d3551eb..b86328d88 100644 --- a/src/mixer/Volume.hxx +++ b/src/mixer/Volume.hxx @@ -24,15 +24,19 @@ #include +class MultipleOutputs; + void volume_init(void); gcc_pure -int volume_level_get(void); +int +volume_level_get(const MultipleOutputs &outputs); -bool volume_level_change(unsigned volume); +bool +volume_level_change(MultipleOutputs &outputs, unsigned volume); bool -read_sw_volume_state(const char *line); +read_sw_volume_state(const char *line, MultipleOutputs &outputs); void save_sw_volume_state(FILE *fp); -- cgit v1.2.3