aboutsummaryrefslogtreecommitdiffstats
path: root/src/mixer/plugins/PulseMixerPlugin.cxx
diff options
context:
space:
mode:
authorMax Kellermann <max@duempel.org>2014-02-06 20:44:33 +0100
committerMax Kellermann <max@duempel.org>2014-02-06 20:52:33 +0100
commitb6df4680df08db7827af56d5adf2a04264f2dcb9 (patch)
tree310e0e9305cdf1e5ef6da56c2f60af15c3774cb6 /src/mixer/plugins/PulseMixerPlugin.cxx
parente04090b477a6ec3c18b43250cf2ea37985057455 (diff)
downloadmpd-b6df4680df08db7827af56d5adf2a04264f2dcb9.tar.gz
mpd-b6df4680df08db7827af56d5adf2a04264f2dcb9.tar.xz
mpd-b6df4680df08db7827af56d5adf2a04264f2dcb9.zip
MixerPlugin: convert function pointers to Mixer virtual methods
Diffstat (limited to 'src/mixer/plugins/PulseMixerPlugin.cxx')
-rw-r--r--src/mixer/plugins/PulseMixerPlugin.cxx130
1 files changed, 67 insertions, 63 deletions
diff --git a/src/mixer/plugins/PulseMixerPlugin.cxx b/src/mixer/plugins/PulseMixerPlugin.cxx
index 7c6076bb2..10aa6a93a 100644
--- a/src/mixer/plugins/PulseMixerPlugin.cxx
+++ b/src/mixer/plugins/PulseMixerPlugin.cxx
@@ -34,74 +34,95 @@
#include <assert.h>
-struct PulseMixer final : public Mixer {
+class PulseMixer final : public Mixer {
PulseOutput *output;
bool online;
struct pa_cvolume volume;
+public:
PulseMixer(PulseOutput *_output)
:Mixer(pulse_mixer_plugin),
output(_output), online(false)
{
}
+
+ virtual ~PulseMixer();
+
+ void Offline();
+ void VolumeCallback(const pa_sink_input_info *i, int eol);
+ void Update(pa_context *context, pa_stream *stream);
+
+ /* virtual methods from class Mixer */
+ virtual bool Open(gcc_unused Error &error) override {
+ return true;
+ }
+
+ virtual void Close() override {
+ }
+
+ virtual int GetVolume(Error &error) override;
+ virtual bool SetVolume(unsigned volume, Error &error) override;
};
static constexpr Domain pulse_mixer_domain("pulse_mixer");
-static void
-pulse_mixer_offline(PulseMixer *pm)
+void
+PulseMixer::Offline()
{
- if (!pm->online)
+ if (!online)
return;
- pm->online = false;
+ online = false;
GlobalEvents::Emit(GlobalEvents::MIXER);
}
-/**
- * Callback invoked by pulse_mixer_update(). Receives the new mixer
- * value.
- */
-static void
-pulse_mixer_volume_cb(gcc_unused pa_context *context, const pa_sink_input_info *i,
- int eol, void *userdata)
+inline void
+PulseMixer::VolumeCallback(const pa_sink_input_info *i, int eol)
{
- PulseMixer *pm = (PulseMixer *)userdata;
-
if (eol)
return;
if (i == nullptr) {
- pulse_mixer_offline(pm);
+ Offline();
return;
}
- pm->online = true;
- pm->volume = i->volume;
+ online = true;
+ volume = i->volume;
GlobalEvents::Emit(GlobalEvents::MIXER);
}
+/**
+ * Callback invoked by pulse_mixer_update(). Receives the new mixer
+ * value.
+ */
static void
-pulse_mixer_update(PulseMixer *pm,
- struct pa_context *context, struct pa_stream *stream)
+pulse_mixer_volume_cb(gcc_unused pa_context *context, const pa_sink_input_info *i,
+ int eol, void *userdata)
{
- pa_operation *o;
+ PulseMixer *pm = (PulseMixer *)userdata;
+ pm->VolumeCallback(i, eol);
+}
+inline void
+PulseMixer::Update(pa_context *context, pa_stream *stream)
+{
assert(context != nullptr);
assert(stream != nullptr);
assert(pa_stream_get_state(stream) == PA_STREAM_READY);
- o = pa_context_get_sink_input_info(context,
- pa_stream_get_index(stream),
- pulse_mixer_volume_cb, pm);
+ pa_operation *o =
+ pa_context_get_sink_input_info(context,
+ pa_stream_get_index(stream),
+ pulse_mixer_volume_cb, this);
if (o == nullptr) {
FormatError(pulse_mixer_domain,
"pa_context_get_sink_input_info() failed: %s",
pa_strerror(pa_context_errno(context)));
- pulse_mixer_offline(pm);
+ Offline();
return;
}
@@ -132,14 +153,14 @@ pulse_mixer_on_connect(gcc_unused PulseMixer *pm,
void
pulse_mixer_on_disconnect(PulseMixer *pm)
{
- pulse_mixer_offline(pm);
+ pm->Offline();
}
void
pulse_mixer_on_change(PulseMixer *pm,
struct pa_context *context, struct pa_stream *stream)
{
- pulse_mixer_update(pm, context, stream);
+ pm->Update(context, stream);
}
static Mixer *
@@ -162,65 +183,48 @@ pulse_mixer_init(gcc_unused EventLoop &event_loop, void *ao,
return pm;
}
-static void
-pulse_mixer_finish(Mixer *data)
+PulseMixer::~PulseMixer()
{
- PulseMixer *pm = (PulseMixer *) data;
-
- pulse_output_clear_mixer(pm->output, pm);
-
- delete pm;
+ pulse_output_clear_mixer(output, this);
}
-static int
-pulse_mixer_get_volume(Mixer *mixer, gcc_unused Error &error)
+int
+PulseMixer::GetVolume(gcc_unused Error &error)
{
- PulseMixer *pm = (PulseMixer *) mixer;
- int ret;
-
- pulse_output_lock(pm->output);
+ pulse_output_lock(output);
- ret = pm->online
- ? (int)((100*(pa_cvolume_avg(&pm->volume)+1))/PA_VOLUME_NORM)
+ int result = online
+ ? (int)((100 * (pa_cvolume_avg(&volume) + 1)) / PA_VOLUME_NORM)
: -1;
- pulse_output_unlock(pm->output);
+ pulse_output_unlock(output);
- return ret;
+ return result;
}
-static bool
-pulse_mixer_set_volume(Mixer *mixer, unsigned volume, Error &error)
+bool
+PulseMixer::SetVolume(unsigned new_volume, Error &error)
{
- PulseMixer *pm = (PulseMixer *) mixer;
- struct pa_cvolume cvolume;
- bool success;
-
- pulse_output_lock(pm->output);
+ pulse_output_lock(output);
- if (!pm->online) {
- pulse_output_unlock(pm->output);
+ if (!online) {
+ pulse_output_unlock(output);
error.Set(pulse_mixer_domain, "disconnected");
return false;
}
- pa_cvolume_set(&cvolume, pm->volume.channels,
- (pa_volume_t)volume * PA_VOLUME_NORM / 100 + 0.5);
- success = pulse_output_set_volume(pm->output, &cvolume, error);
+ struct pa_cvolume cvolume;
+ pa_cvolume_set(&cvolume, volume.channels,
+ (pa_volume_t)new_volume * PA_VOLUME_NORM / 100 + 0.5);
+ bool success = pulse_output_set_volume(output, &cvolume, error);
if (success)
- pm->volume = cvolume;
-
- pulse_output_unlock(pm->output);
+ volume = cvolume;
+ pulse_output_unlock(output);
return success;
}
const MixerPlugin pulse_mixer_plugin = {
pulse_mixer_init,
- pulse_mixer_finish,
- nullptr,
- nullptr,
- pulse_mixer_get_volume,
- pulse_mixer_set_volume,
false,
};