From 3830748de5d44b5f895c3ebadd576a915737fba8 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Tue, 13 Nov 2018 20:23:22 +0100 Subject: output/alsa: clear the `period_buffer` in LockCaughtError() The method Cancel() assumes that the `period_buffer` must be empty when `active==false`, but that is not the case when Play() fails. Of course the assertion in Cancel() is not 100% correct, but I decided to rather fix this in LockCaughtError() because the `period_buffer` should only be accessed from within the RTIO thread, and this is the only code path where `active` can be set to `false` with a non-empty `period_buffer`. Fixes #423 --- src/output/plugins/AlsaOutputPlugin.cxx | 2 ++ 1 file changed, 2 insertions(+) (limited to 'src/output') diff --git a/src/output/plugins/AlsaOutputPlugin.cxx b/src/output/plugins/AlsaOutputPlugin.cxx index 8b505db7d..c72cf4ea2 100644 --- a/src/output/plugins/AlsaOutputPlugin.cxx +++ b/src/output/plugins/AlsaOutputPlugin.cxx @@ -306,6 +306,8 @@ private: } void LockCaughtError() noexcept { + period_buffer.Clear(); + const std::lock_guard lock(mutex); error = std::current_exception(); active = false; -- cgit v1.2.3