writers: Unify ->pre_select().
[paraslash.git] / alsa_write.c
index 7f045aad9f5d426c7b09d0d61fadc1cb89094504..3428def83076b9f8b89fc4c1e41bd0c921e54fbb 100644 (file)
@@ -143,10 +143,9 @@ static int alsa_init(struct private_alsa_write_data *pad,
 }
 
 /* Open an instance of the alsa writer. */
-static int alsa_open(struct writer_node *wn)
+static void alsa_open(struct writer_node *wn)
 {
        wn->private_data = para_calloc(sizeof(struct private_alsa_write_data));
-       return 1;
 }
 
 static void alsa_write_pre_select(struct sched *s, struct task *t)
@@ -155,15 +154,12 @@ static void alsa_write_pre_select(struct sched *s, struct task *t)
        struct private_alsa_write_data *pad = wn->private_data;
        struct timeval tv;
        snd_pcm_sframes_t avail, underrun;
-       int ret;
+       int ret = btr_node_status(wn->btrn, wn->min_iqs, BTR_NT_LEAF);
 
-       if (!pad->handle)
-               return;
-       ret = btr_node_status(wn->btrn, wn->min_iqs, BTR_NT_LEAF);
-       if (ret < 0)
-               sched_request_timeout_ms(20, s);
-       if (ret <= 0)
+       if (ret == 0)
                return;
+       if (ret < 0 || !pad->handle)
+               return sched_min_delay(s);
        /*
         * Data is available to be written to the alsa handle.  Compute number
         * of milliseconds until next buffer underrun would occur.
@@ -183,8 +179,7 @@ static void alsa_write_pre_select(struct sched *s, struct task *t)
                underrun = 50;
        underrun -= 50;
        ms2tv(underrun, &tv);
-       if (tv_diff(&s->timeout, &tv, NULL) > 0)
-               s->timeout = tv;
+       sched_request_timeout(&tv, s);
 }
 
 static void alsa_close(struct writer_node *wn)
@@ -257,6 +252,7 @@ again:
                if (ret < 0)
                        goto err;
                wn->min_iqs = pad->bytes_per_frame;
+               goto again;
        }
        frames = bytes / pad->bytes_per_frame;
        frames = snd_pcm_writei(pad->handle, data, frames);
@@ -279,21 +275,14 @@ err:
        t->error = ret;
 }
 
-__malloc static void *alsa_parse_config(const char *options)
+__malloc static void *alsa_parse_config_or_die(const char *options)
 {
-       int ret;
-       struct alsa_write_args_info *conf
-               = para_calloc(sizeof(struct alsa_write_args_info));
+       struct alsa_write_args_info *conf = para_calloc(sizeof(*conf));
 
        PARA_INFO_LOG("options: %s, %zd\n", options, strcspn(options, " \t"));
-       ret = alsa_cmdline_parser_string(options, conf, "alsa_write");
-       if (ret)
-               goto err_out;
-       PARA_INFO_LOG("help given: %d\n", conf->help_given);
+       /* exits on errors */
+       alsa_cmdline_parser_string(options, conf, "alsa_write");
        return conf;
-err_out:
-       free(conf);
-       return NULL;
 }
 
 static void alsa_free_config(void *conf)
@@ -317,7 +306,7 @@ void alsa_write_init(struct writer *w)
        w->close = alsa_close;
        w->pre_select = alsa_write_pre_select;
        w->post_select = alsa_write_post_select;
-       w->parse_config = alsa_parse_config;
+       w->parse_config_or_die = alsa_parse_config_or_die;
        w->shutdown = NULL; /* nothing to do */
        w->free_config = alsa_free_config;
        w->help = (struct ggo_help) {