mixer/null: new mixer plugin

This commit is contained in:
Max Kellermann 2014-12-02 18:16:33 +01:00
parent f2bd2c318c
commit 0debba0f6e
8 changed files with 84 additions and 2 deletions

View File

@ -1256,6 +1256,7 @@ MIXER_API_SRC = \
src/mixer/MixerInternal.hxx src/mixer/MixerInternal.hxx
libmixer_plugins_a_SOURCES = \ libmixer_plugins_a_SOURCES = \
src/mixer/plugins/NullMixerPlugin.cxx \
src/mixer/plugins/SoftwareMixerPlugin.cxx \ src/mixer/plugins/SoftwareMixerPlugin.cxx \
src/mixer/plugins/SoftwareMixerPlugin.hxx src/mixer/plugins/SoftwareMixerPlugin.hxx
libmixer_plugins_a_CPPFLAGS = $(AM_CPPFLAGS) \ libmixer_plugins_a_CPPFLAGS = $(AM_CPPFLAGS) \

2
NEWS
View File

@ -7,6 +7,8 @@ ver 0.20 (not yet released)
- ape: drop support for non-standard tag "album artist" - ape: drop support for non-standard tag "album artist"
* output * output
- pulse: set channel map to WAVE-EX - pulse: set channel map to WAVE-EX
* mixer
- null: new plugin
* reset song priority on playback * reset song priority on playback
ver 0.19.5 (2014/11/26) ver 0.19.5 (2014/11/26)

View File

@ -572,7 +572,7 @@ systemctl start mpd.socket</programlisting>
<row> <row>
<entry> <entry>
<varname>mixer_type</varname> <varname>mixer_type</varname>
<parameter>hardware|software|none</parameter> <parameter>hardware|software|null|none</parameter>
</entry> </entry>
<entry> <entry>
Specifies which mixer should be used for this audio Specifies which mixer should be used for this audio
@ -580,7 +580,9 @@ systemctl start mpd.socket</programlisting>
linkend="alsa_output">ALSA</link>, <link linkend="alsa_output">ALSA</link>, <link
linkend="oss_output">OSS</link> and <link linkend="oss_output">OSS</link> and <link
linkend="pulse_output">PulseAudio</link>), the linkend="pulse_output">PulseAudio</link>), the
software mixer or no mixer software mixer, the "null" mixer
(<parameter>null</parameter>; allows setting the
volume, but with no effect) or no mixer
(<parameter>none</parameter>). By default, the (<parameter>none</parameter>). By default, the
hardware mixer is used for devices which support it, hardware mixer is used for devices which support it,
and none for the others. and none for the others.

View File

@ -27,6 +27,7 @@
struct MixerPlugin; struct MixerPlugin;
extern const MixerPlugin null_mixer_plugin;
extern const MixerPlugin software_mixer_plugin; extern const MixerPlugin software_mixer_plugin;
extern const MixerPlugin alsa_mixer_plugin; extern const MixerPlugin alsa_mixer_plugin;
extern const MixerPlugin oss_mixer_plugin; extern const MixerPlugin oss_mixer_plugin;

View File

@ -34,6 +34,8 @@ mixer_type_parse(const char *input)
return MixerType::HARDWARE; return MixerType::HARDWARE;
else if (strcmp(input, "software") == 0) else if (strcmp(input, "software") == 0)
return MixerType::SOFTWARE; return MixerType::SOFTWARE;
else if (strcmp(input, "null") == 0)
return MixerType::NULL_;
else else
return MixerType::UNKNOWN; return MixerType::UNKNOWN;
} }

View File

@ -27,6 +27,9 @@ enum class MixerType {
/** mixer disabled */ /** mixer disabled */
NONE, NONE,
/** "null" mixer (virtual fake) */
NULL_,
/** software mixer with pcm_volume() */ /** software mixer with pcm_volume() */
SOFTWARE, SOFTWARE,

View File

@ -0,0 +1,67 @@
/*
* 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.
*/
#include "config.h"
#include "mixer/MixerInternal.hxx"
class NullMixer final : public Mixer {
/**
* The current volume in percent (0..100).
*/
unsigned volume;
public:
NullMixer(MixerListener &_listener)
:Mixer(null_mixer_plugin, _listener),
volume(100)
{
}
/* virtual methods from class Mixer */
bool Open(gcc_unused Error &error) override {
return true;
}
void Close() override {
}
int GetVolume(gcc_unused Error &error) override {
return volume;
}
bool SetVolume(unsigned _volume, gcc_unused Error &error) override {
volume = _volume;
return true;
}
};
static Mixer *
null_mixer_init(gcc_unused EventLoop &event_loop,
gcc_unused AudioOutput &ao,
MixerListener &listener,
gcc_unused const config_param &param,
gcc_unused Error &error)
{
return new NullMixer(listener);
}
const MixerPlugin null_mixer_plugin = {
null_mixer_init,
true,
};

View File

@ -126,6 +126,10 @@ audio_output_load_mixer(EventLoop &event_loop, AudioOutput &ao,
case MixerType::UNKNOWN: case MixerType::UNKNOWN:
return nullptr; return nullptr;
case MixerType::NULL_:
return mixer_new(event_loop, null_mixer_plugin, ao, listener,
param, error);
case MixerType::HARDWARE: case MixerType::HARDWARE:
if (plugin == nullptr) if (plugin == nullptr)
return nullptr; return nullptr;