diff options
-rw-r--r-- | src/mixer/pulse_mixer.c | 79 |
1 files changed, 52 insertions, 27 deletions
diff --git a/src/mixer/pulse_mixer.c b/src/mixer/pulse_mixer.c index 9ecf73354..899ab5446 100644 --- a/src/mixer/pulse_mixer.c +++ b/src/mixer/pulse_mixer.c @@ -31,11 +31,14 @@ struct pulse_mixer { struct mixer base; + const char *server; const char *sink; const char *output_name; + uint32_t index; - bool online; + bool online; + struct pa_context *context; struct pa_threaded_mainloop *mainloop; struct pa_cvolume volume; @@ -48,19 +51,22 @@ sink_input_cb(G_GNUC_UNUSED pa_context *context, const pa_sink_input_info *i, { struct pulse_mixer *pm = userdata; + if (eol) { g_debug("eol error sink_input_cb"); return; } - if (!i) { + if (i == NULL) { g_debug("Sink input callback failure"); return; } + g_debug("sink input cb %s, index %d ",i->name,i->index); - if(strcmp(i->name,pm->output_name)==0) { - pm->index=i->index; - pm->online=true; + + if (strcmp(i->name,pm->output_name) == 0) { + pm->index = i->index; + pm->online = true; pm->volume = i->volume; } else g_debug("bad name"); @@ -72,15 +78,17 @@ sink_input_vol(G_GNUC_UNUSED pa_context *context, const pa_sink_input_info *i, { struct pulse_mixer *pm = userdata; + if (eol) { g_debug("eol error sink_input_vol"); return; } - if (!i) { + if (i == NULL) { g_debug("Sink input callback failure"); return; } + g_debug("sink input vol %s, index %d ", i->name, i->index); pm->volume = i->volume; } @@ -91,17 +99,21 @@ subscribe_cb(G_GNUC_UNUSED pa_context *c, pa_subscription_event_type_t t, { struct pulse_mixer *pm = userdata; + g_debug("subscribe call back"); + switch (t & PA_SUBSCRIPTION_EVENT_FACILITY_MASK) { case PA_SUBSCRIPTION_EVENT_SINK_INPUT: if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE && pm->index == idx) - pm->online =false; + pm->online = false; else { pa_operation *o; - if (!(o = pa_context_get_sink_input_info(pm->context, idx, sink_input_cb, pm))) { + o = pa_context_get_sink_input_info(pm->context, idx, + sink_input_cb, pm); + if (o == NULL) { g_debug("pa_context_get_sink_input_info() failed"); return; } @@ -116,26 +128,31 @@ static void context_state_cb(pa_context *context, void *userdata) { struct pulse_mixer *pm = userdata; + switch (pa_context_get_state(context)) { case PA_CONTEXT_READY: { pa_operation *o; pa_context_set_subscribe_callback(context, subscribe_cb, pm); - if (!(o = pa_context_subscribe(context, (pa_subscription_mask_t) - (PA_SUBSCRIPTION_MASK_SINK_INPUT), NULL, NULL))) { + o = pa_context_subscribe(context, + (pa_subscription_mask_t)PA_SUBSCRIPTION_MASK_SINK_INPUT, + NULL, NULL); + if (o == NULL) { g_debug("pa_context_subscribe() failed"); return; } - pa_operation_unref(o); + pa_operation_unref(o); - if (!(o = pa_context_get_sink_input_info_list(context, sink_input_cb, pm))) { + o = pa_context_get_sink_input_info_list(context, + sink_input_cb, pm); + if (o == NULL) { g_debug("pa_context_get_sink_input_info_list() failed"); return; } - pa_operation_unref(o); + pa_operation_unref(o); pa_threaded_mainloop_signal(pm->mainloop, 0); break; @@ -160,7 +177,7 @@ pulse_mixer_init(const struct config_param *param) struct pulse_mixer *pm = g_new(struct pulse_mixer,1); mixer_init(&pm->base, &pulse_mixer); - pm->online=false; + pm->online = false; pm->server = config_get_block_string(param, "server", NULL); pm->sink = config_get_block_string(param, "sink", NULL); @@ -213,18 +230,21 @@ static bool pulse_mixer_open(G_GNUC_UNUSED struct mixer *data) { struct pulse_mixer *pm = (struct pulse_mixer *) data; + g_debug("pulse mixer open"); pm->index = 0; pm->online = false; - if(!(pm->mainloop = pa_threaded_mainloop_new())) { + pm->mainloop = pa_threaded_mainloop_new(); + if (pm->mainloop == NULL) { g_debug("failed mainloop"); return false; } - if(!(pm->context = pa_context_new(pa_threaded_mainloop_get_api(pm->mainloop), - "Mixer mpd"))) { + pm->context = pa_context_new(pa_threaded_mainloop_get_api(pm->mainloop), + "Mixer mpd"); + if (pm->context == NULL) { pa_threaded_mainloop_stop(pm->mainloop); pa_threaded_mainloop_free(pm->mainloop); g_debug("failed context"); @@ -245,7 +265,7 @@ pulse_mixer_open(G_GNUC_UNUSED struct mixer *data) static void pulse_mixer_close(G_GNUC_UNUSED struct mixer *data) { - struct pulse_mixer *pm=(struct pulse_mixer *) data; + struct pulse_mixer *pm = (struct pulse_mixer *) data; pa_threaded_mainloop_stop(pm->mainloop); pa_context_disconnect(pm->context); @@ -258,18 +278,20 @@ pulse_mixer_close(G_GNUC_UNUSED struct mixer *data) static int pulse_mixer_get_volume(struct mixer *mixer) { - struct pulse_mixer *pm=(struct pulse_mixer *) mixer; + struct pulse_mixer *pm = (struct pulse_mixer *) mixer; int ret; pa_operation *o; g_debug("get_volume %s", pm->online == TRUE ? "online" : "offline"); - if(pm->online) { - if (!(o = pa_context_get_sink_input_info(pm->context, pm->index, - sink_input_vol, pm))) { + if (pm->online) { + o = pa_context_get_sink_input_info(pm->context, pm->index, + sink_input_vol, pm); + if (o == NULL) { g_debug("pa_context_get_sink_input_info() failed"); return false; } + pa_operation_unref(o); ret = (int)((100*(pa_cvolume_avg(&pm->volume)+1))/PA_VOLUME_NORM); @@ -283,14 +305,17 @@ pulse_mixer_get_volume(struct mixer *mixer) static bool pulse_mixer_set_volume(struct mixer *mixer, unsigned volume) { - struct pulse_mixer *pm=(struct pulse_mixer *) mixer; - pa_operation *o; + struct pulse_mixer *pm = (struct pulse_mixer *) mixer; + if (pm->online) { + pa_operation *o; + pa_cvolume_set(&pm->volume, pm->volume.channels, - (pa_volume_t)(volume)*PA_VOLUME_NORM/100+0.5); + (pa_volume_t)volume * PA_VOLUME_NORM / 100 + 0.5); - if (!(o = pa_context_set_sink_input_volume(pm->context, pm->index, - &pm->volume, NULL, NULL))) { + o = pa_context_set_sink_input_volume(pm->context, pm->index, + &pm->volume, NULL, NULL); + if (o == NULL) { g_debug("pa_context_set_sink_input_volume() failed"); return false; } |