diff options
| -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; |
