From: Andre Noll Date: Wed, 9 Mar 2022 22:56:56 +0000 (+0100) Subject: audiod: Stop stream immediately when being switched off. X-Git-Tag: v0.7.1~24 X-Git-Url: http://git.tuebingen.mpg.de/?a=commitdiff_plain;h=dd83d1e96f5bbb6b22471e47d1a8f1dd62e0df75;p=paraslash.git audiod: Stop stream immediately when being switched off. When para_audiod enters off/standby mode, we stop the receiver but continue to filter and write data already received until the input queue has drained. This can take several seconds, which may be annoying. To stop the stream immediately, stop the writer(s) rather than the receiver. We still only stop the receiver when the server has paused or stopped the stream because we don't want to discard any data in this case. --- diff --git a/audiod.c b/audiod.c index 7293285e..838f375f 100644 --- a/audiod.c +++ b/audiod.c @@ -480,6 +480,23 @@ static void close_writers(struct slot_info *s) s->wns = NULL; } +static void notify_writers(int error) +{ + int i; + + FOR_EACH_SLOT(i) { + struct slot_info *s = slot + i; + struct audio_format_info *a; + int j; + + if (s->format < 0) + continue; + a = afi + s->format; + for (j = 0; j < a->num_writers; j++) + task_notify(s->wns[j].task, error); + } +} + static void close_filters(struct slot_info *s) { int i; @@ -1218,8 +1235,9 @@ static void start_stop_decoders(void) struct slot_info *sl; close_unused_slots(); - if (audiod_status != AUDIOD_ON || - !(stat_task->vss_status & VSS_STATUS_FLAG_PLAYING)) + if (audiod_status != AUDIOD_ON) + return notify_writers(E_NOT_PLAYING); + if (!(stat_task->vss_status & VSS_STATUS_FLAG_PLAYING)) return notify_receivers(E_NOT_PLAYING); if (!must_start_decoder()) return;