]> git.tuebingen.mpg.de Git - paraslash.git/blobdiff - audiod.c
audiod: Print a warning if filters are ignored.
[paraslash.git] / audiod.c
index 41be3c4f757c64e200c1e6772f82bac6cbe56d9b..5ed7067325ab526132fd80a18f06b4633a993e79 100644 (file)
--- a/audiod.c
+++ b/audiod.c
@@ -343,10 +343,11 @@ static void parse_config_or_die(void)
                PARA_EMERG_LOG("can not read config file %s\n", config_file);
                goto err;
        }
-       if (ret)
+       if (ret) {
                audiod_cmdline_parser_config_file(config_file, &conf, &params);
+               daemon_set_loglevel(conf.loglevel_arg);
+       }
        free(config_file);
-       daemon_set_loglevel(conf.loglevel_arg);
        return;
 err:
        free(config_file);
@@ -427,7 +428,7 @@ static void close_filters(struct slot_info *s)
        struct audio_format_info *a = afi + s->format;
        if (a->num_filters == 0)
                return;
-       for (i = 0; i < a->num_filters; i++) {
+       for (i = a->num_filters - 1; i >= 0; i--) {
                struct filter_node *fn = s->fns + i;
                struct filter *f;
 
@@ -495,13 +496,7 @@ static void open_filters(struct slot_info *s)
                fn->filter_num = a->filter_nums[i];
                fn->conf = a->filter_conf[i];
                fn->task.pre_select = f->pre_select;
-               if (f->new_post_select) {
-                       fn->task.new_post_select = f->new_post_select;
-                       fn->task.post_select = NULL;
-               } else {
-                       fn->task.new_post_select = NULL;
-                       fn->task.post_select = f->post_select;
-               }
+               fn->task.post_select = f->post_select;
                fn->btrn = btr_new_node(&(struct btr_node_description)
                        EMBRACE(.name = f->name, .parent = parent,
                                .handler = f->execute, .context = fn));
@@ -565,13 +560,7 @@ static int open_receiver(int format)
        PARA_NOTICE_LOG("started %s: %s receiver in slot %d\n",
                audio_formats[format], r->name, slot_num);
        rn->task.pre_select = r->pre_select;
-       if (r->new_post_select) {
-               rn->task.new_post_select = r->new_post_select;
-               rn->task.post_select = NULL;
-       } else {
-               rn->task.new_post_select = NULL;
-               rn->task.post_select = r->post_select;
-       }
+       rn->task.post_select = r->post_select;
        sprintf(rn->task.status, "%s receiver node", r->name);
        register_task(&sched, &rn->task);
        return slot_num;
@@ -925,7 +914,7 @@ out:
 
 static int parse_filter_args(void)
 {
-       int i, j, ret, af_mask;
+       int i, j, ret, af_mask, num_matches;
 
        for (i = 0; i < conf.filter_given; i++) {
                char *arg;
@@ -933,13 +922,18 @@ static int parse_filter_args(void)
                if (ret < 0)
                        goto out;
                af_mask = ret;
+               num_matches = 0;
                FOR_EACH_AUDIO_FORMAT(j) {
                        if ((af_mask & (1 << j)) == 0) /* no match */
                                continue;
                        ret = add_filter(j, arg);
                        if (ret < 0)
                                goto out;
+                       num_matches++;
                }
+               if (num_matches == 0)
+                       PARA_WARNING_LOG("ignoring filter spec: %s\n",
+                               conf.filter_arg[i]);
        }
        ret = init_default_filters(); /* use default values for the rest */
 out:
@@ -1021,8 +1015,7 @@ static int signal_post_select(struct sched *s, __a_unused struct task *t)
 static void signal_setup_default(struct signal_task *st)
 {
        st->task.pre_select = signal_pre_select;
-       st->task.new_post_select = signal_post_select;
-       st->task.post_select = NULL;
+       st->task.post_select = signal_post_select;
        sprintf(st->task.status, "signal task");
 }
 
@@ -1032,7 +1025,7 @@ static void command_pre_select(struct sched *s, struct task *t)
        para_fd_set(ct->fd, &s->rfds, &s->max_fileno);
 }
 
-static void command_post_select(struct sched *s, struct task *t)
+static int command_post_select(struct sched *s, struct task *t)
 {
        int ret;
        struct command_task *ct = container_of(t, struct command_task, task);
@@ -1049,13 +1042,13 @@ static void command_post_select(struct sched *s, struct task *t)
        if (ret < 0)
                PARA_ERROR_LOG("%s\n", para_strerror(-ret));
        audiod_status_dump();
+       return 0;
 }
 
 static void init_command_task(struct command_task *ct)
 {
        ct->task.pre_select = command_pre_select;
        ct->task.post_select = command_post_select;
-       ct->task.new_post_select = NULL;
        ct->task.error = 0;
        ct->fd = audiod_get_socket(); /* doesn't return on errors */
        sprintf(ct->task.status, "command task");
@@ -1205,7 +1198,7 @@ min_delay:
 }
 
 /* restart the client task if necessary */
-static void status_post_select(struct sched *s, struct task *t)
+static int status_post_select(struct sched *s, struct task *t)
 {
        struct status_task *st = container_of(t, struct status_task, task);
 
@@ -1228,21 +1221,21 @@ static void status_post_select(struct sched *s, struct task *t)
                        close_stat_pipe();
                        goto out;
                }
-               if (st->ct->status != CL_RECEIVING)
+               if (st->ct->status != CL_EXECUTING)
                        goto out;
                ret = btr_node_status(st->btrn, st->min_iqs, BTR_NT_LEAF);
                if (ret <= 0) {
                        struct timeval diff;
                        tv_diff(now, &st->last_status_read, &diff);
                        if (diff.tv_sec > 61)
-                               task_notify(&st->ct->task, E_AUDIOD_OFF);
+                               task_notify(&st->ct->task, E_STATUS_TIMEOUT);
                        goto out;
                }
                btr_merge(st->btrn, st->min_iqs);
                sz = btr_next_buffer(st->btrn, &buf);
                ret = for_each_stat_item(buf, sz, update_item);
                if (ret < 0) {
-                       task_notify(&st->ct->task, E_AUDIOD_OFF);
+                       task_notify(&st->ct->task, -ret);
                        goto out;
                }
                if (sz != ret) {
@@ -1278,6 +1271,7 @@ static void status_post_select(struct sched *s, struct task *t)
        st->last_status_read = *now;
 out:
        start_stop_decoders();
+       return 0;
 }
 
 static void init_status_task(struct status_task *st)
@@ -1312,18 +1306,17 @@ static void set_initial_status(void)
 
 __noreturn static void print_help_and_die(void)
 {
-       int d = conf.detailed_help_given;
-       const char **p = d? audiod_args_info_detailed_help
-               : audiod_args_info_help;
-
-       printf_or_die("%s\n\n", AUDIOD_CMDLINE_PARSER_PACKAGE "-"
-               AUDIOD_CMDLINE_PARSER_VERSION);
-       printf_or_die("%s\n\n", audiod_args_info_usage);
-       for (; *p; p++)
-               printf_or_die("%s\n", *p);
-       print_receiver_helps(d);
-       print_filter_helps(d);
-       print_writer_helps(d);
+       struct ggo_help h = DEFINE_GGO_HELP(audiod);
+       bool d = conf.detailed_help_given;
+       unsigned flags;
+
+       flags = d? GPH_STANDARD_FLAGS_DETAILED : GPH_STANDARD_FLAGS;
+       ggo_print_help(&h, flags);
+
+       flags = d? GPH_MODULE_FLAGS_DETAILED : GPH_MODULE_FLAGS;
+       print_receiver_helps(flags);
+       print_filter_helps(flags);
+       print_writer_helps(flags);
        exit(0);
 }
 
@@ -1362,9 +1355,9 @@ int main(int argc, char *argv[])
        };
 
        valid_fd_012();
-       if (audiod_cmdline_parser_ext(argc, argv, &conf, &params))
-               exit(EXIT_FAILURE);
-       HANDLE_VERSION_FLAG("audiod", conf);
+       audiod_cmdline_parser_ext(argc, argv, &conf, &params);
+       daemon_set_loglevel(conf.loglevel_arg);
+       version_handle_flag("audiod", conf.version_given);
        /* init receivers/filters/writers early to make help work */
        recv_init();
        filter_init();