X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fpulse%2Fmainloop.c;h=13032161cb2cab60570dda546e7b65b63f58ba3b;hb=2eb100bcc65ab0aa459abb19ab826b0ee80e52b8;hp=206c94f186e2b612ef8d3d350333725899c2f6a1;hpb=53fbcade104057ef3bfe3fc0f3b74d4e94543369;p=vlc diff --git a/src/pulse/mainloop.c b/src/pulse/mainloop.c index 206c94f186..13032161cb 100644 --- a/src/pulse/mainloop.c +++ b/src/pulse/mainloop.c @@ -46,61 +46,49 @@ static vlc_mutex_t lock = VLC_STATIC_MUTEX; /** * Creates and references the VLC PulseAudio threaded main loop. - * @return the mainloop or NULL on failure + * @return 0 on success, -1 on failure */ -static pa_threaded_mainloop *vlc_pa_mainloop_init (void) +static int vlc_pa_mainloop_init (void) { - pa_threaded_mainloop *mainloop; - vlc_mutex_lock (&lock); if (refs == 0) { - mainloop = pa_threaded_mainloop_new (); - if (unlikely(mainloop == NULL)) - goto out; + vlc_pa_mainloop = pa_threaded_mainloop_new (); + if (unlikely(vlc_pa_mainloop == NULL)) + goto err; - if (pa_threaded_mainloop_start (mainloop) < 0) + if (pa_threaded_mainloop_start (vlc_pa_mainloop) < 0) { - pa_threaded_mainloop_free (mainloop); - goto out; + pa_threaded_mainloop_free (vlc_pa_mainloop); + goto err; } - vlc_pa_mainloop = mainloop; } else { - if (unlikely(refs < UINT_MAX)) - { - mainloop = NULL; - goto out; - } - mainloop = vlc_pa_mainloop; + if (unlikely(refs >= UINT_MAX)) + goto err; } - - assert (mainloop != NULL); refs++; -out: vlc_mutex_unlock (&lock); - return mainloop; + return 0; +err: + vlc_mutex_unlock (&lock); + return -1; } /** * Releases a reference to the VLC PulseAudio main loop. */ -static void vlc_pa_mainloop_deinit (pa_threaded_mainloop *mainloop) +static void vlc_pa_mainloop_deinit (void) { vlc_mutex_lock (&lock); assert (refs > 0); - assert (mainloop == vlc_pa_mainloop); - if (--refs > 0) - mainloop = NULL; - vlc_mutex_unlock (&lock); - - if (mainloop != NULL) { - pa_threaded_mainloop_stop (mainloop); - pa_threaded_mainloop_free (mainloop); + pa_threaded_mainloop_stop (vlc_pa_mainloop); + pa_threaded_mainloop_free (vlc_pa_mainloop); } + vlc_mutex_unlock (&lock); } /** @@ -138,20 +126,19 @@ void vlc_pa_wait (void) static void context_state_cb (pa_context *ctx, void *userdata) { - pa_threaded_mainloop *mainloop = userdata; - switch (pa_context_get_state(ctx)) { case PA_CONTEXT_READY: case PA_CONTEXT_FAILED: case PA_CONTEXT_TERMINATED: - pa_threaded_mainloop_signal(mainloop, 0); + vlc_pa_signal (0); default: break; } + (void) userdata; } -static bool context_wait (pa_threaded_mainloop *mainloop, pa_context *ctx) +static bool context_wait (pa_context *ctx) { pa_context_state_t state; @@ -159,7 +146,7 @@ static bool context_wait (pa_threaded_mainloop *mainloop, pa_context *ctx) { if (state == PA_CONTEXT_FAILED || state == PA_CONTEXT_TERMINATED) return -1; - pa_threaded_mainloop_wait (mainloop); + vlc_pa_wait (); } return 0; } @@ -170,8 +157,7 @@ static bool context_wait (pa_threaded_mainloop *mainloop, pa_context *ctx) */ pa_context *vlc_pa_connect (vlc_object_t *obj) { - pa_threaded_mainloop *mainloop = vlc_pa_mainloop_init (); - if (unlikely(mainloop == NULL)) + if (unlikely(vlc_pa_mainloop_init ())) return NULL; msg_Dbg (obj, "using library version %s", pa_get_library_version ()); @@ -207,7 +193,7 @@ pa_context *vlc_pa_connect (vlc_object_t *obj) pw->pw_name); char hostname[sysconf (_SC_HOST_NAME_MAX)]; - if (gethostname (hostname, sizeof (hostname) == 0)) + if (gethostname (hostname, sizeof (hostname)) == 0) pa_proplist_sets (props, PA_PROP_APPLICATION_PROCESS_HOST, hostname); @@ -222,18 +208,18 @@ pa_context *vlc_pa_connect (vlc_object_t *obj) } /* Connect to PulseAudio daemon */ - pa_threaded_mainloop_lock (mainloop); + vlc_pa_lock (); - ctx = pa_context_new_with_proplist (pa_threaded_mainloop_get_api (mainloop), ua, props); + ctx = pa_context_new_with_proplist (pa_threaded_mainloop_get_api (vlc_pa_mainloop), ua, props); free (ua); if (props != NULL) pa_proplist_free(props); if (unlikely(ctx == NULL)) goto fail; - pa_context_set_state_callback (ctx, context_state_cb, mainloop); + pa_context_set_state_callback (ctx, context_state_cb, NULL); if (pa_context_connect (ctx, NULL, 0, NULL) < 0 - || context_wait (mainloop, ctx)) + || context_wait (ctx)) { vlc_pa_error (obj, "PulseAudio server connection failure", ctx); pa_context_unref (ctx); @@ -246,12 +232,12 @@ pa_context *vlc_pa_connect (vlc_object_t *obj) pa_context_get_protocol_version (ctx), pa_context_get_server_protocol_version (ctx)); - pa_threaded_mainloop_unlock (mainloop); + vlc_pa_unlock (); return ctx; fail: - pa_threaded_mainloop_unlock (mainloop); - vlc_pa_mainloop_deinit (mainloop); + vlc_pa_unlock (); + vlc_pa_mainloop_deinit (); return NULL; } @@ -260,12 +246,12 @@ fail: */ void vlc_pa_disconnect (vlc_object_t *obj, pa_context *ctx) { - pa_threaded_mainloop *mainloop = vlc_pa_mainloop; - - pa_threaded_mainloop_lock (mainloop); + vlc_pa_lock (); + pa_context_disconnect (ctx); + pa_context_set_state_callback (ctx, NULL, NULL); pa_context_unref (ctx); - pa_threaded_mainloop_unlock (mainloop); + vlc_pa_unlock (); - vlc_pa_mainloop_deinit (mainloop); + vlc_pa_mainloop_deinit (); (void) obj; }