From 271e9ac7b762a8d607a0b8810132fbc628019f14 Mon Sep 17 00:00:00 2001 From: Frank <91616163+softhack007@users.noreply.github.com> Date: Mon, 17 Nov 2025 12:29:47 +0100 Subject: [PATCH] image loader: allow graceful takeover after error Allow decoder "takeover" by another segment a) when last segment has decoding error (unsupported file, etc.) b) when last segment became inactive --- wled00/image_loader.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/wled00/image_loader.cpp b/wled00/image_loader.cpp index d03e4fa4..0f4c3889 100644 --- a/wled00/image_loader.cpp +++ b/wled00/image_loader.cpp @@ -112,7 +112,14 @@ byte renderImageToSegment(Segment &seg) { if (!seg.name) return IMAGE_ERROR_NO_NAME; // disable during effect transition, causes flickering, multiple allocations and depending on image, part of old FX remaining //if (seg.mode != seg.currentMode()) return IMAGE_ERROR_WAITING; - if (activeSeg && activeSeg != &seg) return IMAGE_ERROR_SEG_LIMIT; // only one segment at a time + if (activeSeg && activeSeg != &seg) { // only one segment at a time + if (!seg.isActive()) return IMAGE_ERROR_SEG_LIMIT; // sanity check: calling segment must be active + if (gifDecodeFailed || !activeSeg->isActive()) // decoder failed, or last segment became inactive + endImagePlayback(activeSeg); // => allow takeover but clean up first + else + return IMAGE_ERROR_SEG_LIMIT; + } + activeSeg = &seg; if (strncmp(lastFilename +1, seg.name, WLED_MAX_SEGNAME_LEN) != 0) { // segment name changed, load new image @@ -223,6 +230,7 @@ void endImagePlayback(Segment *seg) { gifDecodeFailed = false; activeSeg = nullptr; strcpy(lastFilename, "/"); // reset filename + gifWidth = gifHeight = 0; // reset dimensions DEBUG_PRINTLN(F("Image playback ended")); }