]> git.alsa-project.org Git - alsa-plugins.git/commitdiff
pulse: get rid of a number of assert()s
authorLennart Poettering <lennart@poettering.net>
Fri, 31 Jul 2009 13:25:44 +0000 (15:25 +0200)
committerTakashi Iwai <tiwai@suse.de>
Mon, 3 Aug 2009 10:35:35 +0000 (12:35 +0200)
Instead of hitting an assert when any of the plugin functions is called
in an invalid context we should return a clean error to make sure
programs are not unnecessarily aborted.

This should fix issues such as http://pulseaudio.org/ticket/595

Signed-off-by: Takashi Iwai <tiwai@suse.de>
pulse/ctl_pulse.c
pulse/pcm_pulse.c
pulse/pulse.c

index c6cf9e2d5046f2e0a70597f842bcb0c5478dff82..2caa29b5e18593adaa3eafee339392751886e94f 100644 (file)
@@ -125,8 +125,9 @@ static void event_cb(pa_context * c, pa_subscription_event_type_t t,
        pa_operation *o;
 
        assert(ctl);
-       assert(ctl->p);
-       assert(ctl->p->context);
+
+       if (!ctl->p || !ctl->p->mainloop || !ctl->p->context)
+               return;
 
        o = pa_context_get_sink_info_by_name(ctl->p->context, ctl->sink,
                                             sink_info_cb, ctl);
@@ -148,8 +149,9 @@ static int pulse_update_volume(snd_ctl_pulse_t * ctl)
        pa_operation *o;
 
        assert(ctl);
-       assert(ctl->p);
-       assert(ctl->p->context);
+
+       if (!ctl->p || !ctl->p->mainloop || !ctl->p->context)
+               return -EBADFD;
 
        o = pa_context_get_sink_info_by_name(ctl->p->context, ctl->sink,
                                             sink_info_cb, ctl);
@@ -203,6 +205,9 @@ static int pulse_elem_list(snd_ctl_ext_t * ext, unsigned int offset,
 
        assert(ctl);
 
+       if (!ctl->p || !ctl->p->mainloop || !ctl->p->context)
+               return -EBADFD;
+
        snd_ctl_elem_id_set_interface(id, SND_CTL_ELEM_IFACE_MIXER);
 
        pa_threaded_mainloop_lock(ctl->p->mainloop);
@@ -260,7 +265,9 @@ static int pulse_get_attribute(snd_ctl_ext_t * ext, snd_ctl_ext_key_t key,
                return -EINVAL;
 
        assert(ctl);
-       assert(ctl->p);
+
+       if (!ctl->p || !ctl->p->mainloop || !ctl->p->context)
+               return -EBADFD;
 
        pa_threaded_mainloop_lock(ctl->p->mainloop);
 
@@ -311,7 +318,9 @@ static int pulse_read_integer(snd_ctl_ext_t * ext, snd_ctl_ext_key_t key,
        pa_cvolume *vol = NULL;
 
        assert(ctl);
-       assert(ctl->p);
+
+       if (!ctl->p || !ctl->p->mainloop || !ctl->p->context)
+               return -EBADFD;
 
        pa_threaded_mainloop_lock(ctl->p->mainloop);
 
@@ -361,7 +370,9 @@ static int pulse_write_integer(snd_ctl_ext_t * ext, snd_ctl_ext_key_t key,
        pa_cvolume *vol = NULL;
 
        assert(ctl);
-       assert(ctl->p && ctl->p->context);
+
+       if (!ctl->p || !ctl->p->mainloop || !ctl->p->context)
+               return -EBADFD;
 
        pa_threaded_mainloop_lock(ctl->p->mainloop);
 
@@ -465,6 +476,9 @@ static void pulse_subscribe_events(snd_ctl_ext_t * ext, int subscribe)
 
        assert(ctl);
 
+       if (!ctl->p || !ctl->p->mainloop || !ctl->p->context)
+               return;
+
        pa_threaded_mainloop_lock(ctl->p->mainloop);
 
        ctl->subscribed = !!(subscribe & SND_CTL_EVENT_MASK_VALUE);
@@ -481,6 +495,9 @@ static int pulse_read_event(snd_ctl_ext_t * ext, snd_ctl_elem_id_t * id,
 
        assert(ctl);
 
+       if (!ctl->p || !ctl->p->mainloop || !ctl->p->context)
+               return -EBADFD;
+
        pa_threaded_mainloop_lock(ctl->p->mainloop);
 
        if (!ctl->updated || !ctl->subscribed)
@@ -526,7 +543,9 @@ static int pulse_ctl_poll_revents(snd_ctl_ext_t * ext, struct pollfd *pfd,
        int err = 0;
 
        assert(ctl);
-       assert(ctl->p);
+
+       if (!ctl->p || !ctl->p->mainloop || !ctl->p->context)
+               return -EBADFD;
 
        pa_threaded_mainloop_lock(ctl->p->mainloop);
 
index c27683919a3ccd1a13eb14e5cd8a97f0a9d020eb..24347f9a4a9cf19c6a3bbcbeb705037a3db308d5 100644 (file)
@@ -106,6 +106,9 @@ static int update_active(snd_pcm_pulse_t *pcm) {
 
        assert(pcm);
 
+       if (!pcm->p)
+               return -EBADFD;
+
        ret = check_active(pcm);
        if (ret < 0)
                return ret;
@@ -125,7 +128,9 @@ static int pulse_start(snd_pcm_ioplug_t * io)
        int err = 0, err_o = 0, err_u = 0;
 
        assert(pcm);
-       assert(pcm->p);
+
+       if (!pcm->p)
+               return -EBADFD;
 
        pa_threaded_mainloop_lock(pcm->p->mainloop);
 
@@ -174,7 +179,9 @@ static int pulse_stop(snd_pcm_ioplug_t * io)
        int err = 0, err_o = 0, err_u = 0;
 
        assert(pcm);
-       assert(pcm->p);
+
+       if (!pcm->p)
+               return -EBADFD;
 
        pa_threaded_mainloop_lock(pcm->p->mainloop);
 
@@ -224,7 +231,9 @@ static int pulse_drain(snd_pcm_ioplug_t * io)
        int err = 0;
 
        assert(pcm);
-       assert(pcm->p);
+
+       if (!pcm->p)
+               return -EBADFD;
 
        pa_threaded_mainloop_lock(pcm->p->mainloop);
 
@@ -259,7 +268,9 @@ static snd_pcm_sframes_t pulse_pointer(snd_pcm_ioplug_t * io)
        snd_pcm_sframes_t ret = 0;
 
        assert(pcm);
-       assert(pcm->p);
+
+       if (!pcm->p)
+               return -EBADFD;
 
        if (io->state == SND_PCM_STATE_XRUN)
                return -EPIPE;
@@ -269,7 +280,10 @@ static snd_pcm_sframes_t pulse_pointer(snd_pcm_ioplug_t * io)
 
        pa_threaded_mainloop_lock(pcm->p->mainloop);
 
-       assert(pcm->stream);
+       if (!pcm->stream) {
+               ret = -EBADFD;
+               goto finish;
+       }
 
        ret = pulse_check_connection(pcm->p);
        if (ret < 0)
@@ -305,11 +319,16 @@ static int pulse_delay(snd_pcm_ioplug_t * io, snd_pcm_sframes_t * delayp)
        pa_usec_t lat = 0;
 
        assert(pcm);
-       assert(pcm->p);
+
+       if (!pcm->p)
+               return -EBADFD;
 
        pa_threaded_mainloop_lock(pcm->p->mainloop);
 
-       assert(pcm->stream);
+       if (!pcm->stream) {
+               err = -EBADFD;
+               goto finish;
+       }
 
        for (;;) {
                err = pulse_check_connection(pcm->p);
@@ -354,11 +373,16 @@ static snd_pcm_sframes_t pulse_write(snd_pcm_ioplug_t * io,
        snd_pcm_sframes_t ret = 0;
 
        assert(pcm);
-       assert(pcm->p);
+
+       if (!pcm->p)
+               return -EBADFD;
 
        pa_threaded_mainloop_lock(pcm->p->mainloop);
 
-       assert(pcm->stream);
+       if (!pcm->stream) {
+               ret = -EBADFD;
+               goto finish;
+       }
 
        ret = pulse_check_connection(pcm->p);
        if (ret < 0)
@@ -409,11 +433,16 @@ static snd_pcm_sframes_t pulse_read(snd_pcm_ioplug_t * io,
        snd_pcm_sframes_t ret = 0;
 
        assert(pcm);
-       assert(pcm->p);
+
+       if (!pcm->p)
+               return -EBADFD;
 
        pa_threaded_mainloop_lock(pcm->p->mainloop);
 
-       assert(pcm->stream);
+       if (!pcm->stream) {
+               ret = -EBADFD;
+               goto finish;
+       }
 
        ret = pulse_check_connection(pcm->p);
        if (ret < 0)
@@ -480,7 +509,9 @@ static void stream_request_cb(pa_stream * p, size_t length, void *userdata)
        snd_pcm_pulse_t *pcm = userdata;
 
        assert(pcm);
-       assert(pcm->p);
+
+       if (!pcm->p)
+               return;
 
        update_active(pcm);
 }
@@ -490,7 +521,9 @@ static void stream_underrun_cb(pa_stream * p, void *userdata)
        snd_pcm_pulse_t *pcm = userdata;
 
        assert(pcm);
-       assert(pcm->p);
+
+       if (!pcm->p)
+               return;
 
        pcm->underrun = 1;
 }
@@ -499,7 +532,9 @@ static void stream_latency_cb(pa_stream *p, void *userdata) {
        snd_pcm_pulse_t *pcm = userdata;
 
        assert(pcm);
-       assert(pcm->p);
+
+       if (!pcm->p)
+               return;
 
        pa_threaded_mainloop_signal(pcm->p->mainloop, 0);
 }
@@ -512,7 +547,9 @@ static int pulse_pcm_poll_revents(snd_pcm_ioplug_t * io,
        snd_pcm_pulse_t *pcm = io->private_data;
 
        assert(pcm);
-       assert(pcm->p);
+
+       if (!pcm->p)
+               return -EBADFD;
 
        pa_threaded_mainloop_lock(pcm->p->mainloop);
 
@@ -541,7 +578,9 @@ static int pulse_prepare(snd_pcm_ioplug_t * io)
        unsigned c, d;
 
        assert(pcm);
-       assert(pcm->p);
+
+       if (!pcm->p)
+               return -EBADFD;
 
        pa_threaded_mainloop_lock(pcm->p->mainloop);
 
@@ -645,7 +684,9 @@ static int pulse_hw_params(snd_pcm_ioplug_t * io,
        int err = 0;
 
        assert(pcm);
-       assert(pcm->p);
+
+       if (!pcm->p)
+               return -EBADFD;
 
        pa_threaded_mainloop_lock(pcm->p->mainloop);
 
@@ -745,7 +786,9 @@ static int pulse_pause(snd_pcm_ioplug_t * io, int enable)
        int err = 0;
 
        assert (pcm);
-       assert (pcm->p);
+
+       if (!pcm->p)
+               return -EBADFD;
 
        pa_threaded_mainloop_lock(pcm->p->mainloop);
 
index 39402382d549e8d24dd85ee7df61160376706245..95d8dde7fad3a0ef2bbfc6823a1b35192bbdab28 100644 (file)
@@ -32,8 +32,9 @@ int pulse_check_connection(snd_pulse_t * p)
        pa_context_state_t state;
 
        assert(p);
-       assert(p->context);
-       assert(p->mainloop);
+
+       if (!p->context || !p->mainloop)
+               return -EBADFD;
 
        state = pa_context_get_state(p->context);
 
@@ -77,8 +78,12 @@ int pulse_wait_operation(snd_pulse_t * p, pa_operation * o)
 {
        assert(p);
        assert(o);
-       assert(p->state == PULSE_STATE_READY);
-       assert(p->mainloop);
+
+       if (p->state != PULSE_STATE_READY)
+               return -EBADFD;
+
+       if (!p->mainloop)
+               return -EBADFD;
 
        for (;;) {
                int err;
@@ -103,8 +108,12 @@ int pulse_wait_stream_state(snd_pulse_t * p, pa_stream * stream,
 
        assert(p);
        assert(stream);
-       assert(p->state == PULSE_STATE_READY);
-       assert(p->mainloop);
+
+       if (p->state != PULSE_STATE_READY)
+               return -EBADFD;
+
+       if (!p->mainloop)
+               return -EBADFD;
 
        for (;;) {
                int err;
@@ -197,7 +206,9 @@ snd_pulse_t *pulse_new(void)
 
        p->context =
            pa_context_new(pa_threaded_mainloop_get_api(p->mainloop), buf);
-       assert(p->context);
+
+       if (!p->context)
+               goto fail;
 
        pa_context_set_state_callback(p->context, context_state_cb, p);
 
@@ -246,9 +257,12 @@ int pulse_connect(snd_pulse_t * p, const char *server)
        int err;
 
        assert(p);
-       assert(p->context);
-       assert(p->mainloop);
-       assert(p->state == PULSE_STATE_INIT);
+
+       if (!p->context || !p->mainloop)
+               return -EBADFD;
+
+       if (p->state != PULSE_STATE_INIT)
+               return -EBADFD;
 
        pa_threaded_mainloop_lock(p->mainloop);