aboutsummaryrefslogtreecommitdiffstats
path: root/src/mixer/plugins
diff options
context:
space:
mode:
authorMax Kellermann <max@duempel.org>2014-02-05 23:20:33 +0100
committerMax Kellermann <max@duempel.org>2014-02-19 21:40:14 +0100
commit8d6fedf8177d0d2ced81e6d93d35c368b2ac69db (patch)
tree17890432eb5d7f6cbdf5feb32a0105dc6f9d8974 /src/mixer/plugins
parentf4f8fa7c947af10235d1cdd70b294a3b8810c6f4 (diff)
downloadmpd-8d6fedf8177d0d2ced81e6d93d35c368b2ac69db.tar.gz
mpd-8d6fedf8177d0d2ced81e6d93d35c368b2ac69db.tar.xz
mpd-8d6fedf8177d0d2ced81e6d93d35c368b2ac69db.zip
Mixer: add class MixerListener
Use a listener interface instead of GlobalEvents.
Diffstat (limited to '')
-rw-r--r--src/mixer/plugins/AlsaMixerPlugin.cxx22
-rw-r--r--src/mixer/plugins/OssMixerPlugin.cxx6
-rw-r--r--src/mixer/plugins/PulseMixerPlugin.cxx15
-rw-r--r--src/mixer/plugins/RoarMixerPlugin.cxx9
-rw-r--r--src/mixer/plugins/SoftwareMixerPlugin.cxx7
-rw-r--r--src/mixer/plugins/WinmmMixerPlugin.cxx7
6 files changed, 40 insertions, 26 deletions
diff --git a/src/mixer/plugins/AlsaMixerPlugin.cxx b/src/mixer/plugins/AlsaMixerPlugin.cxx
index 26007fef3..cd787182a 100644
--- a/src/mixer/plugins/AlsaMixerPlugin.cxx
+++ b/src/mixer/plugins/AlsaMixerPlugin.cxx
@@ -19,8 +19,8 @@
#include "config.h"
#include "mixer/MixerInternal.hxx"
+#include "mixer/Listener.hxx"
#include "output/OutputAPI.hxx"
-#include "GlobalEvents.hxx"
#include "event/MultiSocketMonitor.hxx"
#include "event/DeferredMonitor.hxx"
#include "event/Loop.hxx"
@@ -76,8 +76,9 @@ class AlsaMixer final : public Mixer {
AlsaMixerMonitor *monitor;
public:
- AlsaMixer(EventLoop &_event_loop)
- :Mixer(alsa_mixer_plugin), event_loop(_event_loop) {}
+ AlsaMixer(EventLoop &_event_loop, MixerListener &_listener)
+ :Mixer(alsa_mixer_plugin, _listener),
+ event_loop(_event_loop) {}
virtual ~AlsaMixer();
@@ -142,10 +143,15 @@ AlsaMixerMonitor::DispatchSockets()
*/
static int
-alsa_mixer_elem_callback(gcc_unused snd_mixer_elem_t *elem, unsigned mask)
+alsa_mixer_elem_callback(snd_mixer_elem_t *elem, unsigned mask)
{
- if (mask & SND_CTL_EVENT_MASK_VALUE)
- GlobalEvents::Emit(GlobalEvents::MIXER);
+ AlsaMixer &mixer = *(AlsaMixer *)
+ snd_mixer_elem_get_callback_private(elem);
+
+ if (mask & SND_CTL_EVENT_MASK_VALUE) {
+ int volume = mixer.GetVolume(IgnoreError());
+ mixer.listener.OnMixerVolumeChanged(mixer, volume);
+ }
return 0;
}
@@ -168,10 +174,11 @@ AlsaMixer::Configure(const config_param &param)
static Mixer *
alsa_mixer_init(EventLoop &event_loop, gcc_unused AudioOutput &ao,
+ MixerListener &listener,
const config_param &param,
gcc_unused Error &error)
{
- AlsaMixer *am = new AlsaMixer(event_loop);
+ AlsaMixer *am = new AlsaMixer(event_loop, listener);
am->Configure(param);
return am;
@@ -236,6 +243,7 @@ AlsaMixer::Setup(Error &error)
snd_mixer_selem_get_playback_volume_range(elem, &volume_min,
&volume_max);
+ snd_mixer_elem_set_callback_private(elem, this);
snd_mixer_elem_set_callback(elem, alsa_mixer_elem_callback);
monitor = new AlsaMixerMonitor(event_loop, handle);
diff --git a/src/mixer/plugins/OssMixerPlugin.cxx b/src/mixer/plugins/OssMixerPlugin.cxx
index 939fe0824..6615c7022 100644
--- a/src/mixer/plugins/OssMixerPlugin.cxx
+++ b/src/mixer/plugins/OssMixerPlugin.cxx
@@ -49,7 +49,8 @@ class OssMixer final : public Mixer {
int volume_control;
public:
- OssMixer():Mixer(oss_mixer_plugin) {}
+ OssMixer(MixerListener &_listener)
+ :Mixer(oss_mixer_plugin, _listener) {}
bool Configure(const config_param &param, Error &error);
@@ -98,10 +99,11 @@ OssMixer::Configure(const config_param &param, Error &error)
static Mixer *
oss_mixer_init(gcc_unused EventLoop &event_loop, gcc_unused AudioOutput &ao,
+ MixerListener &listener,
const config_param &param,
Error &error)
{
- OssMixer *om = new OssMixer();
+ OssMixer *om = new OssMixer(listener);
if (!om->Configure(param, error)) {
delete om;
diff --git a/src/mixer/plugins/PulseMixerPlugin.cxx b/src/mixer/plugins/PulseMixerPlugin.cxx
index b838de689..0a765bf68 100644
--- a/src/mixer/plugins/PulseMixerPlugin.cxx
+++ b/src/mixer/plugins/PulseMixerPlugin.cxx
@@ -20,8 +20,8 @@
#include "config.h"
#include "PulseMixerPlugin.hxx"
#include "mixer/MixerInternal.hxx"
+#include "mixer/Listener.hxx"
#include "output/plugins/PulseOutputPlugin.hxx"
-#include "GlobalEvents.hxx"
#include "util/Error.hxx"
#include "util/Domain.hxx"
#include "Log.hxx"
@@ -41,9 +41,9 @@ class PulseMixer final : public Mixer {
struct pa_cvolume volume;
public:
- PulseMixer(PulseOutput &_output)
- :Mixer(pulse_mixer_plugin),
- output(_output), online(false)
+ PulseMixer(PulseOutput &_output, MixerListener &_listener)
+ :Mixer(pulse_mixer_plugin, _listener),
+ output(_output), online(false)
{
}
@@ -75,7 +75,7 @@ PulseMixer::Offline()
online = false;
- GlobalEvents::Emit(GlobalEvents::MIXER);
+ listener.OnMixerVolumeChanged(*this, -1);
}
inline void
@@ -92,7 +92,7 @@ PulseMixer::VolumeCallback(const pa_sink_input_info *i, int eol)
online = true;
volume = i->volume;
- GlobalEvents::Emit(GlobalEvents::MIXER);
+ listener.OnMixerVolumeChanged(*this, GetVolume(IgnoreError()));
}
/**
@@ -165,11 +165,12 @@ pulse_mixer_on_change(PulseMixer &pm,
static Mixer *
pulse_mixer_init(gcc_unused EventLoop &event_loop, AudioOutput &ao,
+ MixerListener &listener,
gcc_unused const config_param &param,
gcc_unused Error &error)
{
PulseOutput &po = (PulseOutput &)ao;
- PulseMixer *pm = new PulseMixer(po);
+ PulseMixer *pm = new PulseMixer(po, listener);
pulse_output_set_mixer(po, *pm);
diff --git a/src/mixer/plugins/RoarMixerPlugin.cxx b/src/mixer/plugins/RoarMixerPlugin.cxx
index 7c2a25dfb..8e198478d 100644
--- a/src/mixer/plugins/RoarMixerPlugin.cxx
+++ b/src/mixer/plugins/RoarMixerPlugin.cxx
@@ -29,9 +29,9 @@ class RoarMixer final : public Mixer {
RoarOutput &self;
public:
- RoarMixer(RoarOutput &_output)
- :Mixer(roar_mixer_plugin),
- self(_output) {}
+ RoarMixer(RoarOutput &_output, MixerListener &_listener)
+ :Mixer(roar_mixer_plugin, _listener),
+ self(_output) {}
/* virtual methods from class Mixer */
virtual bool Open(gcc_unused Error &error) override {
@@ -47,10 +47,11 @@ public:
static Mixer *
roar_mixer_init(gcc_unused EventLoop &event_loop, AudioOutput &ao,
+ MixerListener &listener,
gcc_unused const config_param &param,
gcc_unused Error &error)
{
- return new RoarMixer((RoarOutput &)ao);
+ return new RoarMixer((RoarOutput &)ao, listener);
}
int
diff --git a/src/mixer/plugins/SoftwareMixerPlugin.cxx b/src/mixer/plugins/SoftwareMixerPlugin.cxx
index 78f0769ab..0cde682f6 100644
--- a/src/mixer/plugins/SoftwareMixerPlugin.cxx
+++ b/src/mixer/plugins/SoftwareMixerPlugin.cxx
@@ -52,8 +52,8 @@ class SoftwareMixer final : public Mixer {
unsigned volume;
public:
- SoftwareMixer()
- :Mixer(software_mixer_plugin),
+ SoftwareMixer(MixerListener &_listener)
+ :Mixer(software_mixer_plugin, _listener),
filter(CreateVolumeFilter()),
owns_filter(true),
volume(100)
@@ -86,10 +86,11 @@ public:
static Mixer *
software_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 SoftwareMixer();
+ return new SoftwareMixer(listener);
}
bool
diff --git a/src/mixer/plugins/WinmmMixerPlugin.cxx b/src/mixer/plugins/WinmmMixerPlugin.cxx
index 6b81fa095..e0436011a 100644
--- a/src/mixer/plugins/WinmmMixerPlugin.cxx
+++ b/src/mixer/plugins/WinmmMixerPlugin.cxx
@@ -34,8 +34,8 @@ class WinmmMixer final : public Mixer {
WinmmOutput &output;
public:
- WinmmMixer(WinmmOutput &_output)
- :Mixer(winmm_mixer_plugin),
+ WinmmMixer(WinmmOutput &_output, MixerListener &_listener)
+ :Mixer(winmm_mixer_plugin, _listener),
output(_output) {
}
@@ -68,10 +68,11 @@ winmm_volume_encode(int volume)
static Mixer *
winmm_mixer_init(gcc_unused EventLoop &event_loop, AudioOutput &ao,
+ MixerListener &listener,
gcc_unused const config_param &param,
gcc_unused Error &error)
{
- return new WinmmMixer((WinmmOutput &)ao);
+ return new WinmmMixer((WinmmOutput &)ao, listener);
}
int