write: Get rid of gengetopt's string parser.
[paraslash.git] / alsa_write.c
index a4863a59a5bc3a426a08e6a69d333bded736d780..73c9b8232679bde7b4ea910011ba648202761e9b 100644 (file)
@@ -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:
@@ -322,16 +324,16 @@ 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_cmdline_parser(argc, argv, conf);
        return conf;
 }
 
@@ -356,7 +358,6 @@ void alsa_write_init(struct writer *w)
        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,