summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSam Light <sam@lightscale.co.uk>2025-09-10 19:37:28 +0100
committerSam Light <sam@lightscale.co.uk>2025-09-10 19:37:28 +0100
commit970dcc487d7a6a6bc99e37b65ee512a2d651a583 (patch)
treebc8083a55e5d7e9160a95020c9b509d8ae1787b7
parentffd7a89fc94f9224cafb21cfa2a671bfec2897da (diff)
Pulse handle default sink changing
-rw-r--r--src/modules/pulse.c33
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;