Lennart Poettering c6ba4a
From 59ccd2aca941b4653803f5415b4985ab35de0c35 Mon Sep 17 00:00:00 2001
Lennart Poettering c6ba4a
From: Lennart Poettering <mznyfn@0pointer.de>
Lennart Poettering c6ba4a
Date: Tue, 4 Aug 2009 23:55:05 +0200
Lennart Poettering c6ba4a
Subject: [PATCH 09/11] pulse: unify stream/context state checks
Lennart Poettering c6ba4a
Lennart Poettering c6ba4a
Unify (and simplify) the paths that check for the validity of a
Lennart Poettering c6ba4a
stream/context: always call into check_stream()/pulse_check_connection()
Lennart Poettering c6ba4a
when applicable instead of rolling our own checks each time. Also check
Lennart Poettering c6ba4a
for validity of mainloop before locking it.
Lennart Poettering c6ba4a
Lennart Poettering c6ba4a
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Lennart Poettering c6ba4a
---
Lennart Poettering c6ba4a
 pulse/ctl_pulse.c |   72 ++++++++++++++++++++++++++++++++----------
Lennart Poettering c6ba4a
 pulse/pcm_pulse.c |   90 +++++++++++++++++++++++-----------------------------
Lennart Poettering c6ba4a
 2 files changed, 95 insertions(+), 67 deletions(-)
Lennart Poettering c6ba4a
Lennart Poettering c6ba4a
diff --git a/pulse/ctl_pulse.c b/pulse/ctl_pulse.c
Lennart Poettering c6ba4a
index 2caa29b..879f260 100644
Lennart Poettering c6ba4a
--- a/pulse/ctl_pulse.c
Lennart Poettering c6ba4a
+++ b/pulse/ctl_pulse.c
Lennart Poettering c6ba4a
@@ -150,9 +150,13 @@ static int pulse_update_volume(snd_ctl_pulse_t * ctl)
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
 	assert(ctl);
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
-	if (!ctl->p || !ctl->p->mainloop || !ctl->p->context)
Lennart Poettering c6ba4a
+	if (!ctl->p)
Lennart Poettering c6ba4a
 		return -EBADFD;
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
+	err = pulse_check_connection(ctl->p);
Lennart Poettering c6ba4a
+	if (err < 0)
Lennart Poettering c6ba4a
+		return err;
Lennart Poettering c6ba4a
+
Lennart Poettering c6ba4a
 	o = pa_context_get_sink_info_by_name(ctl->p->context, ctl->sink,
Lennart Poettering c6ba4a
 					     sink_info_cb, ctl);
Lennart Poettering c6ba4a
 	if (o) {
Lennart Poettering c6ba4a
@@ -182,17 +186,27 @@ static int pulse_update_volume(snd_ctl_pulse_t * ctl)
Lennart Poettering c6ba4a
 static int pulse_elem_count(snd_ctl_ext_t * ext)
Lennart Poettering c6ba4a
 {
Lennart Poettering c6ba4a
 	snd_ctl_pulse_t *ctl = ext->private_data;
Lennart Poettering c6ba4a
-	int count = 0;
Lennart Poettering c6ba4a
+	int count = 0, err;
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
 	assert(ctl);
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
+	if (!ctl->p || !ctl->p->mainloop)
Lennart Poettering c6ba4a
+		return -EBADFD;
Lennart Poettering c6ba4a
+
Lennart Poettering c6ba4a
 	pa_threaded_mainloop_lock(ctl->p->mainloop);
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
+	err = pulse_check_connection(ctl->p);
Lennart Poettering c6ba4a
+	if (err < 0) {
Lennart Poettering c6ba4a
+		count = err;
Lennart Poettering c6ba4a
+		goto finish;
Lennart Poettering c6ba4a
+	}
Lennart Poettering c6ba4a
+
Lennart Poettering c6ba4a
 	if (ctl->source)
Lennart Poettering c6ba4a
 		count += 2;
Lennart Poettering c6ba4a
 	if (ctl->sink)
Lennart Poettering c6ba4a
 		count += 2;
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
+finish:
Lennart Poettering c6ba4a
 	pa_threaded_mainloop_unlock(ctl->p->mainloop);
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
 	return count;
Lennart Poettering c6ba4a
@@ -202,16 +216,21 @@ static int pulse_elem_list(snd_ctl_ext_t * ext, unsigned int offset,
Lennart Poettering c6ba4a
 			   snd_ctl_elem_id_t * id)
Lennart Poettering c6ba4a
 {
Lennart Poettering c6ba4a
 	snd_ctl_pulse_t *ctl = ext->private_data;
Lennart Poettering c6ba4a
+	int err;
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
 	assert(ctl);
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
-	if (!ctl->p || !ctl->p->mainloop || !ctl->p->context)
Lennart Poettering c6ba4a
+	if (!ctl->p || !ctl->p->mainloop)
Lennart Poettering c6ba4a
 		return -EBADFD;
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
 	snd_ctl_elem_id_set_interface(id, SND_CTL_ELEM_IFACE_MIXER);
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
 	pa_threaded_mainloop_lock(ctl->p->mainloop);
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
+	err = pulse_check_connection(ctl->p);
Lennart Poettering c6ba4a
+	if (err < 0)
Lennart Poettering c6ba4a
+		goto finish;
Lennart Poettering c6ba4a
+
Lennart Poettering c6ba4a
 	if (ctl->source) {
Lennart Poettering c6ba4a
 		if (offset == 0)
Lennart Poettering c6ba4a
 			snd_ctl_elem_id_set_name(id, SOURCE_VOL_NAME);
Lennart Poettering c6ba4a
@@ -220,14 +239,19 @@ static int pulse_elem_list(snd_ctl_ext_t * ext, unsigned int offset,
Lennart Poettering c6ba4a
 	} else
Lennart Poettering c6ba4a
 		offset += 2;
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
+	err = 0;
Lennart Poettering c6ba4a
+
Lennart Poettering c6ba4a
+finish:
Lennart Poettering c6ba4a
 	pa_threaded_mainloop_unlock(ctl->p->mainloop);
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
-	if (offset == 2)
Lennart Poettering c6ba4a
-		snd_ctl_elem_id_set_name(id, SINK_VOL_NAME);
Lennart Poettering c6ba4a
-	else if (offset == 3)
Lennart Poettering c6ba4a
-		snd_ctl_elem_id_set_name(id, SINK_MUTE_NAME);
Lennart Poettering c6ba4a
+	if (err >= 0) {
Lennart Poettering c6ba4a
+		if (offset == 2)
Lennart Poettering c6ba4a
+			snd_ctl_elem_id_set_name(id, SINK_VOL_NAME);
Lennart Poettering c6ba4a
+		else if (offset == 3)
Lennart Poettering c6ba4a
+			snd_ctl_elem_id_set_name(id, SINK_MUTE_NAME);
Lennart Poettering c6ba4a
+	}
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
-	return 0;
Lennart Poettering c6ba4a
+	return err;
Lennart Poettering c6ba4a
 }
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
 static snd_ctl_ext_key_t pulse_find_elem(snd_ctl_ext_t * ext,
Lennart Poettering c6ba4a
@@ -266,7 +290,7 @@ static int pulse_get_attribute(snd_ctl_ext_t * ext, snd_ctl_ext_key_t key,
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
 	assert(ctl);
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
-	if (!ctl->p || !ctl->p->mainloop || !ctl->p->context)
Lennart Poettering c6ba4a
+	if (!ctl->p || !ctl->p->mainloop)
Lennart Poettering c6ba4a
 		return -EBADFD;
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
 	pa_threaded_mainloop_lock(ctl->p->mainloop);
Lennart Poettering c6ba4a
@@ -319,7 +343,7 @@ static int pulse_read_integer(snd_ctl_ext_t * ext, snd_ctl_ext_key_t key,
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
 	assert(ctl);
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
-	if (!ctl->p || !ctl->p->mainloop || !ctl->p->context)
Lennart Poettering c6ba4a
+	if (!ctl->p || !ctl->p->mainloop)
Lennart Poettering c6ba4a
 		return -EBADFD;
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
 	pa_threaded_mainloop_lock(ctl->p->mainloop);
Lennart Poettering c6ba4a
@@ -371,7 +395,7 @@ static int pulse_write_integer(snd_ctl_ext_t * ext, snd_ctl_ext_key_t key,
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
 	assert(ctl);
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
-	if (!ctl->p || !ctl->p->mainloop || !ctl->p->context)
Lennart Poettering c6ba4a
+	if (!ctl->p || !ctl->p->mainloop)
Lennart Poettering c6ba4a
 		return -EBADFD;
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
 	pa_threaded_mainloop_lock(ctl->p->mainloop);
Lennart Poettering c6ba4a
@@ -476,7 +500,7 @@ static void pulse_subscribe_events(snd_ctl_ext_t * ext, int subscribe)
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
 	assert(ctl);
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
-	if (!ctl->p || !ctl->p->mainloop || !ctl->p->context)
Lennart Poettering c6ba4a
+	if (!ctl->p || !ctl->p->mainloop)
Lennart Poettering c6ba4a
 		return;
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
 	pa_threaded_mainloop_lock(ctl->p->mainloop);
Lennart Poettering c6ba4a
@@ -491,17 +515,23 @@ static int pulse_read_event(snd_ctl_ext_t * ext, snd_ctl_elem_id_t * id,
Lennart Poettering c6ba4a
 {
Lennart Poettering c6ba4a
 	snd_ctl_pulse_t *ctl = ext->private_data;
Lennart Poettering c6ba4a
 	int offset;
Lennart Poettering c6ba4a
-	int err = -EAGAIN;
Lennart Poettering c6ba4a
+	int err;
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
 	assert(ctl);
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
-	if (!ctl->p || !ctl->p->mainloop || !ctl->p->context)
Lennart Poettering c6ba4a
+	if (!ctl->p || !ctl->p->mainloop)
Lennart Poettering c6ba4a
 		return -EBADFD;
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
 	pa_threaded_mainloop_lock(ctl->p->mainloop);
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
-	if (!ctl->updated || !ctl->subscribed)
Lennart Poettering c6ba4a
+	err = pulse_check_connection(ctl->p);
Lennart Poettering c6ba4a
+	if (err < 0)
Lennart Poettering c6ba4a
+		goto finish;
Lennart Poettering c6ba4a
+
Lennart Poettering c6ba4a
+	if (!ctl->updated || !ctl->subscribed) {
Lennart Poettering c6ba4a
+		err = -EAGAIN;
Lennart Poettering c6ba4a
 		goto finish;
Lennart Poettering c6ba4a
+	}
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
 	if (ctl->source)
Lennart Poettering c6ba4a
 		offset = 2;
Lennart Poettering c6ba4a
@@ -540,20 +570,28 @@ static int pulse_ctl_poll_revents(snd_ctl_ext_t * ext, struct pollfd *pfd,
Lennart Poettering c6ba4a
 				  unsigned short *revents)
Lennart Poettering c6ba4a
 {
Lennart Poettering c6ba4a
 	snd_ctl_pulse_t *ctl = ext->private_data;
Lennart Poettering c6ba4a
-	int err = 0;
Lennart Poettering c6ba4a
+	int err;
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
 	assert(ctl);
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
-	if (!ctl->p || !ctl->p->mainloop || !ctl->p->context)
Lennart Poettering c6ba4a
+	if (!ctl->p || !ctl->p->mainloop)
Lennart Poettering c6ba4a
 		return -EBADFD;
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
 	pa_threaded_mainloop_lock(ctl->p->mainloop);
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
+	err = pulse_check_connection(ctl->p);
Lennart Poettering c6ba4a
+	if (err < 0)
Lennart Poettering c6ba4a
+		goto finish;
Lennart Poettering c6ba4a
+
Lennart Poettering c6ba4a
 	if (ctl->updated)
Lennart Poettering c6ba4a
 		*revents = POLLIN;
Lennart Poettering c6ba4a
 	else
Lennart Poettering c6ba4a
 		*revents = 0;
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
+	err = 0;
Lennart Poettering c6ba4a
+
Lennart Poettering c6ba4a
+finish:
Lennart Poettering c6ba4a
+
Lennart Poettering c6ba4a
 	pa_threaded_mainloop_unlock(ctl->p->mainloop);
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
 	return err;
Lennart Poettering c6ba4a
diff --git a/pulse/pcm_pulse.c b/pulse/pcm_pulse.c
Lennart Poettering c6ba4a
index a625f55..98983f8 100644
Lennart Poettering c6ba4a
--- a/pulse/pcm_pulse.c
Lennart Poettering c6ba4a
+++ b/pulse/pcm_pulse.c
Lennart Poettering c6ba4a
@@ -135,11 +135,15 @@ static int update_active(snd_pcm_pulse_t *pcm) {
Lennart Poettering c6ba4a
 	if (!pcm->p)
Lennart Poettering c6ba4a
 		return -EBADFD;
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
-	ret = check_active(pcm);
Lennart Poettering c6ba4a
+	ret = check_stream(pcm);
Lennart Poettering c6ba4a
 	if (ret < 0)
Lennart Poettering c6ba4a
-		return ret;
Lennart Poettering c6ba4a
+		goto finish;
Lennart Poettering c6ba4a
+
Lennart Poettering c6ba4a
+	ret = check_active(pcm);
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
-	if (ret > 0)
Lennart Poettering c6ba4a
+finish:
Lennart Poettering c6ba4a
+
Lennart Poettering c6ba4a
+	if (ret != 0) /* On error signal the caller, too */
Lennart Poettering c6ba4a
 		pulse_poll_activate(pcm->p);
Lennart Poettering c6ba4a
 	else
Lennart Poettering c6ba4a
 		pulse_poll_deactivate(pcm->p);
Lennart Poettering c6ba4a
@@ -199,12 +203,12 @@ static int pulse_start(snd_pcm_ioplug_t * io)
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
 	assert(pcm);
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
-	if (!pcm->p)
Lennart Poettering c6ba4a
+	if (!pcm->p || !pcm->p->mainloop)
Lennart Poettering c6ba4a
 		return -EBADFD;
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
 	pa_threaded_mainloop_lock(pcm->p->mainloop);
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
-	err = pulse_check_connection(pcm->p);
Lennart Poettering c6ba4a
+	err = check_stream(pcm);
Lennart Poettering c6ba4a
 	if (err < 0)
Lennart Poettering c6ba4a
 		goto finish;
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
@@ -244,12 +248,12 @@ static int pulse_stop(snd_pcm_ioplug_t * io)
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
 	assert(pcm);
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
-	if (!pcm->p)
Lennart Poettering c6ba4a
+	if (!pcm->p || !pcm->p->mainloop)
Lennart Poettering c6ba4a
 		return -EBADFD;
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
 	pa_threaded_mainloop_lock(pcm->p->mainloop);
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
-	err = pulse_check_connection(pcm->p);
Lennart Poettering c6ba4a
+	err = check_stream(pcm);
Lennart Poettering c6ba4a
 	if (err < 0)
Lennart Poettering c6ba4a
 		goto finish;
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
@@ -291,12 +295,12 @@ static int pulse_drain(snd_pcm_ioplug_t * io)
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
 	assert(pcm);
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
-	if (!pcm->p)
Lennart Poettering c6ba4a
+	if (!pcm->p || !pcm->p->mainloop)
Lennart Poettering c6ba4a
 		return -EBADFD;
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
 	pa_threaded_mainloop_lock(pcm->p->mainloop);
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
-	err = pulse_check_connection(pcm->p);
Lennart Poettering c6ba4a
+	err = check_stream(pcm);
Lennart Poettering c6ba4a
 	if (err < 0)
Lennart Poettering c6ba4a
 		goto finish;
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
@@ -328,7 +332,7 @@ static snd_pcm_sframes_t pulse_pointer(snd_pcm_ioplug_t * io)
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
 	assert(pcm);
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
-	if (!pcm->p)
Lennart Poettering c6ba4a
+	if (!pcm->p || !pcm->p->mainloop)
Lennart Poettering c6ba4a
 		return -EBADFD;
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
 	if (io->state == SND_PCM_STATE_XRUN)
Lennart Poettering c6ba4a
@@ -339,12 +343,7 @@ static snd_pcm_sframes_t pulse_pointer(snd_pcm_ioplug_t * io)
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
 	pa_threaded_mainloop_lock(pcm->p->mainloop);
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
-	if (!pcm->stream) {
Lennart Poettering c6ba4a
-		ret = -EBADFD;
Lennart Poettering c6ba4a
-		goto finish;
Lennart Poettering c6ba4a
-	}
Lennart Poettering c6ba4a
-
Lennart Poettering c6ba4a
-	ret = pulse_check_connection(pcm->p);
Lennart Poettering c6ba4a
+	ret = check_stream(pcm);
Lennart Poettering c6ba4a
 	if (ret < 0)
Lennart Poettering c6ba4a
 		goto finish;
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
@@ -379,18 +378,13 @@ static int pulse_delay(snd_pcm_ioplug_t * io, snd_pcm_sframes_t * delayp)
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
 	assert(pcm);
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
-	if (!pcm->p)
Lennart Poettering c6ba4a
+	if (!pcm->p || !pcm->p->mainloop)
Lennart Poettering c6ba4a
 		return -EBADFD;
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
 	pa_threaded_mainloop_lock(pcm->p->mainloop);
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
-	if (!pcm->stream) {
Lennart Poettering c6ba4a
-		err = -EBADFD;
Lennart Poettering c6ba4a
-		goto finish;
Lennart Poettering c6ba4a
-	}
Lennart Poettering c6ba4a
-
Lennart Poettering c6ba4a
 	for (;;) {
Lennart Poettering c6ba4a
-		err = pulse_check_connection(pcm->p);
Lennart Poettering c6ba4a
+		err = check_stream(pcm);
Lennart Poettering c6ba4a
 		if (err < 0)
Lennart Poettering c6ba4a
 			goto finish;
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
@@ -433,17 +427,12 @@ static snd_pcm_sframes_t pulse_write(snd_pcm_ioplug_t * io,
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
 	assert(pcm);
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
-	if (!pcm->p)
Lennart Poettering c6ba4a
+	if (!pcm->p || !pcm->p->mainloop)
Lennart Poettering c6ba4a
 		return -EBADFD;
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
 	pa_threaded_mainloop_lock(pcm->p->mainloop);
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
-	if (!pcm->stream) {
Lennart Poettering c6ba4a
-		ret = -EBADFD;
Lennart Poettering c6ba4a
-		goto finish;
Lennart Poettering c6ba4a
-	}
Lennart Poettering c6ba4a
-
Lennart Poettering c6ba4a
-	ret = pulse_check_connection(pcm->p);
Lennart Poettering c6ba4a
+	ret = check_stream(pcm);
Lennart Poettering c6ba4a
 	if (ret < 0)
Lennart Poettering c6ba4a
 		goto finish;
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
@@ -493,17 +482,12 @@ static snd_pcm_sframes_t pulse_read(snd_pcm_ioplug_t * io,
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
 	assert(pcm);
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
-	if (!pcm->p)
Lennart Poettering c6ba4a
+	if (!pcm->p || !pcm->p->mainloop)
Lennart Poettering c6ba4a
 		return -EBADFD;
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
 	pa_threaded_mainloop_lock(pcm->p->mainloop);
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
-	if (!pcm->stream) {
Lennart Poettering c6ba4a
-		ret = -EBADFD;
Lennart Poettering c6ba4a
-		goto finish;
Lennart Poettering c6ba4a
-	}
Lennart Poettering c6ba4a
-
Lennart Poettering c6ba4a
-	ret = pulse_check_connection(pcm->p);
Lennart Poettering c6ba4a
+	ret = check_stream(pcm);
Lennart Poettering c6ba4a
 	if (ret < 0)
Lennart Poettering c6ba4a
 		goto finish;
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
@@ -624,13 +608,16 @@ static int pulse_pcm_poll_revents(snd_pcm_ioplug_t * io,
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
 	assert(pcm);
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
-	if (!pcm->p)
Lennart Poettering c6ba4a
+	if (!pcm->p || !pcm->p->mainloop)
Lennart Poettering c6ba4a
 		return -EBADFD;
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
 	pa_threaded_mainloop_lock(pcm->p->mainloop);
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
-	err = check_active(pcm);
Lennart Poettering c6ba4a
+	err = check_stream(pcm);
Lennart Poettering c6ba4a
+	if (err < 0)
Lennart Poettering c6ba4a
+		goto finish;
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
+	err = check_active(pcm);
Lennart Poettering c6ba4a
 	if (err < 0)
Lennart Poettering c6ba4a
 		goto finish;
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
@@ -655,7 +642,7 @@ static int pulse_prepare(snd_pcm_ioplug_t * io)
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
 	assert(pcm);
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
-	if (!pcm->p)
Lennart Poettering c6ba4a
+	if (!pcm->p || !pcm->p->mainloop)
Lennart Poettering c6ba4a
 		return -EBADFD;
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
 	pa_threaded_mainloop_lock(pcm->p->mainloop);
Lennart Poettering c6ba4a
@@ -757,7 +744,7 @@ static int pulse_hw_params(snd_pcm_ioplug_t * io,
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
 	assert(pcm);
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
-	if (!pcm->p)
Lennart Poettering c6ba4a
+	if (!pcm->p || !pcm->p->mainloop)
Lennart Poettering c6ba4a
 		return -EBADFD;
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
 	pa_threaded_mainloop_lock(pcm->p->mainloop);
Lennart Poettering c6ba4a
@@ -856,23 +843,26 @@ static int pulse_pause(snd_pcm_ioplug_t * io, int enable)
Lennart Poettering c6ba4a
 {
Lennart Poettering c6ba4a
 	snd_pcm_pulse_t *pcm = io->private_data;
Lennart Poettering c6ba4a
 	int err = 0;
Lennart Poettering c6ba4a
+	pa_operation *o;
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
 	assert (pcm);
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
-	if (!pcm->p)
Lennart Poettering c6ba4a
+	if (!pcm->p || !pcm->p->mainloop)
Lennart Poettering c6ba4a
 		return -EBADFD;
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
 	pa_threaded_mainloop_lock(pcm->p->mainloop);
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
-	if (pcm->stream) {
Lennart Poettering c6ba4a
-		pa_operation *o;
Lennart Poettering c6ba4a
-		o = pa_stream_cork(pcm->stream, enable, NULL, NULL);
Lennart Poettering c6ba4a
-		if (o)
Lennart Poettering c6ba4a
-			pa_operation_unref(o);
Lennart Poettering c6ba4a
-		else
Lennart Poettering c6ba4a
-			err = -EIO;
Lennart Poettering c6ba4a
-	}
Lennart Poettering c6ba4a
+	err = check_stream(pcm);
Lennart Poettering c6ba4a
+	if (err < 0)
Lennart Poettering c6ba4a
+		goto finish;
Lennart Poettering c6ba4a
+
Lennart Poettering c6ba4a
+	o = pa_stream_cork(pcm->stream, enable, NULL, NULL);
Lennart Poettering c6ba4a
+	if (o)
Lennart Poettering c6ba4a
+		pa_operation_unref(o);
Lennart Poettering c6ba4a
+	else
Lennart Poettering c6ba4a
+		err = -EIO;
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
+finish:
Lennart Poettering c6ba4a
 	pa_threaded_mainloop_unlock(pcm->p->mainloop);
Lennart Poettering c6ba4a
 
Lennart Poettering c6ba4a
 	return err;
Lennart Poettering c6ba4a
-- 
Lennart Poettering c6ba4a
1.6.4
Lennart Poettering c6ba4a