X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=osx_write.c;h=0517892e8d991d877bd8a0a18c46caf72bf38fb9;hp=73aa137732a61c57cab41a2f9f1532008ae652c9;hb=870fcd0379ab096184f42481541d668694da7c83;hpb=97902a38295b1f154e9aade2f54427fdb66b3d93 diff --git a/osx_write.c b/osx_write.c index 73aa1377..0517892e 100644 --- a/osx_write.c +++ b/osx_write.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2006-2012 Andre Noll + * Copyright (C) 2006 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ @@ -13,17 +13,16 @@ #include #include +#include +#include "write_cmd.lsg.h" #include "para.h" #include "fd.h" #include "string.h" #include "list.h" #include "sched.h" -#include "ggo.h" #include "buffer_tree.h" #include "write.h" -#include "write_common.h" -#include "osx_write.cmdline.h" #include "ipc.h" #include "error.h" @@ -78,10 +77,14 @@ static OSStatus osx_callback(void *cb_arg, __a_unused AudioUnitRenderActionFlags { int i; struct writer_node *wn = cb_arg; - struct private_osx_write_data *powd = wn->private_data; + struct private_osx_write_data *powd; size_t samples_have, samples_want = 0; + powd = wn->private_data; mutex_lock(powd->mutex); + powd = wn->private_data; + if (!powd || !wn->btrn) + goto out; /* * We fill with zeros if no data was yet written and we do not have * enough to fill all buffers. @@ -236,20 +239,6 @@ e0: return ret; } -__malloc static void *osx_write_parse_config_or_die(int argc, char **argv) -{ - struct osx_write_args_info *conf = para_calloc(sizeof(*conf)); - - /* exits on errors */ - osx_write_cmdline_parser(argc, argv, conf); - return conf; -} - -static void osx_free_config(void *conf) -{ - osx_write_cmdline_parser_free(conf); -} - static void osx_write_close(struct writer_node *wn) { struct private_osx_write_data *powd = wn->private_data; @@ -270,9 +259,9 @@ static inline bool need_drain_delay(struct private_osx_write_data *powd) return btr_get_input_queue_size(powd->callback_btrn) != 0; } -static void osx_write_pre_select(struct sched *s, struct task *t) +static void osx_write_pre_select(struct sched *s, void *context) { - struct writer_node *wn = container_of(t, struct writer_node, task); + struct writer_node *wn = context; struct private_osx_write_data *powd = wn->private_data; int ret; bool drain_delay_nec = false; @@ -297,24 +286,33 @@ static void osx_write_pre_select(struct sched *s, struct task *t) sched_request_timeout_ms(50, s); } -static void osx_write_post_select(__a_unused struct sched *s, struct task *t) +static int osx_write_post_select(__a_unused struct sched *s, void *context) { - struct writer_node *wn = container_of(t, struct writer_node, task); + struct writer_node *wn = context; struct private_osx_write_data *powd = wn->private_data; struct btr_node *btrn = wn->btrn; int ret; + 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; + return 0; 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; - AudioOutputUnitStart(powd->audio_unit); + 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); @@ -323,38 +321,23 @@ static void osx_write_post_select(__a_unused struct sched *s, struct task *t) 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); -remove_btrn: + 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)); -out: - t->error = ret; + return ret; } -/** - * The init function of the osx writer. - * - * \param w Filled in by the function. - */ -void osx_write_init(struct writer *w) -{ - struct osx_write_args_info dummy; - - osx_write_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->help = (struct ggo_help) { - .short_help = osx_write_args_info_help, - .detailed_help = osx_write_args_info_detailed_help - }; - osx_write_cmdline_parser_free(&dummy); -} +struct writer lsg_write_cmd_com_osx_user_data = { + .close = osx_write_close, + .pre_select = osx_write_pre_select, + .post_select = osx_write_post_select, +};