From 970dcc487d7a6a6bc99e37b65ee512a2d651a583 Mon Sep 17 00:00:00 2001 From: Sam Light Date: Wed, 10 Sep 2025 19:37:28 +0100 Subject: Pulse handle default sink changing --- src/modules/pulse.c | 33 +++++++++++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/src/modules/pulse.c b/src/modules/pulse.c index f039afd..0514ee8 100644 --- a/src/modules/pulse.c +++ b/src/modules/pulse.c @@ -26,12 +26,18 @@ struct pulse { char value[VALUE_SIZE]; }; +static void +iterate_loop(struct pulse * p) +{ + pa_mainloop_iterate(p->ml, 1, NULL); +} + static void run_loop(struct pulse * p) { p->run_loop = true; while(p->run_loop && signal_running) { - pa_mainloop_iterate(p->ml, 1, NULL); + iterate_loop(p); } } @@ -48,6 +54,10 @@ server_info_cb(pa_context * ctx, const pa_server_info * info, void * ud) size_t s = strlen(info->default_sink_name); + if(p->default_sink != NULL) { + free(p->default_sink); + } + p->default_sink = malloc(s + 1); memset(p->default_sink, '\0', s + 1); strncpy(p->default_sink, info->default_sink_name, s); @@ -75,6 +85,20 @@ state_cb(pa_context * ctx, void * ud) } } +static void +ctx_subscription_handler( + pa_context * c, + pa_subscription_event_type_t t, + uint32_t idx, + void * userdata +) +{ + if(t == PA_SUBSCRIPTION_EVENT_REMOVE) { + struct pulse * p = (struct pulse *) userdata; + pa_context_get_server_info(p->ctx, server_info_cb, p); + } +} + struct pulse * pulse_new() { @@ -95,6 +119,11 @@ pulse_new() run_loop(p); + pa_context_set_subscribe_callback(p->ctx, ctx_subscription_handler, p); + pa_context_subscribe(p->ctx, PA_SUBSCRIPTION_MASK_SINK, NULL, NULL); + + iterate_loop(p); + return p; } @@ -119,7 +148,7 @@ sink_info_cb(pa_context * ctx, const pa_sink_info * info, int eol, void * ud) if(eol > 0) { stop_loop(p); } - else { + else if(info != NULL) { vol = pa_cvolume_avg(&info->volume); vol -= PA_VOLUME_MUTED; norm = PA_VOLUME_NORM - PA_VOLUME_MUTED; -- cgit v1.2.3