From b5c0cfefd7656c5407a8e96ec1c762d7ebfc5ab5 Mon Sep 17 00:00:00 2001 From: Zedhugh Chen Date: Wed, 11 Feb 2026 14:38:05 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=84=E7=90=86=20pulseaudio=20=E6=9C=8D?= =?UTF-8?q?=E5=8A=A1=E5=85=B3=E9=97=AD=E5=AF=BC=E8=87=B4=E7=9A=84=E7=A8=8B?= =?UTF-8?q?=E5=BA=8F=E6=84=8F=E5=A4=96=E7=BB=88=E6=AD=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/audio.c | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/src/audio.c b/src/audio.c index b3e0c8f..34694c0 100644 --- a/src/audio.c +++ b/src/audio.c @@ -27,8 +27,8 @@ struct pulse_context_t { uint32_t index; }; -static void clean_pulse_context(pulse_context_t *context); -static void init_pulse_context(pulse_context_t *context); +static void clean_pulse_context(pulse_context_t *context, bool full_cleanup); +static void init_pulse_context(pulse_context_t *context, bool create_loop); static void state_callback(pa_context *context, void *userdata); static void subscribe_callback(pa_context *context, pa_subscription_event_type_t t, uint32_t index, @@ -43,7 +43,7 @@ pulse_context_t *init_pulse(GMainContext *context, pulse_notify_t callback) { pulse_context_t *ctx = p_new(pulse_context_t, 1); ctx->g_context = context; ctx->callback = callback; - init_pulse_context(ctx); + init_pulse_context(ctx, true); return ctx; } @@ -78,26 +78,32 @@ void toggle_pulse_mute(pulse_context_t *context) { } void clean_pulse(pulse_context_t *context) { - clean_pulse_context(context); + clean_pulse_context(context, true); p_delete(&context); } -void clean_pulse_context(pulse_context_t *context) { +void clean_pulse_context(pulse_context_t *context, bool full_cleanup) { memset(&context->pulse, 0, sizeof(context->pulse)); if (context->callback) context->callback(&context->pulse); if (context->context) { + pa_context_set_state_callback(context->context, nullptr, nullptr); + pa_context_set_subscribe_callback(context->context, nullptr, nullptr); pa_context_disconnect(context->context); pa_context_unref(context->context); context->context = nullptr; } - if (context->loop) pa_glib_mainloop_free(context->loop); context->pulse.inited = false; - context->loop = nullptr; + if (full_cleanup && context->loop) { + pa_glib_mainloop_free(context->loop); + context->loop = nullptr; + } } -void init_pulse_context(pulse_context_t *context) { - if (context->loop) pa_glib_mainloop_free(context->loop); - context->loop = pa_glib_mainloop_new(context->g_context); +void init_pulse_context(pulse_context_t *context, bool create_loop) { + if (create_loop) { + if (context->loop) pa_glib_mainloop_free(context->loop); + context->loop = pa_glib_mainloop_new(context->g_context); + } pa_mainloop_api *api = pa_glib_mainloop_get_api(context->loop); context->context = pa_context_new(api, APP_NAME "-audio-status"); pa_context_connect(context->context, nullptr, PA_CONTEXT_NOFAIL, nullptr); @@ -113,8 +119,8 @@ void state_callback(pa_context *context, void *userdata) { pa_context_subscribe(context, PA_SUBSCRIPTION_MASK_SINK, nullptr, nullptr); pa_context_get_server_info(context, server_info_callback, ctx); } else if (state == PA_CONTEXT_FAILED) { - clean_pulse_context(ctx); - init_pulse_context(ctx); + clean_pulse_context(ctx, false); + init_pulse_context(ctx, false); } }