]> git.tuebingen.mpg.de Git - paraslash.git/blobdiff - alsa_write.c
Add execute handler to struct writer.
[paraslash.git] / alsa_write.c
index 030a5ec60e740ce7a3fe11ad82e72f50d9de4095..e1c5ce312e6ce8f6af6d81c9070b5899e40f1398 100644 (file)
 #include "list.h"
 #include "sched.h"
 #include "ggo.h"
 #include "list.h"
 #include "sched.h"
 #include "ggo.h"
+#include "buffer_tree.h"
 #include "write.h"
 #include "alsa_write.cmdline.h"
 #include "error.h"
 #include "write.h"
 #include "alsa_write.cmdline.h"
 #include "error.h"
-#include "buffer_tree.h"
 
 /** always use 16 bit little endian */
 #define FORMAT SND_PCM_FORMAT_S16_LE
 
 /** always use 16 bit little endian */
 #define FORMAT SND_PCM_FORMAT_S16_LE
@@ -218,9 +218,8 @@ static int alsa_write_pre_select(struct sched *s, struct writer_node *wn)
                return 1;
        if (conf->buffer_tree_given) {
                size_t sz = btr_get_input_queue_size(wn->btrn);
                return 1;
        if (conf->buffer_tree_given) {
                size_t sz = btr_get_input_queue_size(wn->btrn);
-               //PARA_CRIT_LOG("input queue: %zu\n", sz);
-               //if (sz < pad->bytes_per_frame)
-               //      return 1;
+               if (sz < pad->bytes_per_frame)
+                       return 1;
        } else {
                if (*wng->loaded - wn->written < pad->bytes_per_frame)
                        return 1;
        } else {
                if (*wng->loaded - wn->written < pad->bytes_per_frame)
                        return 1;
@@ -316,6 +315,19 @@ static int alsa_write_post_select(__a_unused struct sched *s,
        return -E_ALSA_WRITE;
 }
 
        return -E_ALSA_WRITE;
 }
 
+static void alsa_close(struct writer_node *wn)
+{
+       struct private_alsa_write_data *pad = wn->private_data;
+       PARA_INFO_LOG("closing writer node %p\n", wn);
+
+       if (pad->handle) {
+               snd_pcm_drain(pad->handle);
+               snd_pcm_close(pad->handle);
+               snd_config_update_free_global();
+       }
+       free(pad);
+}
+
 static void alsa_write_post_select_btr(__a_unused struct sched *s,
                struct task *t)
 {
 static void alsa_write_post_select_btr(__a_unused struct sched *s,
                struct task *t)
 {
@@ -373,24 +385,12 @@ again:
        ret = -E_ALSA_WRITE;
 err:
        assert(ret < 0);
        ret = -E_ALSA_WRITE;
 err:
        assert(ret < 0);
+       alsa_close(wn);
        btr_del_node(wn->btrn);
        wn->btrn = NULL;
        t->error = ret;
 }
 
        btr_del_node(wn->btrn);
        wn->btrn = NULL;
        t->error = ret;
 }
 
-static void alsa_close(struct writer_node *wn)
-{
-       struct private_alsa_write_data *pad = wn->private_data;
-       PARA_INFO_LOG("closing writer node %p\n", wn);
-
-       if (pad->handle) {
-               snd_pcm_drain(pad->handle);
-               snd_pcm_close(pad->handle);
-               snd_config_update_free_global();
-       }
-       free(pad);
-}
-
 __malloc static void *alsa_parse_config(const char *options)
 {
        int ret;
 __malloc static void *alsa_parse_config(const char *options)
 {
        int ret;