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.
*
*
* \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;
}
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);
+}