Make writer nodes honor notifications.
authorAndre Noll <maan@systemlinux.org>
Mon, 9 Jul 2012 17:44:03 +0000 (19:44 +0200)
committerAndre Noll <maan@systemlinux.org>
Sun, 18 Nov 2012 19:28:28 +0000 (20:28 +0100)
Currently, nobody is notifying any writer node but the para_play
executable, which will be introduced in subsequent patches, will use
this facility to terminate the audio stream.

alsa_write.c
file_write.c
oss_write.c
osx_write.c

index 16497bd..3f4380a 100644 (file)
@@ -247,8 +247,10 @@ static void alsa_write_post_select(__a_unused struct sched *s,
        snd_pcm_sframes_t frames;
        int ret;
 
+       ret = task_get_notification(t);
+       if (ret < 0)
+               goto err;
 again:
-       t->error = 0;
        ret = btr_node_status(btrn, wn->min_iqs, BTR_NT_LEAF);
        if (ret == 0)
                return;
index 32f6c3a..13008c2 100644 (file)
@@ -110,7 +110,9 @@ static void file_write_post_select(__a_unused struct sched *s,
        char *buf;
        size_t bytes;
 
-       t->error = 0;
+       ret = task_get_notification(t);
+       if (ret < 0)
+               goto out;
        ret = btr_node_status(btrn, wn->min_iqs, BTR_NT_LEAF);
        if (ret <= 0)
                goto out;
index d2dc963..8ca3c52 100644 (file)
@@ -164,13 +164,15 @@ static void oss_post_select(__a_unused struct sched *s,
        struct private_oss_write_data *powd = wn->private_data;
        struct btr_node *btrn = wn->btrn;
        size_t frames, bytes;
-       int ret = btr_node_status(btrn, wn->min_iqs, BTR_NT_LEAF);
+       int ret;
        char *data;
 
+       ret = task_get_notification(t);
        if (ret < 0)
                goto out;
-       if (ret == 0)
-               return;
+       ret = btr_node_status(btrn, wn->min_iqs, BTR_NT_LEAF);
+       if (ret <= 0)
+               goto out;
        if (!powd) {
                int32_t rate, ch, format;
                get_btr_sample_rate(btrn, &rate);
index 8dcfb4c..f8476bf 100644 (file)
@@ -285,15 +285,18 @@ static void osx_write_post_select(__a_unused struct sched *s, struct task *t)
        struct btr_node *btrn = wn->btrn;
        int ret;
 
+       ret = task_get_notification(t);
+       if (ret < 0)
+               goto fail;
        if (!powd) {
                ret = btr_node_status(btrn, wn->min_iqs, BTR_NT_LEAF);
                if (ret == 0)
                        return;
                if (ret < 0)
-                       goto remove_btrn;
+                       goto fail;
                ret = core_audio_init(wn);
                if (ret < 0)
-                       goto remove_btrn;
+                       goto fail;
                powd = wn->private_data;
                AudioOutputUnitStart(powd->audio_unit);
        }
@@ -303,17 +306,18 @@ static void osx_write_post_select(__a_unused struct sched *s, struct task *t)
        if (ret < 0 && need_drain_delay(powd))
                ret = 0;
        mutex_unlock(powd->mutex);
-
        if (ret >= 0)
-               goto out;
-       AudioOutputUnitStop(powd->audio_unit);
-       AudioUnitUninitialize(powd->audio_unit);
-       CloseComponent(powd->audio_unit);
-       btr_remove_node(&powd->callback_btrn);
-remove_btrn:
+               return;
+fail:
+       assert(ret < 0);
+       if (powd && powd->callback_btrn) {
+               AudioOutputUnitStop(powd->audio_unit);
+               AudioUnitUninitialize(powd->audio_unit);
+               CloseComponent(powd->audio_unit);
+               btr_remove_node(&powd->callback_btrn);
+       }
        btr_remove_node(&wn->btrn);
        PARA_NOTICE_LOG("%s\n", para_strerror(-ret));
-out:
        t->error = ret;
 }