string: Clean up for_each_line() and related functions.
[paraslash.git] / alsa_write.c
index a4863a59a5bc3a426a08e6a69d333bded736d780..ba844db2b2b419363b01d1d1d21e28411ae92b37 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2005-2012 Andre Noll <maan@systemlinux.org>
+ * Copyright (C) 2005-2013 Andre Noll <maan@systemlinux.org>
  *
  * Licensed under the GPL v2. For licencing details see COPYING.
  */
@@ -72,7 +72,7 @@ static int alsa_init(struct private_alsa_write_data *pad,
        snd_pcm_sw_params_t *swparams;
        snd_pcm_uframes_t start_threshold, stop_threshold;
        snd_pcm_uframes_t buffer_size, period_size;
-       snd_output_t *log;
+       snd_output_t *output_log;
        unsigned buffer_time;
        int ret;
        const char *msg;
@@ -113,6 +113,8 @@ static int alsa_init(struct private_alsa_write_data *pad,
                NULL);
        if (ret < 0 || buffer_time == 0)
                goto fail;
+       /* buffer at most 500 milliseconds */
+       buffer_time = PARA_MIN(buffer_time, 500U * 1000U);
        msg = "could not set buffer time";
        ret = snd_pcm_hw_params_set_buffer_time_near(pad->handle, hwparams,
                &buffer_time, NULL);
@@ -161,12 +163,12 @@ static int alsa_init(struct private_alsa_write_data *pad,
        ret = snd_pcm_nonblock(pad->handle, 1);
        if (ret < 0)
                goto fail;
-       ret = snd_output_buffer_open(&log);
+       ret = snd_output_buffer_open(&output_log);
        if (ret == 0) {
                char *buf;
                PARA_INFO_LOG("dumping alsa configuration\n");
-               snd_pcm_dump(pad->handle, log);
-               snd_output_buffer_string(log, &buf);
+               snd_pcm_dump(pad->handle, output_log);
+               snd_output_buffer_string(output_log, &buf);
                for (;;) {
                        char *p = strchr(buf, '\n');
                        if (!p) /* omit last output line, it's empty */
@@ -175,7 +177,7 @@ static int alsa_init(struct private_alsa_write_data *pad,
                        PARA_INFO_LOG("%s\n", buf);
                        buf = p + 1;
                }
-               snd_output_close(log);
+               snd_output_close(output_log);
        }
        return 1;
 fail:
@@ -245,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;
@@ -322,22 +326,22 @@ again:
        ret = -E_ALSA;
 err:
        assert(ret < 0);
-       btr_remove_node(btrn);
+       btr_remove_node(&wn->btrn);
        t->error = ret;
 }
 
-__malloc static void *alsa_parse_config_or_die(const char *options)
+__malloc static void *alsa_parse_config_or_die(int argc, char **argv)
 {
        struct alsa_write_args_info *conf = para_calloc(sizeof(*conf));
 
        /* exits on errors */
-       alsa_cmdline_parser_string(options, conf, "alsa_write");
+       alsa_write_cmdline_parser(argc, argv, conf);
        return conf;
 }
 
 static void alsa_free_config(void *conf)
 {
-       alsa_cmdline_parser_free(conf);
+       alsa_write_cmdline_parser_free(conf);
 }
 
 /**
@@ -351,16 +355,15 @@ void alsa_write_init(struct writer *w)
 {
        struct alsa_write_args_info dummy;
 
-       alsa_cmdline_parser_init(&dummy);
+       alsa_write_cmdline_parser_init(&dummy);
        w->close = alsa_close;
        w->pre_select = alsa_write_pre_select;
        w->post_select = alsa_write_post_select;
        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) {
                .short_help = alsa_write_args_info_help,
                .detailed_help = alsa_write_args_info_detailed_help
        };
-       alsa_cmdline_parser_free(&dummy);
+       alsa_write_cmdline_parser_free(&dummy);
 }