From dd83d1e96f5bbb6b22471e47d1a8f1dd62e0df75 Mon Sep 17 00:00:00 2001 From: Andre Noll Date: Wed, 9 Mar 2022 23:56:56 +0100 Subject: [PATCH] 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. --- audiod.c | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) 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; -- 2.39.5