diff options
-rw-r--r-- | pavolctrld.c | 55 |
1 files changed, 43 insertions, 12 deletions
diff --git a/pavolctrld.c b/pavolctrld.c index 02fd1e8..dc56292 100644 --- a/pavolctrld.c +++ b/pavolctrld.c @@ -13,29 +13,46 @@ static void sink_info_volume_callback(pa_context *c, const pa_sink_info *i, int if (eol) return; vol = pa_cvolume_avg(&i->volume); - printf("%d,%.02fdB,%d,%d,%d\n", vol*100/PA_VOLUME_NORM, pa_sw_volume_to_dB(vol), i->mute, i->index, i->index == default_sink_index); + printf("v%d,%d,%.02f,%d\n", i->index, vol*100/PA_VOLUME_NORM, pa_sw_volume_to_dB(vol), i->mute); fflush(stdout); } static void sink_info_default_index_callback(pa_context *c, const pa_sink_info *i, int eol, void *userdata) { if (eol) return; default_sink_index = i->index; +} - // output volume levels for each sink - pa_context_get_sink_info_list(c, sink_info_volume_callback, userdata); +static void sink_info_sink_desc_callback(pa_context *c, const pa_sink_info *i, int eol, void *userdata) { + if (eol) return; + printf("s%d,%s,%s\n", i->index, i->name, i->description); + fflush(stdout); } -static void server_info_get_default_sink_callback(pa_context *c, const pa_server_info *i, void *userdata) { +static void server_info_default_sink_callback(pa_context *c, const pa_server_info *i, void *userdata) { pa_context_get_sink_info_by_name(c, i->default_sink_name, sink_info_default_index_callback, userdata); + printf("f%d\n", default_sink_index); + fflush(stdout); } static void subscription_callback(pa_context *c, pa_subscription_event_type_t t, uint32_t idx, void *userdata) { switch (t & PA_SUBSCRIPTION_EVENT_FACILITY_MASK) { case PA_SUBSCRIPTION_EVENT_SINK: + // check if sink was removed + if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) { + printf("x%d\n", idx); + fflush(stdout); + return; + } + + // check if sink was added + if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_NEW) + pa_context_get_sink_info_by_index(c, idx, sink_info_sink_desc_callback, userdata); + + // output the volume pa_context_get_sink_info_by_index(c, idx, sink_info_volume_callback, userdata); break; case PA_SUBSCRIPTION_EVENT_SERVER: - pa_context_get_server_info(c, server_info_get_default_sink_callback, userdata); + pa_context_get_server_info(c, server_info_default_sink_callback, userdata); break; } } @@ -44,8 +61,14 @@ static void context_state_callback(pa_context *c, void *userdata) { if (pa_context_get_state(c) == PA_CONTEXT_READY) { pa_context_set_subscribe_callback(c, subscription_callback, userdata); - // get initial default sink info - pa_context_get_server_info(c, server_info_get_default_sink_callback, userdata); + // output initial default sink + pa_context_get_server_info(c, server_info_default_sink_callback, userdata); + + // output initial sink descriptions for each sink + pa_context_get_sink_info_list(c, sink_info_sink_desc_callback, userdata); + + // output initial volume levels for each sink + pa_context_get_sink_info_list(c, sink_info_volume_callback, userdata); // subscribe to sink & server events to listen to changes pa_context_subscribe(c, PA_SUBSCRIPTION_MASK_SINK|PA_SUBSCRIPTION_MASK_SERVER, NULL, NULL); @@ -53,21 +76,29 @@ static void context_state_callback(pa_context *c, void *userdata) { } int main() { - pa_mainloop *mainloop = pa_mainloop_new(); - pa_mainloop_api *mainloop_api = pa_mainloop_get_api(mainloop); - pa_context *context = pa_context_new(mainloop_api, "pavold"); + pa_threaded_mainloop *mainloop = pa_threaded_mainloop_new(); + pa_mainloop_api *mainloop_api = pa_threaded_mainloop_get_api(mainloop); + pa_context *context = pa_context_new(mainloop_api, "pavolctrld"); + char stdin_buffer[256]; pa_context_connect(context, NULL, PA_CONTEXT_NOAUTOSPAWN, NULL); pa_context_set_state_callback(context, context_state_callback, NULL); // main loop - pa_mainloop_run(mainloop, NULL); + pa_threaded_mainloop_start(mainloop); + + while(1) { + if (fgets(stdin_buffer, sizeof(stdin_buffer), stdin) != NULL) { + printf("You entered: %s", stdin_buffer); + fflush(stdout); + } + } // clean up pa_context_disconnect(context); pa_context_unref(context); - pa_mainloop_free(mainloop); + pa_threaded_mainloop_free(mainloop); return 0; } |