ids, resume function

This commit is contained in:
2023-10-21 21:54:56 +02:00
parent 578281d9d1
commit 9c4b1d4913
5 changed files with 213 additions and 31 deletions

View File

@@ -1,7 +1,11 @@
#include "DirectoryNode.h"
DirectoryNode::DirectoryNode(const String &nodeName)
: name(nodeName), currentPlaying(nullptr) {}
: name(nodeName), currentPlaying(nullptr) {
id = DirectoryNode::idCounter;
DirectoryNode::idCounter++;
}
DirectoryNode::~DirectoryNode()
{
@@ -11,6 +15,12 @@ DirectoryNode::~DirectoryNode()
}
}
const uint16_t DirectoryNode::getId() const
{
return id;
}
const String &DirectoryNode::getName() const
{
return name;
@@ -29,6 +39,11 @@ const std::vector<String> &DirectoryNode::getMP3Files() const
void DirectoryNode::setCurrentPlaying(const String *mp3File)
{
currentPlaying = mp3File;
for (int i=0;i<mp3Files.size();i++) {
if (mp3Files[i] == *mp3File && ids.size()>i) {
currentPlayingId = ids[i];
}
}
}
const String *DirectoryNode::getCurrentPlaying() const
@@ -36,6 +51,17 @@ const String *DirectoryNode::getCurrentPlaying() const
return currentPlaying;
}
const uint16_t DirectoryNode::getCurrentPlayingId() const
{
return currentPlayingId;
}
uint16_t DirectoryNode::getNextId() {
uint16_t next = DirectoryNode::idCounter;
DirectoryNode::idCounter++;
return next;
}
void DirectoryNode::addSubdirectory(DirectoryNode *subdirectory)
{
subdirectories.push_back(subdirectory);
@@ -44,6 +70,7 @@ void DirectoryNode::addSubdirectory(DirectoryNode *subdirectory)
void DirectoryNode::addMP3File(const String &mp3File)
{
mp3Files.push_back(mp3File);
ids.push_back(getNextId());
}
void DirectoryNode::setSecondsPlayed(const uint32_t seconds) {
@@ -65,7 +92,7 @@ void DirectoryNode::buildDirectoryTree(const char *currentPath)
break;
}
if (entry.isDirectory() && strcmp(entry.name(),sys_dir.c_str()))
if (entry.isDirectory() && entry.name()[0] != '.' && strcmp(entry.name(),sys_dir.c_str()))
{
DirectoryNode *newNode = new DirectoryNode(entry.name());
subdirectories.push_back(newNode);
@@ -74,6 +101,7 @@ void DirectoryNode::buildDirectoryTree(const char *currentPath)
else if (String(entry.name()).endsWith(".mp3"))
{
mp3Files.push_back(entry.name());
ids.push_back(getNextId());
}
entry.close();
}
@@ -127,10 +155,43 @@ DirectoryNode *DirectoryNode::findFirstDirectoryWithMP3s()
void DirectoryNode::advanceToFirstMP3InThisNode() {
if (mp3Files.size()>0) {
currentPlaying = &mp3Files[0];
setCurrentPlaying(&mp3Files[0]);
}
}
DirectoryNode* DirectoryNode::advanceToMP3(const uint16_t id) {
for (auto subdir : subdirectories)
{
if (subdir->getId()==id) {
subdir->advanceToFirstMP3InThisNode();
return subdir;
}
// Have each subdirectory advance its song
for (size_t i = 0; i < subdir->ids.size(); i++)
{
if (id == subdir->ids[i])
{
// Found the current MP3 file
if (i < subdir->mp3Files.size() - 1)
{
subdir->currentPlaying = &subdir->mp3Files[i];
subdir->currentPlayingId = id;
return subdir;
}
}
}
}
// If we get here, there were no MP3 files or subdirectories left to check
currentPlaying = nullptr;
Serial.println("no more nodes found");
return this;
}
DirectoryNode* DirectoryNode::advanceToMP3(const String* currentGlobal) {
for (auto subdir : subdirectories)
{
@@ -147,7 +208,7 @@ DirectoryNode* DirectoryNode::advanceToMP3(const String* currentGlobal) {
// Found the current MP3 file
if (i < subdir->mp3Files.size() - 1)
{
subdir->currentPlaying = &subdir->mp3Files[i];
subdir->setCurrentPlaying(&subdir->mp3Files[i]);
return subdir;
}
@@ -169,13 +230,13 @@ DirectoryNode* DirectoryNode::advanceToNextMP3(const String* currentGlobal)
{
for (size_t i = 0; i < mp3Files.size(); i++)
{
if (*currentGlobal == mp3Files[i])
if (*currentGlobal==mp3Files[i])
{
// Found the current playing MP3 file
if (i < mp3Files.size() - 1)
{
// Advance to the next MP3 file in the same directory
currentPlaying = &mp3Files[i + 1];
setCurrentPlaying(&mp3Files[i + 1]);
return this;
}
useFirst = true;
@@ -190,10 +251,9 @@ DirectoryNode* DirectoryNode::advanceToNextMP3(const String* currentGlobal)
// Therefore, we need to recursively look in our subdirectories.
for (auto subdir : subdirectories)
{
Serial.println("searching next node");
if (useFirst && subdir->mp3Files.size()>0) {
subdir->currentPlaying = &subdir->mp3Files[0];
subdir->setCurrentPlaying(&subdir->mp3Files[0]);
return subdir;
}
@@ -206,7 +266,7 @@ DirectoryNode* DirectoryNode::advanceToNextMP3(const String* currentGlobal)
if (i < subdir->mp3Files.size() - 1)
{
// Advance to the next MP3 file in the same directory
subdir->currentPlaying = &subdir->mp3Files[i + 1];
subdir->setCurrentPlaying(&subdir->mp3Files[i + 1]);
return subdir;
} else {
useFirst = true;
@@ -232,12 +292,12 @@ String DirectoryNode::getDirectoryStructureHTML() const
}
if (name!="/") {
html += "<li><b>" + name + "</b></li>\n";
html += "<li data-id=\""+String(id)+"\"><b>" + name + "</b></li>\n";
}
for (const String &mp3File : mp3Files)
for (int i=0;i<mp3Files.size();i++)
{
html += "<li>" + mp3File + "</li>\n";
html += "<li data-id=\""+String(ids[i])+"\">" + mp3Files[i] + "</li>\n";
}
for (DirectoryNode *childNode : subdirectories)