X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=audiod.c;h=72276ffe072f1a24fa67ac866e18c4d9a33889cd;hp=e1d9cbb28606d782a57b15c9794f1b5de950c8bc;hb=d96c06ff93493c125b9f4d36655e77d7029ca309;hpb=f42b5eccb6ec3364dc0500ffeffbe9d9ecab07bd diff --git a/audiod.c b/audiod.c index e1d9cbb2..72276ffe 100644 --- a/audiod.c +++ b/audiod.c @@ -491,8 +491,8 @@ static void open_filters(struct slot_info *s) register_task(&fn->task); parent = fn->btrn; PARA_NOTICE_LOG("%s filter %d/%d (%s) started in slot %d\n", - audio_formats[s->format], i, nf, f->name, s - slot); - sprintf(fn->task.status, "%s (slot %d)", f->name, s - slot); + audio_formats[s->format], i, nf, f->name, (int)(s - slot)); + sprintf(fn->task.status, "%s (slot %d)", f->name, (int)(s - slot)); } } @@ -603,23 +603,22 @@ struct btr_node *audiod_get_btr_root(void) return slot[newest_slot].receiver_node->btrn; } -/* returns slot num on success. */ -static int open_current_receiver(void) +/* whether a new instance of a decoder should be started. */ +static bool must_start_decoder(void) { int ret, cafn = stat_task->current_audio_format_num; if (cafn < 0 || !stat_task->ct) - return -1; + return false; /* Do nothing if the 'N' flag is set or the 'P' flag is unset */ if (stat_task->vss_status != VSS_STATUS_FLAG_PLAYING) - return -1; + return false; ret = receiver_running(cafn); if (ret != 0) /* already running */ - return -1; + return false; if (tv_diff(now, &afi[cafn].restart_barrier, NULL) < 0) - return -1; - /* start a new receiver */ - return open_receiver(cafn); + return false; + return true; } static unsigned compute_time_diff(const struct timeval *status_time) @@ -654,9 +653,9 @@ static unsigned compute_time_diff(const struct timeval *status_time) &tmp); stat_task->sa_time_diff = tmp; PARA_INFO_LOG("time diff (cur/avg): %s%lums/%s%lums\n", - sign > 0? "+" : "-", + sign < 0? "-" : "+", tv2ms(&diff), - sa_time_diff_sign ? "+" : "-", + sa_time_diff_sign < 0? "-" : "+", tv2ms(&stat_task->sa_time_diff) ); out: @@ -1098,7 +1097,9 @@ static void start_stop_decoders(void) if (audiod_status != AUDIOD_ON || !(stat_task->vss_status & VSS_STATUS_FLAG_PLAYING)) return kill_all_decoders(-E_NOT_PLAYING); - ret = open_current_receiver(); + if (!must_start_decoder()) + return; + ret = open_receiver(stat_task->current_audio_format_num); if (ret < 0) return; sl = slot + ret; @@ -1113,10 +1114,20 @@ static void start_stop_decoders(void) static void status_pre_select(struct sched *s, struct task *t) { struct status_task *st = container_of(t, struct status_task, task); - int ret; + int ret, cafn = stat_task->current_audio_format_num; + if (must_start_decoder()) + goto min_delay; ret = btr_node_status(st->btrn, 0, BTR_NT_LEAF); - sched_request_barrier(&st->restart_barrier, s); + if (ret > 0) + goto min_delay; + if (!st->ct) + sched_request_barrier_or_min_delay(&st->restart_barrier, s); + if (cafn >= 0) + sched_request_barrier(&afi[cafn].restart_barrier, s); + return; +min_delay: + sched_min_delay(s); } /* restart the client task if necessary */