X-Git-Url: http://git.tuebingen.mpg.de/?a=blobdiff_plain;f=write_common.c;h=8c33b39e08ae783f2ca19ff75f4cda37fcb0a320;hb=5b1e8c76053c57bf3491d4914cb8fd7896c3ff20;hp=ff8999f63eb8b67312db89d07688c93b404d05d0;hpb=03683166610b241183b3cdb311069c96144fa53e;p=paraslash.git diff --git a/write_common.c b/write_common.c index ff8999f6..8c33b39e 100644 --- a/write_common.c +++ b/write_common.c @@ -237,6 +237,21 @@ struct writer_node_group *setup_default_wng(void) return wng; } +void register_writer_node(struct writer_node *wn, struct btr_node *parent) +{ + struct writer *w = writers + wn->writer_num; + char *name = make_message("%s writer", writer_names[wn->writer_num]); + int ret; + + wn->btrn = btr_new_node(name, parent, w->execute, wn); + strcpy(wn->task.status, name); + free(name); + ret = w->open(wn); + wn->task.post_select = w->post_select_btr; + wn->task.pre_select = w->pre_select_btr; + register_task(&wn->task); +} + /** * Setup a writer node with the default writer. * @@ -253,31 +268,19 @@ struct writer_node_group *setup_default_wng(void) * * \return A pointer to the allocated writer node group. */ -struct writer_node *setup_writer_node(const char *arg, struct btr_node *parent) +int setup_writer_node(const char *arg, struct btr_node *parent, + struct writer_node *wn) { - struct writer_node *wn = para_calloc(sizeof(*wn)); - struct writer *w; - const char *name; - if (arg) wn->conf = check_writer_arg(arg, &wn->writer_num); else { wn->writer_num = DEFAULT_WRITER; wn->conf = writers[DEFAULT_WRITER].parse_config(""); } - if (!wn->conf) { - free(wn); - return NULL; - } - w = writers + wn->writer_num; - name = writer_names[wn->writer_num]; - wn->btrn = btr_new_node(name, parent, w->execute, wn); - sprintf(wn->task.status, "%s", name); - w->open(wn); - wn->task.post_select = w->post_select_btr; - wn->task.pre_select = w->pre_select_btr; - register_task(&wn->task); - return wn; + if (!wn->conf) + return -E_WRITE_COMMON_SYNTAX; + register_writer_node(wn, parent); + return 1; } @@ -304,19 +307,30 @@ void print_writer_helps(int detailed) } } -int prepare_writer_node(struct writer_node *wn) +static int get_btr_value(struct btr_node *btrn, const char *key, int32_t *result) { - struct btr_node *btrn = wn->btrn; - size_t iqs; + char *buf = NULL; + int ret = btr_exec_up(btrn, key, &buf); - if (btr_eof(btrn)) - return -E_WRITE_COMMON_EOF; - iqs = btr_get_input_queue_size(btrn); - if (iqs < wn->min_iqs && !btr_no_parent(btrn)) - return 0; - assert(iqs != 0); - /* avoid "buffer too small" errors from the decoder */ - btr_merge(btrn, wn->min_iqs); - return 1; + if (ret < 0) + return ret; + ret = para_atoi32(buf, result); + free(buf); + return ret; } +/* + * Ask parent btr nodes for the samplerate of the current stream. + */ +int get_btr_samplerate(struct btr_node *btrn, int32_t *result) +{ + return get_btr_value(btrn, "samplerate", result); +} + +/* + * Ask parent btr nodes for the channel count of the current stream. + */ +int get_btr_channels(struct btr_node *btrn, int32_t *result) +{ + return get_btr_value(btrn, "channels", result); +}