Hallo @ClausiusMaximus
Ich habe mir mal dahingehend gedanken gemacht. Man kann das über ein Modifier machen. Das besondere ist, dass dieses Modifier neben einem anderen Modifier parallel laufen kann, was normalerweise nicht möglich ist. Bei meiner Lösung, muss zuerst das EndlessPlayQueue Modifier gestartet werden und dann kann zusätzlich z.B.das Schlummermodus Modifier gestartet werden. Diese Reihenfolge ist wichtig. Machst du es anders herum, schaltet das EndlessPlayQueue Modifier den Schlummermodus wieder aus. Eine Besonderheit ist noch, dass das EndlessPlayQueue Modifier nur durch das Abschalten des Tonuino wieder deaktiviert wird. Aber in deiner Wunschverwendung wird der Tonuino ja durch den Schlummermodus ausgeschaltet. Dieses Modifier habe ich für den Albummodus, Albummodus-Spezial-Von-Bis, und den Hörbuchmodus eingebunden. Der Partymodus braucht das nicht, da er am Ende der Queue sowieso neu mischt und neu beginnt.
Hier die Codeabschnitte, die du Ändern, bzw. ergänzen musst. Das bezieht sich auf meinen Fork alwaysQueue. In einem anderen Fork müsste das ggf. angepasst werden.
Zuerst eine bool Variable in den Deklarationen der Variablen am Scetchanfang einfügen
bool EndlessPlay = false;
Dann die Abspielmodi wie folgt ergänzen, bzw. ändern,
Im Albummodus , so:
case 2: //Album
case 7: //Album-SpezialVonBis
//#ifdef Konsole
Serial.print("idx: ");
Serial.print(currentQueueIndex);
Serial.print(" --> ");
//#endif
if((currentQueueIndex + Steps) < queueSize) // wenn Queueindex plus Sprung unter queueSize
currentQueueIndex = (currentQueueIndex + Steps); // Weiterspringen in der Queue
else // wenn Queueindex plus Sprung gleich oder größer queueSize
{
currentQueueIndex = (queueSize -1); // Gehe zum Ende der queue
if(EndlessPlay) // wenn EndlessPlay aktiviert
{
bStop = false ; // kein Stop am Ende der Queue
currentQueueIndex = (0); // Index auf Anfang der Queue
}
else // EndlessPlay nicht aktiviert
bStop = true; // Stop am Ende der Queue
//#ifdef Konsole
Serial.println(currentQueueIndex);
Serial.println(F(" - EoQ"));
//#endif
}
Steps = 1; // Rücksetzen der Sprungweite auf 1 für Einzelschritt
break;
// --------------------------------------
Im Hörbuchmodus, so:
case 5: //Hoerbuch
#ifdef Konsole
if (ResetHB == true) Serial.println ("next Track und Wiederholung Epromupdate nach HB Reset gesperrt");
#endif
//#ifdef Konsole
Serial.print("idx: ");
Serial.print(currentQueueIndex);
Serial.print(" --> ");
//#endif
if (ResetHB == false) // Wenn nxtTrk und update EEProm HB nicht gesperrt
{
if (currentQueueIndex + Steps < queueSize) // Wenn Sprung unter Queue Ende bleibt
{
currentQueueIndex = currentQueueIndex + Steps; // Weitersprung in Queue
if (currentQueueIndex + Steps >= queueSize) // Wenn Sprung Queue Ende erreicht oder Überschreitet
{
currentQueueIndex = (queueSize - 1); // index auf Ende der Queue setzen
}
#ifndef AiO
EEPROM.update(myFolder->folder, queue[currentQueueIndex]); // Fortschritt im EEPROM abspeichern
#endif
#ifdef AiO
EEPROM_update(myFolder->folder, queue[currentQueueIndex]); // Fortschritt im EEPROM abspeichern
#endif
#ifdef Konsole
Serial.println(F("Sp.-Fortschr."));
#endif
Steps = 1; // Rücksetzen der Sprungweite auf 1 für Einzelschritt
break;
}
else // Ende der Queue
{
#ifndef AiO
EEPROM.update(myFolder->folder, 1); // Fortschritt am Ende HB autom.zurücksetzen (Classik)
#endif
#ifdef AiO
EEPROM_update(myFolder->folder, 1); // Fortschritt am Ende HB autom.zurücksetzen (AiO)
#endif
#ifdef Konsole
Serial.println(F("Hörb->Anfang"));
#endif
if(EndlessPlay) // wenn EndlessPlay aktiviert
{
bStop = false ; // kein Stop am Ende der Queue
currentQueueIndex = (0); // Index auf Anfang der Queue
}
else // EndlessPlay nicht aktiviert
bStop = true; // Stop am Ende der Queue
Steps = 1; // Rücksetzen der Sprungweite auf 1 für Einzelschritt
break;
}
// --------------------------------------
default:
return; // do nothing
}
ResetHB = false; // Rücksetzen Marker Hörbuch reset, Aufheben der Sperre
}
Dann noch das Modifier. Ich habe bei mir der einfachheit halber, das single Repeat Modifier durch das das EndlessPlayQueue Modifier ersetzt. Du kannst natürlich auch ein eigenes Modifier dafür anlegen, musst dann nur das Adminmenü entsprechend erweitern. Hier der Code dafür:
//**** Modkarte ******** Titel endlos wiederholen *************************************
ändern in
//*********Modkarte******** EndlessPlayQueue **************************************
//**** Modkarte ******** EndlessPlayQueue *************************************
class RepeatSingleModifier: public Modifier
{
public:
RepeatSingleModifier()
{
#ifdef Konsole
Serial.println(F("EndlessPlay-Queue"));
#endif
EndlessPlay = true;
}
};
Das Modifier macht nichts weiter als den Flag für EndlessPlay zu setzen.
Ich habs getestet, läuft soweit zur zufriedenheit.