aboutsummaryrefslogtreecommitdiffstats
path: root/Alc/pulseaudio.c
diff options
context:
space:
mode:
Diffstat (limited to 'Alc/pulseaudio.c')
-rw-r--r--Alc/pulseaudio.c78
1 files changed, 41 insertions, 37 deletions
diff --git a/Alc/pulseaudio.c b/Alc/pulseaudio.c
index 06ecec52..864468e0 100644
--- a/Alc/pulseaudio.c
+++ b/Alc/pulseaudio.c
@@ -427,6 +427,46 @@ static void stream_write_callback(pa_stream *stream, size_t len, void *pdata) //
} //}}}
//}}}
+static pa_context *connect_context(pa_threaded_mainloop *loop, const char *name)
+{
+ pa_context_state_t state;
+ pa_context *context;
+ int err;
+
+ context = ppa_context_new(ppa_threaded_mainloop_get_api(loop), name);
+ if(!context)
+ {
+ AL_PRINT("pa_context_new() failed\n");
+ return NULL;
+ }
+
+ ppa_context_set_state_callback(context, context_state_callback, loop);
+
+ if((err=ppa_context_connect(context, NULL, pulse_ctx_flags, NULL)) >= 0)
+ {
+ while((state=ppa_context_get_state(context)) != PA_CONTEXT_READY)
+ {
+ if(!PA_CONTEXT_IS_GOOD(state))
+ {
+ err = ppa_context_errno(context);
+ break;
+ }
+
+ ppa_threaded_mainloop_wait(loop);
+ }
+ }
+ ppa_context_set_state_callback(context, NULL, NULL);
+
+ if(err < 0)
+ {
+ AL_PRINT("Context did not connect: %s\n", ppa_strerror(err));
+ ppa_context_unref(context);
+ return NULL;
+ }
+
+ return context;
+}
+
static pa_stream *connect_playback_stream(ALCdevice *device,
pa_stream_flags_t flags, pa_buffer_attr *attr, pa_sample_spec *spec,
pa_channel_map *chanmap)
@@ -473,7 +513,6 @@ static pa_stream *connect_playback_stream(ALCdevice *device,
static ALCboolean pulse_open(ALCdevice *device, const ALCchar *device_name) //{{{
{
pulse_data *data = ppa_xmalloc(sizeof(pulse_data));
- pa_context_state_t state;
memset(data, 0, sizeof(*data));
@@ -487,7 +526,6 @@ static ALCboolean pulse_open(ALCdevice *device, const ALCchar *device_name) //{{
AL_PRINT("pa_threaded_mainloop_new() failed!\n");
goto out;
}
-
if(ppa_threaded_mainloop_start(data->loop) < 0)
{
AL_PRINT("pa_threaded_mainloop_start() failed\n");
@@ -497,46 +535,12 @@ static ALCboolean pulse_open(ALCdevice *device, const ALCchar *device_name) //{{
ppa_threaded_mainloop_lock(data->loop);
device->ExtraData = data;
- data->context = ppa_context_new(ppa_threaded_mainloop_get_api(data->loop), data->context_name);
+ data->context = connect_context(data->loop, data->context_name);
if(!data->context)
{
- AL_PRINT("pa_context_new() failed\n");
-
- ppa_threaded_mainloop_unlock(data->loop);
- goto out;
- }
-
- ppa_context_set_state_callback(data->context, context_state_callback, data->loop);
-
- if(ppa_context_connect(data->context, NULL, pulse_ctx_flags, NULL) < 0)
- {
- AL_PRINT("Context did not connect: %s\n",
- ppa_strerror(ppa_context_errno(data->context)));
-
- ppa_context_unref(data->context);
- data->context = NULL;
-
ppa_threaded_mainloop_unlock(data->loop);
goto out;
}
-
- while((state=ppa_context_get_state(data->context)) != PA_CONTEXT_READY)
- {
- if(!PA_CONTEXT_IS_GOOD(state))
- {
- int err = ppa_context_errno(data->context);
- if(err != PA_ERR_CONNECTIONREFUSED)
- AL_PRINT("Context did not get ready: %s\n", ppa_strerror(err));
-
- ppa_context_unref(data->context);
- data->context = NULL;
-
- ppa_threaded_mainloop_unlock(data->loop);
- goto out;
- }
-
- ppa_threaded_mainloop_wait(data->loop);
- }
ppa_context_set_state_callback(data->context, context_state_callback2, device);
device->szDeviceName = strdup(device_name);