Skip to content

Commit 271e9ac

Browse files
committed
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
1 parent 8348089 commit 271e9ac

File tree

1 file changed

+9
-1
lines changed

1 file changed

+9
-1
lines changed

wled00/image_loader.cpp

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,14 @@ byte renderImageToSegment(Segment &seg) {
112112
if (!seg.name) return IMAGE_ERROR_NO_NAME;
113113
// disable during effect transition, causes flickering, multiple allocations and depending on image, part of old FX remaining
114114
//if (seg.mode != seg.currentMode()) return IMAGE_ERROR_WAITING;
115-
if (activeSeg && activeSeg != &seg) return IMAGE_ERROR_SEG_LIMIT; // only one segment at a time
115+
if (activeSeg && activeSeg != &seg) { // only one segment at a time
116+
if (!seg.isActive()) return IMAGE_ERROR_SEG_LIMIT; // sanity check: calling segment must be active
117+
if (gifDecodeFailed || !activeSeg->isActive()) // decoder failed, or last segment became inactive
118+
endImagePlayback(activeSeg); // => allow takeover but clean up first
119+
else
120+
return IMAGE_ERROR_SEG_LIMIT;
121+
}
122+
116123
activeSeg = &seg;
117124

118125
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) {
223230
gifDecodeFailed = false;
224231
activeSeg = nullptr;
225232
strcpy(lastFilename, "/"); // reset filename
233+
gifWidth = gifHeight = 0; // reset dimensions
226234
DEBUG_PRINTLN(F("Image playback ended"));
227235
}
228236

0 commit comments

Comments
 (0)