Commit 47774ce8 authored by Max Kellermann's avatar Max Kellermann

Merge branch 'v0.16.x'

parents 3c9bcdd3 79435dbd
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
#include <af_vfs.h> #include <af_vfs.h>
#include <assert.h> #include <assert.h>
#include <glib.h> #include <glib.h>
#include <stdio.h>
#undef G_LOG_DOMAIN #undef G_LOG_DOMAIN
#define G_LOG_DOMAIN "audiofile" #define G_LOG_DOMAIN "audiofile"
......
...@@ -291,6 +291,8 @@ pulse_output_delete_stream(struct pulse_output *po) ...@@ -291,6 +291,8 @@ pulse_output_delete_stream(struct pulse_output *po)
/** /**
* Frees and clears the context. * Frees and clears the context.
*
* Caller must lock the main loop.
*/ */
static void static void
pulse_output_delete_context(struct pulse_output *po) pulse_output_delete_context(struct pulse_output *po)
...@@ -309,6 +311,8 @@ pulse_output_delete_context(struct pulse_output *po) ...@@ -309,6 +311,8 @@ pulse_output_delete_context(struct pulse_output *po)
/** /**
* Create, set up and connect a context. * Create, set up and connect a context.
* *
* Caller must lock the main loop.
*
* @return true on success, false on error * @return true on success, false on error
*/ */
static bool static bool
...@@ -399,12 +403,8 @@ pulse_output_enable(void *data, GError **error_r) ...@@ -399,12 +403,8 @@ pulse_output_enable(void *data, GError **error_r)
return false; return false;
} }
pa_threaded_mainloop_unlock(po->mainloop);
/* create the libpulse context and connect it */ /* create the libpulse context and connect it */
pa_threaded_mainloop_lock(po->mainloop);
if (!pulse_output_setup_context(po, error_r)) { if (!pulse_output_setup_context(po, error_r)) {
pa_threaded_mainloop_unlock(po->mainloop); pa_threaded_mainloop_unlock(po->mainloop);
pa_threaded_mainloop_stop(po->mainloop); pa_threaded_mainloop_stop(po->mainloop);
...@@ -436,6 +436,8 @@ pulse_output_disable(void *data) ...@@ -436,6 +436,8 @@ pulse_output_disable(void *data)
* Check if the context is (already) connected, and waits if not. If * Check if the context is (already) connected, and waits if not. If
* the context has been disconnected, retry to connect. * the context has been disconnected, retry to connect.
* *
* Caller must lock the main loop.
*
* @return true on success, false on error * @return true on success, false on error
*/ */
static bool static bool
...@@ -445,8 +447,6 @@ pulse_output_wait_connection(struct pulse_output *po, GError **error_r) ...@@ -445,8 +447,6 @@ pulse_output_wait_connection(struct pulse_output *po, GError **error_r)
pa_context_state_t state; pa_context_state_t state;
pa_threaded_mainloop_lock(po->mainloop);
if (po->context == NULL && !pulse_output_setup_context(po, error_r)) if (po->context == NULL && !pulse_output_setup_context(po, error_r))
return false; return false;
...@@ -455,7 +455,6 @@ pulse_output_wait_connection(struct pulse_output *po, GError **error_r) ...@@ -455,7 +455,6 @@ pulse_output_wait_connection(struct pulse_output *po, GError **error_r)
switch (state) { switch (state) {
case PA_CONTEXT_READY: case PA_CONTEXT_READY:
/* nothing to do */ /* nothing to do */
pa_threaded_mainloop_unlock(po->mainloop);
return true; return true;
case PA_CONTEXT_UNCONNECTED: case PA_CONTEXT_UNCONNECTED:
...@@ -466,7 +465,6 @@ pulse_output_wait_connection(struct pulse_output *po, GError **error_r) ...@@ -466,7 +465,6 @@ pulse_output_wait_connection(struct pulse_output *po, GError **error_r)
"failed to connect: %s", "failed to connect: %s",
pa_strerror(pa_context_errno(po->context))); pa_strerror(pa_context_errno(po->context)));
pulse_output_delete_context(po); pulse_output_delete_context(po);
pa_threaded_mainloop_unlock(po->mainloop);
return false; return false;
case PA_CONTEXT_CONNECTING: case PA_CONTEXT_CONNECTING:
...@@ -584,6 +582,8 @@ pulse_output_open(void *data, struct audio_format *audio_format, ...@@ -584,6 +582,8 @@ pulse_output_open(void *data, struct audio_format *audio_format,
assert(po->mainloop != NULL); assert(po->mainloop != NULL);
pa_threaded_mainloop_lock(po->mainloop);
if (po->context != NULL) { if (po->context != NULL) {
switch (pa_context_get_state(po->context)) { switch (pa_context_get_state(po->context)) {
case PA_CONTEXT_UNCONNECTED: case PA_CONTEXT_UNCONNECTED:
...@@ -603,8 +603,10 @@ pulse_output_open(void *data, struct audio_format *audio_format, ...@@ -603,8 +603,10 @@ pulse_output_open(void *data, struct audio_format *audio_format,
} }
} }
if (!pulse_output_wait_connection(po, error_r)) if (!pulse_output_wait_connection(po, error_r)) {
pa_threaded_mainloop_unlock(po->mainloop);
return false; return false;
}
/* MPD doesn't support the other pulseaudio sample formats, so /* MPD doesn't support the other pulseaudio sample formats, so
we just force MPD to send us everything as 16 bit */ we just force MPD to send us everything as 16 bit */
...@@ -614,8 +616,6 @@ pulse_output_open(void *data, struct audio_format *audio_format, ...@@ -614,8 +616,6 @@ pulse_output_open(void *data, struct audio_format *audio_format,
ss.rate = audio_format->sample_rate; ss.rate = audio_format->sample_rate;
ss.channels = audio_format->channels; ss.channels = audio_format->channels;
pa_threaded_mainloop_lock(po->mainloop);
/* create a stream .. */ /* create a stream .. */
if (!pulse_output_setup_stream(po, &ss, error_r)) { if (!pulse_output_setup_stream(po, &ss, error_r)) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment