Abspielen mit Advert instabil


#1

Hallo Leute,

erstmal danke an Thorsten für das tolle Projekt!

Ich habe heute mit einem Kollegen eine Variante aufgebaut und alles lief erstmal dank fertiger Software ohne Probleme. Musik wurde sauber abgespielt. Dann ging es ans Ändern der Software. Zwei zusätzlich Schalter hinzugefügt für getrenntes Schalten der Lautstärke und Vorspulen der Lieder. Ging auch ohne Probleme. Dann wollten wir eine Ansage der Dateinummer beim Umschalten nach jedem Lied einbauen über Advert und da hingen wir dann…

Folgendes haben wir vor:

  1. Ordner erstellen mit Hörbüchern, wo jede Datei eine Folge ist.
  2. Beim Umschalten der Lieder, also der Folgen, soll zu Beginn die Nummer der Folge angesagt werden.

So wurde es umgesetzt, Auszüge aus dem Code:

if (upButton.wasReleased()) {
nextTrack(random(65536));
mp3.playAdvertisement(currentTrack);
}

if (downButton.wasReleased()) {
previousTrack();
mp3.playAdvertisement(currentTrack);
}

Beim Drücken nach oben wurde beim ersten Drücken nichts angesagt, ab dem zweiten Drücken ging es dann. Beim Drücken nach unten wurde nie etwas angesagt. Auf der seriellen Schnittstelle wurde der Fehler “COM Error 7” ausgegeben. Hat jemand eine Idee woran das liegen kann?

Außerdem haben wir festgestellt, dass sich das Programm aufhängt, wenn beim Abspielen der Play/Pause Knopf länger gedrückt wird. Im Code steht dort:

} else if (pauseButton.pressedFor(LONG_PRESS) &&
           ignorePauseButton == false) {
  if (isPlaying())
    mp3.playAdvertisement(currentTrack);
  else {

Auch hier ist das Abspielen der Adverts instabil.

Wir haben schon im Internet gesucht und dort unter anderem diesen Thread gefunden:

https://www.dfrobot.com/forum/viewtopic.php?t=1524

Auch dort wird von Instabilitäten berichtet. Kann irgendjemand helfen?

Viele Grüße,

DS

P.S. Wenn das Projekt fertig ist, werden wir selbstverständlich Bilder machen und die Teileliste veröffentlichen.


#2

Error #7 ist ein advert error:

enum DfMp3_Error
{
    DfMp3_Error_Busy = 1,
    DfMp3_Error_Sleeping,
    DfMp3_Error_SerialWrongStack,
    DfMp3_Error_CheckSumNotMatch,
    DfMp3_Error_FileIndexOut,
    DfMp3_Error_FileMismatch,
    DfMp3_Error_Advertise,
    DfMp3_Error_General = 0xff
};

Kommt meistens wenn man versucht ein advertisement zu spielen ohne das ein reguläres mp3 läuft. Das ist nämlich Vorraussetzung. Wenn ihr die Nummer VOR dem Titel abspielen wollt, warum nehmt ihr dann advert? Spielt die Nummer doch normal ab. Wie man zwei Titel direkt back to back abspielt hab ich an anderer Stelle schon mal erklärt. Vielleicht habt ihr damit mehr Erfolg. Nen Versuch ist es wert.


#3

Das mit dem Advert Error hatte ich schon rausgefunden, deshalb hab ich das ja als Fehlerquelle erkannt. Und er spielt ja das Advert erst ab, wenn ich mit nextTrack(random(65536)); das nächste Lied ausgelöst habe. Wir haben auch schon Pausen gemacht von 100 ms, das hat nichts gebracht. Werde demnächst mal einen Knopf umfunktionieren, um mit dem Advert Zugriffe auszulösen um zu sehen, ob es an der Funktion oder nur am Timing liegt. Eine andere Lösung wäre wie du sagst, zwei Titel hintereinander abzuspielen. Oder aber man spielt erst das Lied an und wartet ein paar Sekunden, um die Nummer des Liedes etwas später anzusagen. Werden wir die Tage mal probieren.


#4

Macht das aber dann wo es geht ohne Delay. Das blockiert den Controller und Tasten reagieren nicht mehr etc.


#5

Wollte die Funktion millis() verwenden, so wie hier:


#6

Kurze Rückmeldung von mir. Ich habe die Sache jetzt mit einem Delay von 1 Sekunde behoben. Das ist auch kein Problem, da ich diese Pause nicht als störend empfinde. So sagt er jedesmal zuverlässig den Track an. Hier ist der Code:

if (upButton.wasReleased()) {      
  nextTrack(random(65536));
  if (myCard.mode == 5) {
    delay(1000);
    mp3.playAdvertisement(currentTrack);        
  }      
  Serial.println(currentTrack);
}

Bitte beachten, wir verwenden 5 Knöpfe statt 3, daher gibt es kein LongPress!