}
/* 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)
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.
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)
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);
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)
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) {