X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=audiod.c;h=7afff93e263630da1a3692b7ca4b9f28c50fa973;hp=9d32e889ea37364addb3258bd15458615e776a78;hb=1889013e900f08d5ee842a50dc13c66689ebf15b;hpb=cae825eae1642d039ea91a839e1343e0f11ddcaa diff --git a/audiod.c b/audiod.c index 9d32e889..7afff93e 100644 --- a/audiod.c +++ b/audiod.c @@ -7,6 +7,7 @@ /** \file audiod.c the paraslash's audio daemon */ #include #include +#include #include "para.h" #include "error.h" @@ -274,7 +275,7 @@ static void open_filters(int slot_num) return; PARA_INFO_LOG("opening %s filters\n", audio_formats[s->format]); s->fc = para_calloc(sizeof(struct filter_chain)); - s->fc->filter_nodes = para_malloc(nf * sizeof(struct filter_chain)); + s->fc->filter_nodes = para_malloc(nf * sizeof(struct filter_node)); s->fc->inbuf = s->receiver_node->buf; s->fc->in_loaded = &s->receiver_node->loaded; s->fc->input_error = &s->receiver_node->task.error; @@ -294,7 +295,7 @@ static void open_filters(int slot_num) INIT_LIST_HEAD(&fn->callbacks); f->open(fn); PARA_NOTICE_LOG("%s filter %d/%d (%s) started in slot %d\n", - audio_formats[s->format], i + 1, nf, f->name, slot_num); + audio_formats[s->format], i, nf, f->name, slot_num); s->fc->outbuf = fn->buf; s->fc->out_loaded = &fn->loaded; } @@ -338,35 +339,13 @@ static void open_writers(int slot_num) activate_inactive_grab_clients(slot_num, s->format, s->fc); } -#if 0 -static void rn_event_handler(struct task *t) -{ - struct receiver_node *rn = t->private_data; - int i; - - PARA_NOTICE_LOG("%s\n", para_strerror(-t->ret)); - unregister_task(t); - rn->error = t->ret; - /* set restart barrier */ - FOR_EACH_SLOT(i) { - struct timeval restart_delay = {0, 10 * 1000}; - if (slot[i].receiver_node != rn) - continue; - if (rn->error != -E_RECV_EOF) - /* don't reconnect immediately on errors */ - restart_delay.tv_sec = 5; - tv_add(now, &restart_delay, &afi[slot[i].format].restart_barrier); - } -} -#endif - static int open_receiver(int format) { struct audio_format_info *a = &afi[format]; struct slot_info *s; int ret, slot_num; struct receiver_node *rn; - const struct timeval restart_delay = {1, 0}; + const struct timeval restart_delay = {2, 0}; ret = get_empty_slot(); if (ret < 0) @@ -390,9 +369,10 @@ static int open_receiver(int format) rn->task.post_select = a->receiver->post_select; sprintf(rn->task.status, "%s receiver node", rn->receiver->name); register_task(&rn->task); - return 1; + ret = 1; err: - PARA_ERROR_LOG("%s\n", para_strerror(-ret)); + if (ret < 0) + PARA_ERROR_LOG("%s\n", para_strerror(-ret)); tv_add(now, &restart_delay, &afi[format].restart_barrier); return ret; } @@ -403,8 +383,7 @@ static int receiver_running(int format) FOR_EACH_SLOT(i) { struct slot_info *s = &slot[i]; - if (s->format == format && s->receiver_node - && s->receiver_node->task.error >= 0) + if (s->format == format && s->receiver_node) return 1; } return 0; @@ -560,7 +539,7 @@ static int add_filter(int format, char *cmdline) return filter_num; a->filter_nums[nf] = filter_num; a->num_filters++; - PARA_INFO_LOG("%s filter %d: %s\n", audio_formats[format], nf + 1, + PARA_INFO_LOG("%s filter %d: %s\n", audio_formats[format], nf, filters[filter_num].name); return filter_num; } @@ -777,13 +756,12 @@ static void signal_pre_select(struct sched *s, struct task *t) static void signal_post_select(struct sched *s, struct task *t) { struct signal_task *st = container_of(t, struct signal_task, task); - int signum; if (!FD_ISSET(st->fd, &s->rfds)) return; - signum = para_next_signal(); - switch (signum) { + st->signum = para_next_signal(); + switch (st->signum) { case SIGINT: case SIGTERM: case SIGHUP: @@ -1051,22 +1029,27 @@ int main(int argc, char *argv[]) { char *config_file; int ret, i; - struct sched s; + static struct sched s; struct command_task command_task_struct, *cmd_task = &command_task_struct; + struct audiod_cmdline_parser_params params = { + .override = 0, + .initialize = 1, + .check_required = 0, + .check_ambiguity = 0, + .print_errors = 1 + }; valid_fd_012(); - audiod_cmdline_parser(argc, argv, &conf); + audiod_cmdline_parser_ext(argc, argv, &conf, ¶ms); HANDLE_VERSION_FLAG("audiod", conf); para_drop_privileges(conf.user_arg, conf.group_arg); config_file = configfile_exists(); if (config_file) { - struct audiod_cmdline_parser_params params = { - .override = 0, - .initialize = 0, - .check_required = 0, - .check_ambiguity = 0 - - }; + params.override = 0; + params.initialize = 0; + params.check_required = 1; + params.check_ambiguity = 0; + params.print_errors = 1; if (audiod_cmdline_parser_config_file(config_file, &conf, ¶ms)) { PARA_EMERG_LOG("parse error in config file\n"); exit(EXIT_FAILURE);