X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=audiod.c;h=136557adca486f65bdb38c592254461284148459;hp=41fcdd8f1bc5e49ec49ff3d44369cdeb81ab4f19;hb=e8089cd5efad59a5eec689117acf563a38b8c6c7;hpb=25c1156924009d991d7a4d3f780f51e77aa9cd6f diff --git a/audiod.c b/audiod.c index 41fcdd8f..136557ad 100644 --- a/audiod.c +++ b/audiod.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2009 Andre Noll + * Copyright (C) 2005-2010 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ @@ -347,7 +347,6 @@ static void close_receiver(int slot_num) { struct slot_info *s = &slot[slot_num]; struct audio_format_info *a; - struct timeval restart_delay = {0, 200 * 1000}; if (s->format < 0 || !s->receiver_node) return; @@ -358,7 +357,6 @@ static void close_receiver(int slot_num) btr_free_node(s->receiver_node->btrn); free(s->receiver_node); s->receiver_node = NULL; - tv_add(now, &restart_delay, &afi[s->format].restart_barrier); } static void writer_cleanup(struct writer_node *wn) @@ -577,22 +575,23 @@ static int open_receiver(int format) return slot_num; } -/* return: 0: Not running, 1: Running, -1: Running but eof (or error) */ -static int receiver_running(int format) +static bool receiver_running(void) { - int i, ret = 0; + int i; + long unsigned ss1 = stat_task->server_stream_start.tv_sec; FOR_EACH_SLOT(i) { struct slot_info *s = &slot[i]; - if (s->format != format) - continue; + long unsigned ss2 = s->server_stream_start.tv_sec; + if (!s->receiver_node) continue; if (s->receiver_node->task.error >= 0) - return 1; - ret = -1; + return true; + if (ss1 == ss2) + return true; } - return ret; + return false; } /** @@ -630,15 +629,18 @@ struct btr_node *audiod_get_btr_root(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; + int cafn = stat_task->current_audio_format_num; + unsigned vs = stat_task->vss_status; - if (cafn < 0 || !stat_task->ct) + if (cafn < 0) + return false; + if (!stat_task->ct) + return false; + if (vs & VSS_STATUS_FLAG_NEXT) 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) + if (!(vs & VSS_STATUS_FLAG_PLAYING)) return false; - ret = receiver_running(cafn); - if (ret != 0) /* already running */ + if (receiver_running()) return false; if (tv_diff(now, &afi[cafn].restart_barrier, NULL) < 0) return false;