X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=write_common.c;h=8c33b39e08ae783f2ca19ff75f4cda37fcb0a320;hp=7c0d952108cdec23a43c3c01cfe33b9b6f37b77b;hb=c282c836791cedf57c128555af90af37c7c01c05;hpb=885700289d2c7ab64c3bc5a5ab8f6aba14e27632 diff --git a/write_common.c b/write_common.c index 7c0d9521..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; } @@ -303,3 +306,31 @@ void print_writer_helps(int detailed) ggo_print_help(&w->help, detailed); } } + +static int get_btr_value(struct btr_node *btrn, const char *key, int32_t *result) +{ + char *buf = NULL; + int ret = btr_exec_up(btrn, key, &buf); + + 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); +}