+ struct writer_node *wn = container_of(t, struct writer_node, task);
+ struct private_osx_write_data *powd = wn->private_data;
+ struct btr_node *btrn = wn->btrn;
+ int ret;
+
+ if (!powd) {
+ ret = btr_node_status(btrn, wn->min_iqs, BTR_NT_LEAF);
+ if (ret == 0)
+ return;
+ if (ret < 0)
+ goto remove_btrn;
+ ret = core_audio_init(wn);
+ if (ret < 0)
+ goto remove_btrn;
+ powd = wn->private_data;
+ AudioOutputUnitStart(powd->audio_unit);
+ }
+ mutex_lock(powd->mutex);
+ btr_pushdown(btrn);
+ ret = btr_node_status(btrn, wn->min_iqs, BTR_NT_LEAF);
+ if (ret < 0 && need_drain_delay(powd))
+ ret = 0;
+ mutex_unlock(powd->mutex);
+
+ if (ret >= 0)
+ goto out;
+ AudioOutputUnitStop(powd->audio_unit);
+ AudioUnitUninitialize(powd->audio_unit);
+ CloseComponent(powd->audio_unit);
+ btr_remove_node(powd->callback_btrn);
+ btr_free_node(powd->callback_btrn);
+remove_btrn:
+ btr_remove_node(btrn);
+ PARA_NOTICE_LOG("%s\n", para_strerror(-ret));
+out:
+ t->error = ret;