fixed several crashes

This commit is contained in:
Stefan Ostermann 2024-02-06 23:37:20 +01:00
parent ef30b832ae
commit efd570fb50
2 changed files with 42 additions and 13 deletions

View File

@ -167,6 +167,19 @@ void DirectoryNode::advanceToFirstMP3InThisNode()
DirectoryNode *DirectoryNode::advanceToMP3(const uint16_t id) DirectoryNode *DirectoryNode::advanceToMP3(const uint16_t id)
{ {
for (size_t i = 0; i < ids.size(); i++)
{
if (id == ids[i])
{
// Found the current MP3 file
currentPlaying = &mp3Files[i];
currentPlayingId = id;
return this;
}
}
for (auto subdir : subdirectories) for (auto subdir : subdirectories)
{ {
if (subdir->getId() == id) if (subdir->getId() == id)
@ -181,15 +194,12 @@ DirectoryNode *DirectoryNode::advanceToMP3(const uint16_t id)
if (id == subdir->ids[i]) if (id == subdir->ids[i])
{ {
// Found the current MP3 file // Found the current MP3 file
if (i < subdir->mp3Files.size() - 1)
{
subdir->currentPlaying = &subdir->mp3Files[i]; subdir->currentPlaying = &subdir->mp3Files[i];
subdir->currentPlayingId = id; subdir->currentPlayingId = id;
return subdir; return subdir;
} }
} }
} }
}
// If we get here, there were no MP3 files or subdirectories left to check // If we get here, there were no MP3 files or subdirectories left to check
currentPlaying = nullptr; currentPlaying = nullptr;

View File

@ -64,7 +64,7 @@ DNSServer dns;
uint16_t DirectoryNode::idCounter = 0; uint16_t DirectoryNode::idCounter = 0;
DirectoryNode rootNode("/"); DirectoryNode rootNode("/");
DirectoryNode *currentNode = NULL; DirectoryNode *currentNode = nullptr;
@ -124,6 +124,11 @@ uint32_t getBatteryVoltageMv() {
void playSongById(uint16_t id, uint32_t continueSeconds = 0) void playSongById(uint16_t id, uint32_t continueSeconds = 0)
{ {
currentNode = rootNode.advanceToMP3(id); currentNode = rootNode.advanceToMP3(id);
if (currentNode==nullptr) {
return;
}
String mp3File = currentNode->getCurrentPlayingFilePath(); String mp3File = currentNode->getCurrentPlayingFilePath();
Serial.print("playing by id: "); Serial.print("playing by id: ");
Serial.print(id);Serial.print(" ");Serial.println(continueSeconds); Serial.print(id);Serial.print(" ");Serial.println(continueSeconds);
@ -131,6 +136,13 @@ void playSongById(uint16_t id, uint32_t continueSeconds = 0)
Serial.println(mp3File.c_str()); Serial.println(mp3File.c_str());
deactivateRFID(); deactivateRFID();
activateSD(); activateSD();
if (currentNode != nullptr && currentNode->getCurrentPlaying()==nullptr) {
currentNode = nullptr;
Serial.println("no node by id found, exiting playSongById");
return;
}
playFile(mp3File.c_str()); playFile(mp3File.c_str());
if (continueSeconds!=0) { if (continueSeconds!=0) {
audio.setAudioPlayPosition(continueSeconds); audio.setAudioPlayPosition(continueSeconds);
@ -178,6 +190,10 @@ void playSongByRFID(String id)
*/ */
bool playFile(const char *filename, uint32_t resumeFilePos) bool playFile(const char *filename, uint32_t resumeFilePos)
{ {
if (filename == nullptr || strlen(filename)==0) {
Serial.println("filename is empty.");
return false;
}
return audio.connecttoSD(filename, resumeFilePos); return audio.connecttoSD(filename, resumeFilePos);
} }
@ -270,7 +286,8 @@ String getState()
{ {
DynamicJsonDocument jsonState(1024); DynamicJsonDocument jsonState(1024);
jsonState["playing"] = audio.isRunning(); jsonState["playing"] = audio.isRunning();
if (currentNode != NULL)
if (currentNode != nullptr)
jsonState["title"] = *currentNode->getCurrentPlaying(); jsonState["title"] = *currentNode->getCurrentPlaying();
else else
jsonState["title"] = "Angehalten"; jsonState["title"] = "Angehalten";
@ -367,12 +384,12 @@ void next()
void previous() void previous()
{ {
if (currentNode != nullptr) { if (currentNode != NULL) {
const String* curr = currentNode->getCurrentPlaying(); const String* curr = currentNode->getCurrentPlaying();
DirectoryNode* newNode = currentNode->goToPreviousMP3(); DirectoryNode* newNode = currentNode->goToPreviousMP3();
if (newNode != nullptr) { if (newNode != NULL) {
if (curr == newNode->getCurrentPlaying()) { if (curr == newNode->getCurrentPlaying()) {
// reset to 0 seconds playtime: // reset to 0 seconds playtime:
audio.setAudioPlayPosition(0); audio.setAudioPlayPosition(0);
@ -510,6 +527,8 @@ void setup()
Serial.println("Deactivating Brownout detector..."); Serial.println("Deactivating Brownout detector...");
WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0); //disable brownout detector WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0); //disable brownout detector
//wifiManager.resetSettings();
if (wifiManager.autoConnect("HannaBox")) if (wifiManager.autoConnect("HannaBox"))
{ {
server.on("/", HTTP_GET, [](AsyncWebServerRequest *request) server.on("/", HTTP_GET, [](AsyncWebServerRequest *request)
@ -645,7 +664,7 @@ void loop()
deactivateRFID(); deactivateRFID();
activateSD(); activateSD();
audio.loop(); audio.loop();
if (currentNode != NULL && !prepareSleepMode) if (currentNode != nullptr && !prepareSleepMode)
{ {
currentNode->setSecondsPlayed(audio.getAudioCurrentTime()); currentNode->setSecondsPlayed(audio.getAudioCurrentTime());
} }