X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=alsa_write.c;h=5959545f81e706ad3ebaa34ffb83104d139ca5fb;hp=030a5ec60e740ce7a3fe11ad82e72f50d9de4095;hb=5d83846af5410638179eb18e350278d9c7785073;hpb=c4d243653174f3f4ffc331a4bfc54de94d612f34 diff --git a/alsa_write.c b/alsa_write.c index 030a5ec6..5959545f 100644 --- a/alsa_write.c +++ b/alsa_write.c @@ -25,10 +25,10 @@ #include "list.h" #include "sched.h" #include "ggo.h" +#include "buffer_tree.h" #include "write.h" #include "alsa_write.cmdline.h" #include "error.h" -#include "buffer_tree.h" /** always use 16 bit little endian */ #define FORMAT SND_PCM_FORMAT_S16_LE @@ -151,49 +151,11 @@ static int alsa_open_nobtr(struct writer_node *wn) static int alsa_open_btr(struct writer_node *wn) { - struct alsa_write_args_info *conf = wn->conf; struct private_alsa_write_data *pad = para_calloc(sizeof(*pad)); - int ret; - char *buf = NULL; sprintf(wn->task.status, "alsa writer"); wn->private_data = pad; - - /* defaults */ - pad->samplerate = conf->samplerate_arg; - pad->channels = conf->channels_arg; - - if (!conf->samplerate_given) { /* config option trumps btr_exec */ - /* ask parent btr nodes */ - ret = btr_exec_up(wn->btrn, "samplerate", &buf); - if (ret >= 0) { - int32_t rate; - ret = para_atoi32(buf, &rate); - if (ret < 0) /* should not happen */ - goto out; - pad->samplerate = rate; - } - freep(&buf); - } - - if (!conf->channels_given) { - ret = btr_exec_up(wn->btrn, "channels", &buf); - if (ret >= 0) { - int32_t ch; - ret = para_atoi32(buf, &ch); - if (ret < 0) - goto out; - pad->channels = ch; - } - freep(&buf); - } - PARA_INFO_LOG("%d channel(s), %dHz\n", pad->channels, pad->samplerate); - ret = 1; -out: - freep(&buf); - if (ret < 0) - free(pad); - return ret; + return 1; } static int alsa_open(struct writer_node *wn) { @@ -218,9 +180,8 @@ static int alsa_write_pre_select(struct sched *s, struct writer_node *wn) return 1; if (conf->buffer_tree_given) { size_t sz = btr_get_input_queue_size(wn->btrn); - //PARA_CRIT_LOG("input queue: %zu\n", sz); - //if (sz < pad->bytes_per_frame) - // return 1; + if (sz < pad->bytes_per_frame) + return 1; } else { if (*wng->loaded - wn->written < pad->bytes_per_frame) return 1; @@ -316,6 +277,19 @@ static int alsa_write_post_select(__a_unused struct sched *s, return -E_ALSA_WRITE; } +static void alsa_close(struct writer_node *wn) +{ + struct private_alsa_write_data *pad = wn->private_data; + PARA_INFO_LOG("closing writer node %p\n", wn); + + if (pad->handle) { + snd_pcm_drain(pad->handle); + snd_pcm_close(pad->handle); + snd_config_update_free_global(); + } + free(pad); +} + static void alsa_write_post_select_btr(__a_unused struct sched *s, struct task *t) { @@ -334,9 +308,44 @@ again: if (btr_no_parent(wn->btrn) && (!pad->handle || bytes < pad->bytes_per_frame)) goto err; if (!pad->handle) { + char *buf; + struct alsa_write_args_info *conf = wn->conf; if (bytes == 0) /* no data available */ return; PARA_CRIT_LOG("alsa init\n"); + /* defaults */ + 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(wn->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; + } + } + if (!conf->channels_given) { + buf = NULL; + ret = btr_exec_up(wn->btrn, "channels", &buf); + if (ret >= 0) { + int32_t ch; + + ret = para_atoi32(buf, &ch); + freep(&buf); + if (ret < 0) + goto err; + pad->channels = ch; + } + } + PARA_INFO_LOG("%d channel(s), %dHz\n", pad->channels, pad->samplerate); + ret = 1; ret = alsa_init(pad, wn->conf); if (ret < 0) goto err; @@ -373,24 +382,12 @@ again: ret = -E_ALSA_WRITE; err: assert(ret < 0); + alsa_close(wn); btr_del_node(wn->btrn); wn->btrn = NULL; t->error = ret; } -static void alsa_close(struct writer_node *wn) -{ - struct private_alsa_write_data *pad = wn->private_data; - PARA_INFO_LOG("closing writer node %p\n", wn); - - if (pad->handle) { - snd_pcm_drain(pad->handle); - snd_pcm_close(pad->handle); - snd_config_update_free_global(); - } - free(pad); -} - __malloc static void *alsa_parse_config(const char *options) { int ret;