- osx_cmdline_parser_init(&dummy);
- w->close = osx_write_close;
- w->pre_select = osx_write_pre_select;
- w->post_select = osx_write_post_select;
- w->parse_config_or_die = osx_write_parse_config_or_die;
- w->free_config = osx_free_config;
- w->shutdown = NULL; /* nothing to do */
- w->help = (struct ggo_help) {
- .short_help = osx_write_args_info_help,
- .detailed_help = osx_write_args_info_detailed_help
- };
- osx_cmdline_parser_free(&dummy);
+ ret = task_get_notification(wn->task);
+ if (ret < 0)
+ goto fail;
+ if (!powd) {
+ ret = btr_node_status(btrn, wn->min_iqs, BTR_NT_LEAF);
+ if (ret == 0)
+ return 0;
+ if (ret < 0)
+ goto fail;
+ ret = core_audio_init(wn);
+ if (ret < 0)
+ goto fail;
+ powd = wn->private_data;
+ ret = -E_UNIT_START;
+ if (AudioOutputUnitStart(powd->audio_unit) != noErr) {
+ AudioUnitUninitialize(powd->audio_unit);
+ CloseComponent(powd->audio_unit);
+ btr_remove_node(&powd->callback_btrn);
+ goto fail;
+ }
+ }
+ mutex_lock(powd->mutex);
+ ret = btr_node_status(btrn, wn->min_iqs, BTR_NT_INTERNAL);
+ if (ret > 0)
+ btr_pushdown(btrn);
+ if (ret < 0 && need_drain_delay(powd))
+ ret = 0;
+ mutex_unlock(powd->mutex);
+ if (ret >= 0)
+ return 0;
+fail:
+ assert(ret < 0);
+ if (powd && powd->callback_btrn) {
+ AudioOutputUnitStop(powd->audio_unit);
+ AudioUnitUninitialize(powd->audio_unit);
+ CloseComponent(powd->audio_unit);
+ btr_remove_node(&powd->callback_btrn);
+ }
+ btr_remove_node(&wn->btrn);
+ PARA_NOTICE_LOG("%s\n", para_strerror(-ret));
+ return ret;