- int ret, i;
- struct slot_info *s = &slot[slot_num];
- struct audio_format_info *a = &afi[s->format];
-
- PARA_INFO_LOG("opening %s writers\n", audio_formats[s->format]);
- if (!a->num_writers)
- s->wng = setup_default_wng();
- else
- s->wng = wng_new(a->num_writers);
- if (s->fc) {
- s->wng->bufp = s->fc->outbufp;
- s->wng->loaded = s->fc->out_loaded;
- s->wng->input_error = &s->fc->task.error;
- s->wng->channels = &s->fc->channels;
- s->wng->samplerate = &s->fc->samplerate;
- s->fc->output_error = &s->wng->task.error;
- PARA_INFO_LOG("samplerate: %d\n", *s->wng->samplerate);
- } else {
- s->wng->bufp = &s->receiver_node->buf;
- s->wng->loaded = &s->receiver_node->loaded;
- s->wng->input_error = &s->receiver_node->task.error;
- }
- for (i = 0; i < a->num_writers; i++) {
- s->wng->writer_nodes[i].conf = a->writer_conf[i];
- s->wng->writer_nodes[i].writer_num = a->writer_nums[i];
+ int i;
+ struct audio_format_info *a = afi + s->format;
+ struct writer_node *wn;
+ struct btr_node *parent = s->fns[a->num_filters - 1].btrn;
+
+ assert(s->wns == NULL);
+ s->wns = para_calloc(PARA_MAX(1U, a->num_writers)
+ * sizeof(struct writer_node));
+ if (a->num_writers == 0)
+ setup_writer_node(NULL, parent, s->wns);
+ else {
+ PARA_INFO_LOG("opening %s writers\n", audio_formats[s->format]);
+ for (i = 0; i < a->num_writers; i++) {
+ wn = s->wns + i;
+ wn->conf = a->writer_conf[i];
+ wn->writer_num = a->writer_nums[i];
+ register_writer_node(wn, parent);
+ }