diff --git a/src/DirectoryNode.cpp b/src/DirectoryNode.cpp
index 872046a..369b461 100644
--- a/src/DirectoryNode.cpp
+++ b/src/DirectoryNode.cpp
@@ -550,16 +550,20 @@ void DirectoryNode::streamDirectoryHTML(Print &out) const {
out.print(F("\">"));
out.print(name);
out.println(F(""));
+ delay(0); // Yield to allow network stack to send buffered data
}
- delay(0);
-
for (size_t i = 0; i < mp3Files.size(); i++) {
out.print(F("
"));
out.print(mp3Files[i]);
out.println(F(""));
+
+ // Yield every few items to allow the async web server to send buffered data
+ if (i % 5 == 4) {
+ delay(1);
+ }
}
for (DirectoryNode* child : subdirectories) {
@@ -568,6 +572,7 @@ void DirectoryNode::streamDirectoryHTML(Print &out) const {
if (name == "/") {
out.println(F(""));
+ delay(0); // Final yield before completing
}
}
diff --git a/src/main.cpp b/src/main.cpp
index 5f16121..3204ab6 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -618,7 +618,9 @@ void writeSongProgress(const char *filename, uint16_t id, uint32_t seconds)
file.print(" ");
file.println(seconds);
file.close();
+#ifdef DEBUG
Serial.println("Progress written: ID " + String(id) + ", s " + String(seconds));
+#endif
}
else
{
@@ -1225,7 +1227,10 @@ server.on("/", HTTP_GET, [](AsyncWebServerRequest *request)
server.on("/directory", HTTP_GET, [](AsyncWebServerRequest *request)
{
webreq_enter();
- request->onDisconnect([](){ webreq_exit(); });
+ request->onDisconnect([](){ webreq_exit(); sd_lock_release(); });
+ // Acquire SD lock to prevent concurrent modifications to directory tree
+ // and to prevent audio playback from interrupting the stream
+ sd_lock_acquire();
// Stream the response directly from the directory tree to avoid large temporary Strings
AsyncResponseStream* stream = request->beginResponseStream(txt_html_charset);
#ifdef DEBUG
@@ -1420,9 +1425,9 @@ void setup()
wifiManager.setRemoveDuplicateAPs(true); // Remove duplicate APs from memory
// Reduce timeouts to free memory faster
- wifiManager.setTimeout(60); // Reduced from 180
+ wifiManager.setTimeout(180); // Reduced from 180
wifiManager.setConnectTimeout(15); // Faster connection attempts
- wifiManager.setConfigPortalTimeout(60); // Shorter portal timeout
+ wifiManager.setConfigPortalTimeout(90); // Shorter portal timeout
#ifdef DEBUG
Serial.println(F("Deactivating Brownout detector..."));
diff --git a/web/script.js b/web/script.js
index e660089..829867f 100644
--- a/web/script.js
+++ b/web/script.js
@@ -57,6 +57,8 @@ setInterval(updateProgress, 500); // Update progress every second
var timeoutMs;
if ((this.__url || '').indexOf('/upload') !== -1) {
timeoutMs = 600000; // 10 minutes for uploads
+ } else if ((this.__url || '').indexOf('/directory') !== -1) {
+ timeoutMs = 30000; // 30 seconds for directory listing (can be large)
} else if (this.__method === 'GET') {
timeoutMs = 6000;
} else {
@@ -497,4 +499,3 @@ function deleteFileOnServer() {
};
xhr.send();
}
-