Skip to content

Commit 28eceab

Browse files
committed
No need to produce more frames then consumed
1 parent 6b17669 commit 28eceab

File tree

2 files changed

+22
-16
lines changed

2 files changed

+22
-16
lines changed

src/MoonLight/Modules/ModuleLightsControl.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -372,7 +372,7 @@ class ModuleLightsControl : public Module {
372372
extern SemaphoreHandle_t swapMutex;
373373

374374
xSemaphoreTake(swapMutex, portMAX_DELAY);
375-
_socket->emitEvent("monitor", (char*)layerP.lights.channelsD, MIN(layerP.lights.header.nrOfChannels, layerP.lights.maxChannels));
375+
_socket->emitEvent("monitor", (char*)layerP.lights.channelsE, MIN(layerP.lights.header.nrOfChannels, layerP.lights.maxChannels));
376376
xSemaphoreGive(swapMutex);
377377
}
378378
});

src/main.cpp

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -128,22 +128,28 @@ void effectTask(void* pvParameters) {
128128

129129
while (true) {
130130
if (layerP.lights.useDoubleBuffer) {
131-
// effectTask always writes to channelsBack, reads previous channelsBack
132-
layerP.loop(); // getRGB and setRGB both use channelsBack
133-
134-
if (millis() - last20ms >= 20) {
135-
last20ms = millis();
136-
layerP.loop20ms();
137-
}
138-
139-
// Atomic swap channels
140131
xSemaphoreTake(swapMutex, portMAX_DELAY);
141-
uint8_t* temp = layerP.lights.channelsD;
142-
layerP.lights.channelsD = layerP.lights.channelsE;
143-
layerP.lights.channelsE = temp;
144-
newFrameReady = true;
132+
bool canProduce = !newFrameReady;
145133
xSemaphoreGive(swapMutex);
146134

135+
if (canProduce) {
136+
// effectTask always writes to channelsBack, reads previous channelsBack
137+
layerP.loop(); // getRGB and setRGB both use channelsBack
138+
139+
if (millis() - last20ms >= 20) {
140+
last20ms = millis();
141+
layerP.loop20ms();
142+
}
143+
144+
// Atomic swap channels
145+
xSemaphoreTake(swapMutex, portMAX_DELAY);
146+
uint8_t* temp = layerP.lights.channelsD;
147+
layerP.lights.channelsD = layerP.lights.channelsE;
148+
layerP.lights.channelsE = temp;
149+
newFrameReady = true;
150+
xSemaphoreGive(swapMutex);
151+
}
152+
147153
} else {
148154
// Single buffer mode
149155
xSemaphoreTake(swapMutex, portMAX_DELAY);
@@ -167,9 +173,9 @@ void driverTask(void* pvParameters) {
167173
// layerP.setup() done in effectTask
168174

169175
while (true) {
170-
xSemaphoreTake(swapMutex, portMAX_DELAY);
171176
esp32sveltekit.lps++;
172-
177+
178+
xSemaphoreTake(swapMutex, portMAX_DELAY);
173179
if (layerP.lights.useDoubleBuffer) {
174180
if (newFrameReady) {
175181
newFrameReady = false;

0 commit comments

Comments
 (0)