Ordner wiederholen

Moin @Thomas-Lehnert,

bin grade am Ausprobieren, scheine aber irgendwie ein Problem zu haben.

folgendes hab ich gemacht

    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)
    {
      bStop = false;
      currentQueueIndex =(0);
    }
        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
 }

und die ModKarte sieht so aus

//**** Modkarte ******** EndlessPlayQueue *************************************
// Nach Auflegen der Modifikationskarte "ordner endlos wiederholen"
// wird der aktuelle Ordner endlos wiederholt.

class RepeatSingleModifier: public Modifier
// --------------------------------------------------------------------
{
public:
  RepeatSingleModifier()
  {
#ifdef Konsole
      Serial.println(F("EndlessPlay-Queue"));
#endif

  EndlessPlay = true;
  }
};

Handle next und previews hab ich rausgelöscht weil er mir Fehler beim Kompilieren angezeigt hatte.

und so sieht der Serielle monitor aus

20:59:39.279 -> 
20:59:39.279 -> ** TONUINO **
20:59:39.279 -> 
20:59:39.279 -> ** VERSION THOMAS LEHNERT ** 2022-01-17 **
20:59:39.279 -> 
20:59:39.279 -> Based on TonUINO V.2.1
20:59:39.279 -> created by Thorsten Voß and licensed under GNU/GPL.
20:59:39.279 -> https://tonuino.de.
20:59:39.279 -> 
20:59:39.279 -> ** 5 Tasten **
20:59:39.279 -> 
20:59:39.279 -> load mySettings
20:59:39.279 -> Vers.: 2
20:59:39.279 -> Max Vol. : 25
20:59:39.279 -> Min Vol. : 2
20:59:39.279 -> Init Vol. : 15
20:59:39.279 -> EQ :  1
20:59:39.279 -> StBy Timer: 5 min
20:59:39.279 -> Skip Buttons: 1
20:59:39.279 -> Adm.Menu: unlocked
20:59:39.279 ->  
20:59:39.279 -> -- ShortCuts --
20:59:39.279 -> SC-0, Play-Taste: Letzte Karte
20:59:39.279 -> SC-1, Weiter-Taste: 0
20:59:39.279 -> SC-2, Zurück-Taste: 0
20:59:39.325 -> SC-3, Lauter-Taste : 0
20:59:39.325 -> SC-4, Leiser-Taste : 0
20:59:39.325 -> SC-5, Begrüßung : 0
20:59:39.325 -> 
20:59:42.631 -> Ordner auf SD: 20
20:59:42.631 -> 
20:59:42.677 -> mfrc522-> RxGain_avg
20:59:42.677 -> Firmware Version: 0x92 = v2.0
20:59:42.951 -> StdBy ON: 5 min
20:59:42.951 -> 
20:59:43.962 -> Play Sct: 5
20:59:43.962 -> Shortcut n.belegt!
20:59:51.904 -> Card UID: 93 40 9D 16
20:59:51.904 -> PICC type: MIFARE 1KB
20:59:51.904 -> Authenticating Classic using key A...
20:59:51.904 -> Reading data from block 4 ...
20:59:51.904 -> Data on Card :
20:59:51.904 ->  13 37 B3 47 02 00 06 00 00 00 00 00 00 00 00 00
20:59:51.904 -> 
20:59:51.904 -> EndlessPlay-Queue
20:59:59.957 -> Card UID: 83 49 8A 16
20:59:59.957 -> PICC type: MIFARE 1KB
20:59:59.957 -> Authenticating Classic using key A...
20:59:59.957 -> Reading data from block 4 ...
20:59:59.957 -> Data on Card :
20:59:59.957 ->  13 37 B3 47 02 04 05 00 00 00 00 00 00 00 00 00
20:59:59.957 -> 
20:59:59.957 -> 4
20:59:59.957 -> 4
20:59:59.957 -> Play Folder: 4
20:59:59.957 -> 
20:59:59.957 -> StdBy OFF
21:00:00.004 -> Hörb.modus
21:00:00.004 -> 16 Dateien in Ordner 4
21:00:00.004 -> 1 von: 16
21:00:00.004 -> Play Q-idx: 1, Trk: 2
21:00:00.004 -> 
21:00:00.004 -> StdBy OFF
21:00:00.096 -> last Card -> EEPROM !
21:00:15.068 -> Lauter -> 16
21:00:16.868 -> 
21:00:16.868 -> Hörb.modus -> nxtTrk 
21:00:16.868 -> idx: 1 --> Sp.-Fortschr.
21:00:16.868 -> 2 von: 16
21:00:16.868 -> Play Q-idx: 2, Trk: 3
21:00:16.868 -> 
21:00:16.868 -> StdBy OFF
21:00:21.927 -> SD-K OPFin -> nxtTr
21:00:22.022 -> 
21:00:22.022 -> Hörb.modus -> nxtTrk 
21:00:22.022 -> idx: 2 --> Sp.-Fortschr.
21:00:22.022 -> 3 von: 16
21:00:22.022 -> Play Q-idx: 3, Trk: 4
21:00:22.022 -> 
21:00:22.022 -> StdBy OFF
21:00:22.022 -> SD-K OPFin -> nxtTr
21:00:33.150 -> SD-K OPFin -> nxtTr
21:00:33.289 -> 
21:00:33.289 -> Hörb.modus -> nxtTrk 
21:00:33.289 -> idx: 3 --> Sp.-Fortschr.
21:00:33.289 -> 4 von: 16
21:00:33.289 -> Play Q-idx: 4, Trk: 5
21:00:33.289 -> 
21:00:33.289 -> StdBy OFF
21:00:33.289 -> SD-K OPFin -> nxtTr
21:00:35.218 -> SD-K OPFin -> nxtTr
21:00:35.312 -> 
21:00:35.312 -> Hörb.modus -> nxtTrk 
21:00:35.312 -> idx: 4 --> Sp.-Fortschr.
21:00:35.312 -> 5 von: 16
21:00:35.312 -> Play Q-idx: 5, Trk: 6
21:00:35.312 -> 
21:00:35.312 -> StdBy OFF
21:00:35.312 -> SD-K OPFin -> nxtTr
21:00:41.339 -> SD-K OPFin -> nxtTr
21:00:41.432 -> 
21:00:41.432 -> Hörb.modus -> nxtTrk 
21:00:41.432 -> idx: 5 --> Sp.-Fortschr.
21:00:41.432 -> 6 von: 16
21:00:41.432 -> Play Q-idx: 6, Trk: 7
21:00:41.432 -> 
21:00:41.432 -> StdBy OFF
21:00:41.432 -> SD-K OPFin -> nxtTr
21:00:48.148 -> SD-K OPFin -> nxtTr
21:00:48.288 -> 
21:00:48.288 -> Hörb.modus -> nxtTrk 
21:00:48.288 -> idx: 6 --> Sp.-Fortschr.
21:00:48.288 -> 7 von: 16
21:00:48.288 -> Play Q-idx: 7, Trk: 8
21:00:48.288 -> 
21:00:48.288 -> StdBy OFF
21:00:48.288 -> SD-K OPFin -> nxtTr
21:00:51.889 -> SD-K OPFin -> nxtTr
21:00:51.980 -> 
21:00:51.980 -> Hörb.modus -> nxtTrk 
21:00:51.980 -> idx: 7 --> Sp.-Fortschr.
21:00:51.980 -> 8 von: 16
21:00:51.980 -> Play Q-idx: 8, Trk: 9
21:00:51.980 -> 
21:00:51.980 -> StdBy OFF
21:00:51.980 -> SD-K OPFin -> nxtTr
21:00:53.406 -> SD-K OPFin -> nxtTr
21:00:53.499 -> 
21:00:53.499 -> Hörb.modus -> nxtTrk 
21:00:53.499 -> idx: 8 --> Sp.-Fortschr.
21:00:53.499 -> 9 von: 16
21:00:53.499 -> Play Q-idx: 9, Trk: 10
21:00:53.545 -> 
21:00:53.545 -> StdBy OFF
21:00:53.545 -> SD-K OPFin -> nxtTr
21:01:00.115 -> SD-K OPFin -> nxtTr
21:01:00.207 -> 
21:01:00.207 -> Hörb.modus -> nxtTrk 
21:01:00.207 -> idx: 9 --> Sp.-Fortschr.
21:01:00.252 -> 10 von: 16
21:01:00.252 -> Play Q-idx: 10, Trk: 11
21:01:00.252 -> 
21:01:00.252 -> StdBy OFF
21:01:00.252 -> SD-K OPFin -> nxtTr
21:01:08.934 -> SD-K OPFin -> nxtTr
21:01:09.025 -> 
21:01:09.025 -> Hörb.modus -> nxtTrk 
21:01:09.025 -> idx: 10 --> Sp.-Fortschr.
21:01:09.025 -> 11 von: 16
21:01:09.025 -> Play Q-idx: 11, Trk: 12
21:01:09.025 -> 
21:01:09.025 -> StdBy OFF
21:01:09.025 -> SD-K OPFin -> nxtTr
21:01:16.614 -> SD-K OPFin -> nxtTr
21:01:16.707 -> 
21:01:16.707 -> Hörb.modus -> nxtTrk 
21:01:16.707 -> idx: 11 --> Sp.-Fortschr.
21:01:16.707 -> 12 von: 16
21:01:16.707 -> Play Q-idx: 12, Trk: 13
21:01:16.707 -> 
21:01:16.707 -> StdBy OFF
21:01:16.707 -> SD-K OPFin -> nxtTr
21:01:20.665 -> SD-K OPFin -> nxtTr
21:01:20.804 -> 
21:01:20.804 -> Hörb.modus -> nxtTrk 
21:01:20.804 -> idx: 12 --> Sp.-Fortschr.
21:01:20.804 -> 13 von: 16
21:01:20.804 -> Play Q-idx: 13, Trk: 14
21:01:20.804 -> 
21:01:20.804 -> StdBy OFF
21:01:20.804 -> SD-K OPFin -> nxtTr
21:01:28.256 -> SD-K OPFin -> nxtTr
21:01:28.349 -> 
21:01:28.349 -> Hörb.modus -> nxtTrk 
21:01:28.349 -> idx: 13 --> Sp.-Fortschr.
21:01:28.395 -> 14 von: 16
21:01:28.395 -> Play Q-idx: 14, Trk: 15
21:01:28.395 -> 
21:01:28.395 -> StdBy OFF
21:01:28.395 -> SD-K OPFin -> nxtTr
21:01:44.802 -> SD-K OPFin -> nxtTr
21:01:44.895 -> 
21:01:44.895 -> Hörb.modus -> nxtTrk 
21:01:44.895 -> idx: 14 --> Sp.-Fortschr.
21:01:44.895 -> 15 von: 16
21:01:44.895 -> Play Q-idx: 15, Trk: 16
21:01:44.895 -> 
21:01:44.895 -> StdBy OFF
21:01:44.895 -> SD-K OPFin -> nxtTr
21:01:58.636 -> SD-K OPFin -> nxtTr
21:01:58.727 -> 
21:01:58.727 -> Hörb.modus -> nxtTrk 
21:01:58.727 -> idx: 15 --> Hörb->Anfang
21:01:58.773 -> 1 von: 16
21:01:58.773 -> Play Q-idx: 1, Trk: 2
21:01:58.773 -> 
21:01:58.773 -> StdBy OFF
21:01:58.773 -> Waiting for Stop
21:01:58.773 -> Stop
21:02:00.285 -> StdBy ON: 5 min
21:02:00.285 -> 
21:02:00.285 -> SD-K OPFin -> nxtTr

Poblem ist, dass der ordner quasi mit track 2 Startet nach durchlauf, aber auch erst dann, wenn ich auf die Next taste drücke :thinking:

Edit: hab grade nochmal den Sketch gelöscht und dann die Konfiguration neu eingefügt und aufgespielt. nun Klappt es ^^

nach dem der Modifier erfolgreich läuft fehlt mir jetzt nur noch ein Signal, dass er aktiviert ist.

Folgendes hab ich Probiert:

class RepeatSingleModifier: public Modifier
// --------------------------------------------------------------------
{
public:
  RepeatSingleModifier()
  {
#ifdef Konsole
      Serial.println(F("EndlessPlay-Queue"));
#endif
    

  EndlessPlay = true;
  { //delay(500);
      mp3.playAdvertisement(306);                     // advert-306 - Titel in Endlosschleife
      //delay(500);
    }
    uint8_t getActive();

  }
    

};

Leider ohne Erfolg

21:49:35.228 -> Shortcut n.belegt!
21:49:35.274 -> Konsole reduziert
21:49:35.412 -> 7- adv error
21:49:41.338 -> 7- adv error

nun bin ich mit meinen Copy Paste Fähigkeiten am Ende ^^

Ich bedanke mich aber schonmal herzlichst für die Mühe. Bin Froh das es so klappt. :smiling_face:

Erst mal zu deinem Problem, dass die Queue nicht neu Startet.
Du hast in deinem Code ein else vor bstop=true vergessen. Dadurch wird die Aufforderung zum Neustart der Queue wieder aufgehoben, was ja eigentlich bei aktivem Modifier nicht gewollt ist. Warum er bei Track 2 anfängt versuche ich noch herauszufinden. Bei mir beginnt er mit Track 1, also so wie gewünscht. Eventuell hat das mit dem EndOfTrack event zu tun, das bei vielen Playern 2x ausgegeben wird und bei anderen nur 1x. Ich gehe der Sache nach. Melde mich, wenn ich was rausgefunden habe.

     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;

Musst du rausnehmen, sonst wird beim Auflegen der Schlummerkarte, der EndlessMode wieder deaktiviert.
Als Akustische Meldung kannst du nur eine Datei nehmen, die sich im mp3 ordner befindet, weil adverts nur bei laufender Wiedergabe abgespeilt werden können. Oder du musst dich des Tricks bedienen, Vor abspielen des Adverts die Wiedergabe zu starten, den advert abspielen und die Wiedergabe wieder stoppen. Oder du machst eine abfrageIf(isPlaying()) mp3.playAdvertisement(306);, spielst das Advert ab, und dann else mp3.playMp3FolderTrack(XXX); Für XXX musst du dir einen passenden Sound in den mp3Folder kopieren oder erzeugen und die Filenummer 0XXX vergeben. Das ganze fügst du anstelle deines Codeteiles

 { //delay(500);
      mp3.playAdvertisement(306);                     // advert-306 - Titel in Endlosschleife
      //delay(500);
    }

ein. Die geschweiften Klammern kanst du weglassen.

Hier noch eine Sache, die du ausserden machen kannst. Um die Restriktionen im Schlummermodus für EndlessPlay aufzuheben kannst du im Modifier Schlummermodus folgende Änderungen machen. Hier als Beispiel für die Vor und Zurücktasten. Gleiches Vorgehen bei den anderen Einschränkungen. Das bewirkt, dass der Schlummermodus ohne Endlessplay so funktioniert wie gehabt. Bei endlessPlay aber voll bedienbar wird, also alle Tasten und Kartenleser sind nicht gesperrt.

 virtual bool handleNextButton()
    {
      if(EndlessPlay)        // Bei EndlessPlayQueue keine Sperre
      return false;
      else
      {
      LockNext();             // Next Taste sperren
      return true;
      }
    }
    // ---------------------------------------------------------------
    virtual bool handlePreviousButton()
    {
      if(EndlessPlay)        // Bei EndlessPlayQueue keine Sperre
      return false;
      else
      {
      LockPrevious();         // Zurück Taste sperren
      return true;
      }
    }
    // ---------------------------------------------------------------

 virtual bool handleNextButton()
    {
      if(EndlessPlay)        // Bei EndlessPlayQueue keine Sperre
      return false;
      else
      {
      LockNext();             // Next Taste sperren
      return true;
      }
    }
    // ---------------------------------------------------------------
    virtual bool handlePreviousButton()
    {
      if(EndlessPlay)        // Bei EndlessPlayQueue keine Sperre
      return false;
      else
      {
      LockPrevious();         // Zurück Taste sperren
      return true;
      }
    }
    // ---------------------------------------------------------------

Wenn du das getActive() im modifier Schlummermodus so wie unten gezeigt ergänzt, kannst du endlessPlay gemeinsam mit dem Schlummermodus durch wiederholtes auflegen der Schlummerkarte auch wieder ausschalten ohne den Tonuino ausschalten zu müssen.

    uint8_t getActive()
    {
#ifdef Konsole
      modEnd ();                             // Deaktivieren durch erneutes Auflegen dieser
                                             // oder einer anderen Modifikationskarte
#endif
      EndlessPlay = false;                   // Bei deaktivierung wird ggF. EndlessPlay mit zurück gesetzt
      return 1;
    }
};`

Ich teste heute Abend noch Mal durch, danke schonmal.

Falls die Errormeldungen bei dieser zeile erfolgen, liegt das daran, dass ich bei mir die Ausgabe in der Konsole für die Sperrung als void Lock…() ausgelagert habe. Wenn das bei dir nicht so ist, die ursprünglichen Codezeilen an dieser Stelle belassen.

Habe versehentlich dan falschen Modus geändert, deshalb letzter Post gelöscht. Funktionierte so nicht.

So, ich habe jetzt nochmal mit verschiedenen Playern getestet. Zum Testen verwendet:
MHETLIVE 2024K-24SS,
YX5200 24SS,
JI AA19HF 8328-94,
JI AA19HF 2128-94,
Diese Player geben 2 EoT Events bei normalen Tracks und kein EoT bei Advert aus.

Dann den DFROBOT mit dem LISP3 Chip
Dieser Player gibt 2 EoT Events bei normalen Tracks und 1 EoT Event bei Advert aus.

Diese Player funktionieren ohne Probleme mit EndlessplayQueue. Für den DFROBOT wurde zusätzlich die Codeanpassung für die Adverts aktiviert.
Die Codeanpassung für Adverts hat aber keinen Einfluss auf EndlessplayQueue.

Ein Player der Generation 16SS steht mir leider nicht zur Verfügung, sonst hätte ich das auch getestet.

hi hab es soweit geschafft, das mir zumindest beim Auflegen der Modkarte was erzählt wird allerdings nich wie die Mp3 die ich dafür vorgesehen hatte(0256 im Ordner mp3 „kompletten Ordner Wiederholen“) sondern die stimme sagt: „174“

class RepeatSingleModifier: public Modifier
// --------------------------------------------------------------------
{
public:
  RepeatSingleModifier()
  {
#ifdef Konsole
      Serial.println(F("EndlessPlay-Queue"));
#endif
     
  EndlessPlay = true;
  //delay(500);
  mp3.playMp3FolderTrack(0256);                     // mp3-0804 - Ordner in Endlosschleife
  //delay(500);

  }
  

};```

so sieht das ganze zur Zeit aus.

Fehler gefunden habe von

EndlessPlay = true; //delay(500); mp3.playMp3FolderTrack(0256); // mp3-0804 - Ordner in Endlosschleife //delay(500);

in das geändert
EndlessPlay = true; //delay(500); mp3.playMp3FolderTrack(256); // mp3-0256 - Ordner in Endlosschleife //delay(500);

nun läufts

Ja, obwohl die Dateien im advert oder mp3 Ordner 4 Stellig sein müssen, ist der Aufruf im code nur 3 Stellig. Spielt der Tonuino denn nun die wiederholung von Track 1 an ab?

das Problem konnte ich ja gestern schon Lösen in dem ich den Sketch gelöscht, neu aufgespielt und dann nochmal die Änderung vorgenommen hab.

Ah,Ja, Das hab ich dann wohl nicht so verstanden. Schön, dass es nun läuft.

So der sketch läuft einwandfrei, so wie ich mir das vorgestellt hab.
Hörbuch spielt ab, nach dem Letzten Track wird der 1. gestartet und nach Ablauf des SleepTimers schaltet sich die Box aus.

Danke auch noch mal für das erweitern, dass man die Vor/Zurücktaste und Karte im EndlessPlay noch benutzen kann, hab ich soweit für Lauter und Leiser noch ergänzt.

auf dem JI AA20HF j616-94 läuft das sehr gut
auf dem MH-ETLive 2024K-24SS (Mp3-TF-16P V3.0) Läuft es auch, Allerdings mit relativ Langer boot-Zeit und einem leisen knacken zwischen den Titeln.

für den GD320B müsste man für den Hörbuchmodus Wahrscheinlich die von - bis Funktion einbauen
zumindest funktioniert der auf @marco-117 s Affenbox-Fork bei mir.

Wenn du nun noch die Abfragen if(isPlaying()) und das zugehörige else einbaust, und deine Ansage auch in den advertordner kopierst (kann da auch eine andere Nummer haben) und dann als advert aufrufst, bekommst du auch eine Ansage, wenn die Wiedergabe läuft und die EndlessPlay Karte aufgelegt wird. Anschließend wird die Wiedergabe automatisch fortgesetzt.

  EndlessPlay = true;
  //delay(500);
If(isPlaying()) mp3.playAdvertisement(xxx);     // Abspielen wenn Wiedergabe läuft
else mp3.playMp3FolderTrack(256);              // Abspielen wenn keine Wiedergabe
  //delay(500);


top der Mann :+1: :+1: :+1: :+1: :+1:
gesagt getan;)

Kannst du mir bitte mal im detail zusammengefasst die Anpassungen posten, die du in der library und im Code für diesen Player gemacht hast?

für den hab ich gar keine Anpassungen gemach^^ der war in meinem 1. TonUino set von AZ Delivery dabei was ich 2020 glaube ich bestellt hatte.

für den anderen hab ich diese gemacht private: static const uint16_t c_msSendSpace = 120;
was ich hier im Forum gefunden hatte
Lautstärke sehr laut - #30 von simon1

Ach ja, diese Sache. Ich erinnere mich. Danke.