diff options
| author | Sam Light <sam@lightscale.co.uk> | 2025-09-10 19:37:28 +0100 |
|---|---|---|
| committer | Sam Light <sam@lightscale.co.uk> | 2025-09-10 19:37:28 +0100 |
| commit | 970dcc487d7a6a6bc99e37b65ee512a2d651a583 (patch) | |
| tree | bc8083a55e5d7e9160a95020c9b509d8ae1787b7 | |
| parent | ffd7a89fc94f9224cafb21cfa2a671bfec2897da (diff) | |
Pulse handle default sink changing
| -rw-r--r-- | src/modules/pulse.c | 33 |
1 files 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 @@ -27,11 +27,17 @@ struct pulse { }; 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; |
