|
@ -142,26 +142,59 @@ char **SdCard_ReturnPlaylist(const char *fileName, const uint32_t _playMode) { |
|
|
} |
|
|
} |
|
|
#endif
|
|
|
#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
|
|
|
// Parse m3u-playlist and create linear-playlist out of it
|
|
|
if (_playMode == WEBSTREAMS_LOCAL_M3U) { |
|
|
if (_playMode == WEBSTREAMS_LOCAL_M3U) { |
|
|
|
|
|
if (fileOrDirectory && !fileOrDirectory.isDirectory() && fileOrDirectory.size() >= 0) { |
|
|
enablePlaylistFromM3u = true; |
|
|
enablePlaylistFromM3u = true; |
|
|
if (fileOrDirectory && !fileOrDirectory.isDirectory()) { |
|
|
|
|
|
serializedPlaylist = (char *) x_calloc(2048, sizeof(char)); |
|
|
|
|
|
|
|
|
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) { |
|
|
if (serializedPlaylist == NULL) { |
|
|
Log_Println((char *) FPSTR(unableToAllocateMemForLinearPlaylist), LOGLEVEL_ERROR); |
|
|
Log_Println((char *) FPSTR(unableToAllocateMemForLinearPlaylist), LOGLEVEL_ERROR); |
|
|
System_IndicateError(); |
|
|
System_IndicateError(); |
|
|
return files; |
|
|
return files; |
|
|
} |
|
|
} |
|
|
char buf; |
|
|
char buf; |
|
|
|
|
|
char lastBuf = '0'; |
|
|
uint32_t fPos = 1; |
|
|
uint32_t fPos = 1; |
|
|
|
|
|
|
|
|
serializedPlaylist[0] = '#'; |
|
|
serializedPlaylist[0] = '#'; |
|
|
while (fileOrDirectory.available() > 0) { |
|
|
while (fileOrDirectory.available() > 0) { |
|
|
buf = fileOrDirectory.read(); |
|
|
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') { |
|
|
if (buf != '\n' && buf != '\r') { |
|
|
serializedPlaylist[fPos++] = buf; |
|
|
serializedPlaylist[fPos++] = buf; |
|
|
|
|
|
lastBuf = buf; |
|
|
} else { |
|
|
} else { |
|
|
|
|
|
if (lastBuf != '#') { // Strip empty lines from m3u
|
|
|
serializedPlaylist[fPos++] = '#'; |
|
|
serializedPlaylist[fPos++] = '#'; |
|
|
|
|
|
lastBuf = '#'; |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
if (serializedPlaylist[fPos-1] == '#') { // Remove trailing delimiter if set
|
|
|
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
|
|
|
// Don't read from cachefile or m3u-file. Means: read filenames from SD and make playlist of it
|
|
|
if (!readFromCacheFile && !enablePlaylistFromM3u) { |
|
|
if (!readFromCacheFile && !enablePlaylistFromM3u) { |
|
|
Log_Println((char *) FPSTR(playlistGenModeUncached), LOGLEVEL_NOTICE); |
|
|
Log_Println((char *) FPSTR(playlistGenModeUncached), LOGLEVEL_NOTICE); |
|
|