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(); } -