+ * \return A pointer to the allocated writer node group.
+ */
+int setup_writer_node(const char *arg, struct btr_node *parent,
+ struct writer_node *wn)
+{
+ 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)
+ return -E_WRITE_COMMON_SYNTAX;
+ register_writer_node(wn, parent);
+ return 1;
+}
+
+
+/**
+ * Print the help text of all writers to stdout.
+ *
+ * \param detailed Whether to print the detailed help text.
+ */
+void print_writer_helps(int detailed)
+{
+ int i;
+
+ printf_or_die("\nAvailable writers: \n\t");
+ FOR_EACH_WRITER(i)
+ printf_or_die("%s%s", i? " " : "", writer_names[i]);
+ printf_or_die("\n\n");
+ FOR_EACH_WRITER(i) {
+ struct writer *w = writers + i;
+
+ if (!w->help.short_help)
+ continue;
+ printf_or_die("Options for %s:\n", writer_names[i]);
+ 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.