X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=alsa_write.c;h=77621979783955dd09a48464cee6e9d7dceafbbb;hp=8b56f31a4e9c71443205f7c681a5ba0c2799f031;hb=09cab8901a5ff30aa8a6823a75f2a6161779f025;hpb=015055963d095abd0e153832f5b3f0fda3ac8306 diff --git a/alsa_write.c b/alsa_write.c index 8b56f31a..77621979 100644 --- a/alsa_write.c +++ b/alsa_write.c @@ -152,7 +152,6 @@ static int alsa_open_btr(struct writer_node *wn) { struct private_alsa_write_data *pad = para_calloc(sizeof(*pad)); - sprintf(wn->task.status, "alsa writer"); wn->private_data = pad; return 1; } @@ -173,10 +172,10 @@ static int alsa_write_pre_select(struct sched *s, struct writer_node *wn) if (!pad->handle) return 1; if (wn->btrn) { - size_t sz = btr_get_input_queue_size(wn->btrn); - if (sz < pad->bytes_per_frame) { - if (!btr_no_parent(wn->btrn)) - return 1; + int ret = btr_node_status(wn->btrn, wn->min_iqs, BTR_NT_LEAF); + if (ret == 0) + return 1; + if (ret < 0) { underrun = 10; goto timeout; } @@ -213,7 +212,7 @@ timeout: static void alsa_write_pre_select_btr(struct sched *s, struct task *t) { struct writer_node *wn = container_of(t, struct writer_node, task); - t->error = alsa_write_pre_select(s, wn); + alsa_write_pre_select(s, wn); } static void xrun(snd_pcm_t *handle) @@ -291,6 +290,7 @@ static void alsa_close(struct writer_node *wn) snd_pcm_close(pad->handle); snd_config_update_free_global(); } + alsa_cmdline_parser_free(wn->conf); free(pad); } @@ -307,9 +307,10 @@ static void alsa_write_post_select_btr(__a_unused struct sched *s, again: t->error = 0; - ret = prepare_writer_node(wn); + ret = btr_node_status(btrn, wn->min_iqs, BTR_NT_LEAF); if (ret == 0) return; + btr_merge(btrn, wn->min_iqs); bytes = btr_next_buffer(btrn, &data); if (bytes < pad->bytes_per_frame) { /* eof */ assert(btr_no_parent(btrn)); @@ -323,7 +324,6 @@ again: return; } if (!pad->handle) { - char *buf; struct alsa_write_args_info *conf = wn->conf; if (bytes == 0) /* no data available */ return; @@ -332,32 +332,18 @@ again: pad->samplerate = conf->samplerate_arg; pad->channels = conf->channels_arg; if (!conf->samplerate_given) { /* config option trumps btr_exec */ - /* ask parent btr nodes */ - buf = NULL; - ret = btr_exec_up(btrn, "samplerate", &buf); - PARA_CRIT_LOG("ret: %d\n", ret); - if (ret >= 0) { - int32_t rate; - - ret = para_atoi32(buf, &rate); - free(buf); - if (ret < 0) /* should not happen */ - goto err; - pad->samplerate = rate; - } + int32_t rate; + ret = get_btr_samplerate(btrn, &rate); + if (ret < 0) + goto err; + pad->samplerate = rate; } if (!conf->channels_given) { - buf = NULL; - ret = btr_exec_up(btrn, "channels", &buf); - if (ret >= 0) { - int32_t ch; - - ret = para_atoi32(buf, &ch); - freep(&buf); - if (ret < 0) - goto err; - pad->channels = ch; - } + int32_t ch; + ret = get_btr_channels(btrn, &ch); + if (ret < 0) + goto err; + pad->channels = ch; } PARA_INFO_LOG("%d channel(s), %dHz\n", pad->channels, pad->samplerate); ret = 1; @@ -388,8 +374,6 @@ again: ret = -E_ALSA_WRITE; err: assert(ret < 0); - btr_del_node(btrn); - alsa_close(wn); t->error = ret; }