X-Git-Url: http://git.tuebingen.mpg.de/?a=blobdiff_plain;ds=inline;f=osx_write.c;h=b057b9c057991864b582ad8519cbac1b9083a90d;hb=83ab4b5d38bb63cf4724022c3804d3eaa2ac51d3;hp=2894f11eb6672dd5f06fa1f3166f6a77afad7ae0;hpb=107d4619b3a6a8bdc1a85c8021cb1951244e7626;p=paraslash.git diff --git a/osx_write.c b/osx_write.c index 2894f11e..b057b9c0 100644 --- a/osx_write.c +++ b/osx_write.c @@ -308,15 +308,18 @@ static void osx_write_post_select(__a_unused struct sched *s, struct task *t) struct btr_node *btrn = wn->btrn; int ret; + ret = task_get_notification(t); + if (ret < 0) + goto fail; if (!powd) { ret = btr_node_status(btrn, wn->min_iqs, BTR_NT_LEAF); if (ret == 0) return; if (ret < 0) - goto remove_btrn; + goto fail; ret = core_audio_init(wn); if (ret < 0) - goto remove_btrn; + goto fail; powd = wn->private_data; ret = -E_UNIT_START; if (AudioOutputUnitStart(powd->audio_unit) != noErr) { @@ -332,16 +335,17 @@ static void osx_write_post_select(__a_unused struct sched *s, struct task *t) btr_pushdown(btrn); if (ret < 0 && need_drain_delay(powd)) ret = 0; - if (ret >= 0) { - mutex_unlock(powd->mutex); + mutex_unlock(powd->mutex); + if (ret >= 0) return; +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); } - AudioOutputUnitStop(powd->audio_unit); - AudioUnitUninitialize(powd->audio_unit); - CloseComponent(powd->audio_unit); - btr_remove_node(&powd->callback_btrn); - mutex_unlock(powd->mutex); -remove_btrn: btr_remove_node(&wn->btrn); PARA_NOTICE_LOG("%s\n", para_strerror(-ret)); t->error = ret;