From 3a8d1a0d79ef8e402c6bf39cb0f2da6ebbcfdb13 Mon Sep 17 00:00:00 2001 From: Andre Noll Date: Sat, 30 Jan 2010 14:20:19 +0100 Subject: [PATCH] audiod: Split open_current_receiver(). We need to check whether the current receiver should be opened from both pre_select() and post_select(). So rename this function to must_start_decoder(), make it return bool and do not start the decoder there. This change makes audiod start the decoder as soon as possible. --- audiod.c | 35 ++++++++++++++++++++++------------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/audiod.c b/audiod.c index a18489d5..72276ffe 100644 --- a/audiod.c +++ b/audiod.c @@ -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) @@ -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,12 +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); - if (ret < 0) - sched_min_delay(s); - 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 */ -- 2.39.2