From dca7d3ed6726eecc8f7e2c57eac76c7f2a86426e Mon Sep 17 00:00:00 2001 From: Torsten Stauder Date: Tue, 20 Jul 2021 23:16:55 +0200 Subject: [PATCH] Improving m3u-feature --- src/SdCard.cpp | 52 +++++++++++++++++++++++++++++++++++--------------- src/revision.h | 2 +- 2 files changed, 38 insertions(+), 16 deletions(-) diff --git a/src/SdCard.cpp b/src/SdCard.cpp index 7bda195..6c19c16 100644 --- a/src/SdCard.cpp +++ b/src/SdCard.cpp @@ -142,26 +142,59 @@ char **SdCard_ReturnPlaylist(const char *fileName, const uint32_t _playMode) { } #endif + snprintf(Log_Buffer, Log_BufferLength, "%s: %u", (char *) FPSTR(freeMemory), ESP.getFreeHeap()); + Log_Println(Log_Buffer, LOGLEVEL_DEBUG); + + if (files != NULL) { // If **ptr already exists, de-allocate its memory + Log_Println((char *) FPSTR(releaseMemoryOfOldPlaylist), LOGLEVEL_DEBUG); + --files; + freeMultiCharArray(files, strtoul(*files, NULL, 10)); + snprintf(Log_Buffer, Log_BufferLength, "%s: %u", (char *) FPSTR(freeMemoryAfterFree), ESP.getFreeHeap()); + Log_Println(Log_Buffer, LOGLEVEL_DEBUG); + } + // Parse m3u-playlist and create linear-playlist out of it if (_playMode == WEBSTREAMS_LOCAL_M3U) { - enablePlaylistFromM3u = true; - if (fileOrDirectory && !fileOrDirectory.isDirectory()) { - serializedPlaylist = (char *) x_calloc(2048, sizeof(char)); + if (fileOrDirectory && !fileOrDirectory.isDirectory() && fileOrDirectory.size() >= 0) { + enablePlaylistFromM3u = true; + uint16_t allocCount = 1; + uint16_t allocSize = 1024; + if (psramInit()) { + allocSize = 65535; // There's enough PSRAM. So we don't have to care... + } + + serializedPlaylist = (char *) x_calloc(allocSize, sizeof(char)); if (serializedPlaylist == NULL) { Log_Println((char *) FPSTR(unableToAllocateMemForLinearPlaylist), LOGLEVEL_ERROR); System_IndicateError(); return files; } char buf; + char lastBuf = '0'; uint32_t fPos = 1; serializedPlaylist[0] = '#'; while (fileOrDirectory.available() > 0) { buf = fileOrDirectory.read(); + if (fPos+1 >= allocCount * allocSize) { + serializedPlaylist = (char *) realloc(serializedPlaylist, ++allocCount * allocSize); + Log_Println((char *) FPSTR(reallocCalled), LOGLEVEL_DEBUG); + if (serializedPlaylist == NULL) { + Log_Println((char *) FPSTR(unableToAllocateMemForLinearPlaylist), LOGLEVEL_ERROR); + System_IndicateError(); + free(serializedPlaylist); + return files; + } + } + if (buf != '\n' && buf != '\r') { serializedPlaylist[fPos++] = buf; + lastBuf = buf; } else { - serializedPlaylist[fPos++] = '#'; + if (lastBuf != '#') { // Strip empty lines from m3u + serializedPlaylist[fPos++] = '#'; + lastBuf = '#'; + } } } if (serializedPlaylist[fPos-1] == '#') { // Remove trailing delimiter if set @@ -172,17 +205,6 @@ char **SdCard_ReturnPlaylist(const char *fileName, const uint32_t _playMode) { } } - snprintf(Log_Buffer, Log_BufferLength, "%s: %u", (char *) FPSTR(freeMemory), ESP.getFreeHeap()); - Log_Println(Log_Buffer, LOGLEVEL_DEBUG); - - if (files != NULL) { // If **ptr already exists, de-allocate its memory - Log_Println((char *) FPSTR(releaseMemoryOfOldPlaylist), LOGLEVEL_DEBUG); - --files; - freeMultiCharArray(files, strtoul(*files, NULL, 10)); - snprintf(Log_Buffer, Log_BufferLength, "%s: %u", (char *) FPSTR(freeMemoryAfterFree), ESP.getFreeHeap()); - Log_Println(Log_Buffer, LOGLEVEL_DEBUG); - } - // Don't read from cachefile or m3u-file. Means: read filenames from SD and make playlist of it if (!readFromCacheFile && !enablePlaylistFromM3u) { Log_Println((char *) FPSTR(playlistGenModeUncached), LOGLEVEL_NOTICE); diff --git a/src/revision.h b/src/revision.h index 8996247..f6e3d55 100644 --- a/src/revision.h +++ b/src/revision.h @@ -1,4 +1,4 @@ #ifndef __REVISION_H__ #define __REVISION_H__ - constexpr const char softwareRevision[] PROGMEM = "Software-revision: 20210720-1"; + constexpr const char softwareRevision[] PROGMEM = "Software-revision: 20210720-2"; #endif \ No newline at end of file