ESP stürzt bei Trackwechsel ab / Langsame MP3 Wiedergabe

Hallo zusammen,

Ich baue gerade einen ESPuino in der „Standardkonfiguration“ auf, also:

Ich habe leider Probleme bei der Wiedergabe von Medien. Wenn ich nach AAC konvertiere (ffmpeg -i input.m4a -vbr 3 output.aac) stürzt der ESPuino bei einem Trackwechsel mit folgender Meldung ab:

[ 60070 ]  RSSI: -68 dBm
Guru Meditation Error: Core  1 panic'ed (LoadStoreError). Exception was unhandled.
Core 1 register dump:
PC      : 0x400f1555  PS      : 0x00060130  A0      : 0x800f15bc  A1      : 0x3ffd25b0  
A2      : 0xfffffe71  A3      : 0x3fff17a0  A4      : 0x3f80354a  A5      : 0xfffffe72  
A6      : 0xfffffffc  A7      : 0xffffff92  A8      : 0x40000000  A9      : 0x3ffc6828  
A10     : 0xff83f9e3  A11     : 0x40000001  A12     : 0xffffffe5  A13     : 0x5a82799a  
A14     : 0x3fff0fa0  A15     : 0x00000000  SAR     : 0x0000001d  EXCCAUSE: 0x00000003  
EXCVADDR: 0x40000000  LBEG    : 0x400f1bac  LEND    : 0x400f1bbc  LCOUNT  : 0x00000000  

ELF file SHA256: 0000000000000000

Backtrace: 0x400f1555:0x3ffd25b0 0x400f15b9:0x3ffd25d0 0x400f26f2:0x3ffd25f0 0x400f2c19:0x3ffd2610 0x400e9df2:0x3ffd2650 0x400eaaf1:0x3ffd28c0 0x400eebb6:0x3ffd2b40 0x400d4a6a:0x3ffd2b60 0x400992ba:0x3ffd2bc0

Rebooting...

Wenn ich MP3 verwende (ffmpeg -i input.m4a -codec:a libmp3lame -qscale:a 4 output.mp3, dann stottert die Ausgabe und es fühlt sich so an, als ob der ESP einfach zu langsam wäre. Nach ca. 10-20 Sekunden eines Hörbuchkapitels legt sich das Problem, tritt aber beim nächsten Kapitel erneut auf.

Hat hier vielleicht jemand eine Idee?

Viele Grüße

Bezüglich Absturz "Core 1 panic’ed würde ich den Stack des Audiotask versuchsweise erhöhen:
z.B: von 5500 auf 8192

    // Don't start audio-task in BT-speaker mode!
    if ((System_GetOperationMode() == OPMODE_NORMAL) || (System_GetOperationMode() == OPMODE_BLUETOOTH_SOURCE)) {       
        xTaskCreatePinnedToCore(
            AudioPlayer_Task,      /* Function to implement the task */
            "mp3play",             /* Name of the task */
            8192,                  /* Stack size in words */
            NULL,                  /* Task input parameter */
            2 | portPRIVILEGE_BIT, /* Priority of the task */
            NULL,                  /* Task handle. */
            1                      /* Core where the task should run */
        );
    }
}

Bezüglich MP3 stottert:
Das kenne ich nur von WebRadio hören.

Teste einmal eine MP3 über WebGUI hoch- oder downzuladen.
Welche Geschwindigkeit wird dabei erreicht?

VG

Bei einem Absturz ist der dekodierte Aufrufstack meist sehr hilfreich. Trage dazu diese Zeile in Platform.ini ein:

monitor_filters = esp32_exception_decoder

Poste die Ausgabe dann einmal hier…

Hallo. Vielen lieben Dank für die schnellen Antworten.

Die Erhöhung des Stacks hat leider nichts gebracht. Die Uploadgeschwindigkeit per Webinterface beträgt 100.00 - 400.70 KB/s.

Hier nun der Aufrufstack:

[ 9814 ]  RFID-Karte empfangen: 153117148181
[ 9826 ]  Playlist-Generierung: cached
[ 9829 ]  Freier Speicher: 85088
[ 9830 ]  Anzahl gültiger Files/Webstreams: 2
[ 9830 ]  Modus: Spiele alle Tracks (alphabetisch sortiert) des Ordners '/test' 
[ 9837 ]  Neue Playlist empfangen mit 2 Titel(n)
[ 9837 ]  Free heap: : 85884
[ 9883 ]  info        : PSRAM found, inputBufferSize: 283615 bytes
[ 9883 ]  info        : buffers freed, free Heap: 85848 bytes
[ 9883 ]  info        : Reading file: "/test/xx.aac"
[ 9901 ]  info        : AACDecoder has been initialized, free Heap: 64936 bytes
[ 9903 ]  '/test/01 - xx.aac' wird abgespielt (1 von 2)
[ 10008 ]  Aktuelle Batteriespannung: 3.53 V
[ 10011 ]  Aktuelle Batterieladung: 42.86 %
[ 10218 ]  info        : stream ready
[ 10221 ]  info        : syncword found at pos 71
[ 10225 ]  info        : syncword found at pos 0
[ 10234 ]  info        : Channels: 2
[ 10234 ]  info        : SampleRate: 44100
[ 10234 ]  info        : BitsPerSample: 16
[ 10234 ]  info        : BitRate: 37553
[ 10238 ]  info        : AAC HeaderFormat: ADTS
[ 10242 ]  info        : AAC Codec: MPEG-4
[ 10245 ]  info        : AAC Profile: LowComplexity
[ 10266 ]  info        : VBR recognized, audioFileDuration is estimated
Guru Meditation Error: Core  1 panic'ed (LoadStoreError). Exception was unhandled.
Core 1 register dump:
PC      : 0x400f1551  PS      : 0x00060a30  A0      : 0x800f15b8  A1      : 0x3ffd3070  
A2      : 0xfffffe71  A3      : 0x3fff17a0  A4      : 0x3f80354a  A5      : 0xfffffe72  
A6      : 0xfffffffc  A7      : 0xffffff92  A8      : 0x40000000  A9      : 0x3ffc6828  
A10     : 0xff83f9e3  A11     : 0x40000001  A12     : 0xffffffe5  A13     : 0x5a82799a  
A14     : 0x3fff0fa0  A15     : 0x00000000  SAR     : 0x0000001d  EXCCAUSE: 0x00000003  
EXCVADDR: 0x40000000  LBEG    : 0x400f1ba8  LEND    : 0x400f1bb8  LCOUNT  : 0x00000000  

ELF file SHA256: 0000000000000000

Backtrace: 0x400f1551:0x3ffd3070 0x400f15b5:0x3ffd3090 0x400f26ee:0x3ffd30b0 0x400f2c15:0x3ffd30d0 0x400e9dee:0x3ffd3110 0x400eaaed:0x3ffd3380 0x400eebb2:0x3ffd3600 0x400d4a66:0x3ffd3620 0x400992ba:0x3ffd3680
  #0  0x400f1551:0x3ffd3070 in RefillBitstreamCache() at .pio/libdeps/lolin_d32_pro_sdmmc_pe/ESP32-audioI2S-master/src/aac_decoder/aac_decoder.cpp:6538
  #1  0x400f15b5:0x3ffd3090 in GetBits(int) at .pio/libdeps/lolin_d32_pro_sdmmc_pe/ESP32-audioI2S-master/src/aac_decoder/aac_decoder.cpp:6538
  #2  0x400f26ee:0x3ffd30b0 in DecodeNextElement(unsigned char**, int*, int*) at .pio/libdeps/lolin_d32_pro_sdmmc_pe/ESP32-audioI2S-master/src/aac_decoder/aac_decoder.cpp:6538
  #3  0x400f2c15:0x3ffd30d0 in AACDecode(unsigned char*, int*, short*) at .pio/libdeps/lolin_d32_pro_sdmmc_pe/ESP32-audioI2S-master/src/aac_decoder/aac_decoder.cpp:6538
  #4  0x400e9dee:0x3ffd3110 in Audio::sendBytes(unsigned char*, unsigned int) at .pio/libdeps/lolin_d32_pro_sdmmc_pe/ESP32-audioI2S-master/src/Audio.cpp:4257
  #5  0x400eaaed:0x3ffd3380 in Audio::processLocalFile() at .pio/libdeps/lolin_d32_pro_sdmmc_pe/ESP32-audioI2S-master/src/Audio.cpp:4257
  #6  0x400eebb2:0x3ffd3600 in Audio::loop() at .pio/libdeps/lolin_d32_pro_sdmmc_pe/ESP32-audioI2S-master/src/Audio.cpp:4257
  #7  0x400d4a66:0x3ffd3620 in AudioPlayer_Task(void*) at src/AudioPlayer.cpp:796
  #8  0x400992ba:0x3ffd3680 in vPortTaskWrapper at /home/runner/work/esp32-arduino-lib-builder/esp32-arduino-lib-builder/esp-idf/components/freertos/port.c:355 (discriminator 1)

Rebooting...

Und hier noch meine Konfiguration:

diff --git a/platformio.ini b/platformio.ini
+++ b/src/settings.h
@@ -30,7 +30,7 @@


     //########################## MODULES #################################
-    //#define PORT_EXPANDER_ENABLE          // When enabled, buttons can be connected via port-expander PCA9555 (https://forum.espuino.de/t:...skipping...
diff --git a/platformio.ini b/platformio.ini
index 3123803..da5be23 100644
--- a/platformio.ini
+++ b/platformio.ini
@@ -115,7 +115,7 @@ board = lolin_d32_pro
 board_build.partitions = custom_16mb_ota.csv
 ;upload_port = /dev/cu.wchusbserial1410
 ;monitor_port = /dev/cu.wchusbserial1410
-;monitor_filters = esp32_exception_decoder
+monitor_filters = esp32_exception_decoder
 build_flags = -DHAL=7
               -DBOARD_HAS_PSRAM
               -mfix-esp32-psram-cache-issue
diff --git a/src/AudioPlayer.cpp b/src/AudioPlayer.cpp
index 3429a7a..5f7e9a3 100644
--- a/src/AudioPlayer.cpp
+++ b/src/AudioPlayer.cpp
@@ -114,7 +114,7 @@ void AudioPlayer_Init(void) {
                xTaskCreatePinnedToCore(
                        AudioPlayer_Task,      /* Function to implement the task */
                        "mp3play",             /* Name of the task */
-                       5500,                  /* Stack size in words */
+                       8192,                  /* Stack size in words */
                        NULL,                  /* Task input parameter */
                        2 | portPRIVILEGE_BIT, /* Priority of the task */
                        NULL,                  /* Task handle. */
diff --git a/src/settings-lolin_d32_pro_sdmmc_pe.h b/src/settings-lolin_d32_pro_sdmmc_pe.h
index 1bf0869..dd033e5 100644
--- a/src/settings-lolin_d32_pro_sdmmc_pe.h
+++ b/src/settings-lolin_d32_pro_sdmmc_pe.h
@@ -90,9 +90,9 @@
     #define WAKEUP_BUTTON                   36          // Defines the button that is used to wake up ESPuino from deepsleep; set to 99 to disable

     // Power-control
-    #define POWER                           32          // GPIO used to drive transistor-circuit, that switches off peripheral devices while ESP32-deepsleep
+    #define POWER                           115          // GPIO used to drive transistor-circuit, that switches off peripheral devices while ESP32-deepsleep
     #ifdef POWER
-        //#define INVERT_POWER                          // If enabled, use inverted logic for POWER circuit, that means peripherals are turned off by writing HIGH
+        #define INVERT_POWER                          // If enabled, use inverted logic for POWER circuit, that means peripherals are turned off by writing HIGH
     #endif

     // (optional) Neopixel
diff --git a/src/settings.h b/src/settings.h
index d4c018f..34d8704 100644
--- a/src/settings.h
+++ b/src/settings.h
@@ -30,7 +30,7 @@


     //########################## MODULES #################################
-    //#define PORT_EXPANDER_ENABLE          // When enabled, buttons can be connected via port-expander PCA9555 (https://forum.espuino.de/t/einsatz-des-port-expanders-pca9555/306)
+    #define PORT_EXPANDER_ENABLE          // When enabled, buttons can be connected via port-expander PCA9555 (https://forum.espuino.de/t/einsatz-des-port-expanders-pca9555/306)
     //#define I2S_COMM_FMT_LSB_ENABLE       // Enables FMT instead of MSB for I2S-communication-format. Used e.g. by PT2811. Don't enable for MAX98357a, AC101 or PCM5102A)
     #define MDNS_ENABLE                     // When enabled, you don't have to handle with ESPuino's IP-address. If hostname is set to "ESPuino", you can reach it via ESPuino.local
     //#define MQTT_ENABLE                     // Make sure to configure mqtt-server and (optionally) username+pwd
@@ -63,9 +63,9 @@


     //################## select RFID reader ##############################
-    #define RFID_READER_TYPE_MFRC522_SPI    // use MFRC522 via SPI
+    //#define RFID_READER_TYPE_MFRC522_SPI    // use MFRC522 via SPI
     //#define RFID_READER_TYPE_MFRC522_I2C  // use MFRC522 via I2C
-    //#define RFID_READER_TYPE_PN5180       // use PN5180 via SPI
+    #define RFID_READER_TYPE_PN5180       // use PN5180 via SPI

Ich vermute mal, dass das was für @Wolle ist.

@fhirschmann Perfekt, das ist der relevante Teil:

Guru Meditation Error: Core  1 panic'ed (LoadStoreError). Exception was unhandled.

Backtrace: 0x400f1551:0x3ffd3070 0x400f15b5:0x3ffd3090 0x400f26ee:0x3ffd30b0 0x400f2c15:0x3ffd30d0 0x400e9dee:0x3ffd3110 0x400eaaed:0x3ffd3380 0x400eebb2:0x3ffd3600 0x400d4a66:0x3ffd3620 0x400992ba:0x3ffd3680
  #0  0x400f1551:0x3ffd3070 in RefillBitstreamCache() at .pio/libdeps/lolin_d32_pro_sdmmc_pe/ESP32-audioI2S-master/src/aac_decoder/aac_decoder.cpp:6538
  #1  0x400f15b5:0x3ffd3090 in GetBits(int) at .pio/libdeps/lolin_d32_pro_sdmmc_pe/ESP32-audioI2S-master/src/aac_decoder/aac_decoder.cpp:6538
  #2  0x400f26ee:0x3ffd30b0 in DecodeNextElement(unsigned char**, int*, int*) at .pio/libdeps/lolin_d32_pro_sdmmc_pe/ESP32-audioI2S-master/src/aac_decoder/aac_decoder.cpp:6538
  #3  0x400f2c15:0x3ffd30d0 in AACDecode(unsigned char*, int*, short*) at .pio/libdeps/lolin_d32_pro_sdmmc_pe/ESP32-audioI2S-master/src/aac_decoder/aac_decoder.cpp:6538
  #4  0x400e9dee:0x3ffd3110 in Audio::sendBytes(unsigned char*, unsigned int) at .pio/libdeps/lolin_d32_pro_sdmmc_pe/ESP32-audioI2S-master/src/Audio.cpp:4257
  #5  0x400eaaed:0x3ffd3380 in Audio::processLocalFile() at .pio/libdeps/lolin_d32_pro_sdmmc_pe/ESP32-audioI2S-master/src/Audio.cpp:4257
  #6  0x400eebb2:0x3ffd3600 in Audio::loop() at .pio/libdeps/lolin_d32_pro_sdmmc_pe/ESP32-audioI2S-master/src/Audio.cpp:4257
  #7  0x400d4a66:0x3ffd3620 in AudioPlayer_Task(void*) at src/AudioPlayer.cpp:796
  #8  0x400992ba:0x3ffd3680 in vPortTaskWrapper at /home/runner/work/esp32-arduino-lib-builder/esp32-arduino-lib-builder/esp-idf/components/freertos/port.c:355 (discriminator 1)

Den Aufrufstack zu lesen ist eigentlich relativ einfach, ich fange immer von unten an:
#7 ist das letzte was ESPuino noch macht. Danach taucht es in Audio-Bibliothek ab. Die unbehandelte Ausnahme passiiert dann tief in dieser Bibliothek. Man kann auch mit Strg+Klick direkt auf die Zeile springen wo die Ausnahme passiert ist.
Da dieses Problem außerhalb des ESPuino Codes liegt würde ich jetzt den Autor direkt anschreiben bzw. hier ein Issue aufmachen.
Evt. hilft es auch direkt das Audiofile anzuhängen falls rechtlich möglich, damit @Wolle das direkt nachvollziehen kann. Aber er liest hier auch immer mal mit und kann bestimmt sagen wie er es es am leichtesten verarbeiten kann, mit Bugfixes war er immer superschnell!

@biologist macht es nicht vielleicht Sinn den Exception-Monitor standardmässig zu aktivieren? Dann hätten wir schneller Angaben über Abstürze. Ich sehe da keine Nachteile bzgl. Performance…

Hmm, hast du es mal verglichen? Also es scheint auf jeden Fall das Binary zumindest nicht größer zu machen.

Ich kenne das so aus der Arduino Welt: Dort kann ich einen Absturzbericht mit dem Exception-Dekoder öffnen, die firmware.bin auswählen und bekomme den dekodierten Backtrace. Also Alles nach dem Kopilieren. In der Firmware scheinen also Debuginfos schon drin zu sein.

Der exception-decoder Arduino/PIO scheint daselbe oder das Gleiche zu sein :wink:

Ich verwende immer den Exception-Monitor und konnte bisher keine Nachteile wie z.B. Performance-Einschränkungen erkennen. Aber 100% kann ich das nicht beantworten :sunglasses:

1 „Gefällt mir“

Es sieht so aus, als wenn das connecttoFS() zu einem beliebigen Zeitpunkt aufgerufen wird und damit der laufende Prozess unterbrochen wird um ihn neu zu starten. Das funktioniert nur selten ohne Fehler. Die connecto… Sachen kann man eigentlich nur machen, wenn gerade nichts läuft oder wenn die Lib zum loop() zurückkehrt. Beispielsweise über ein Flag:

bool f_stop_und_start  = false;
...
f_stop_und_start = true  // ich möchte was anderes hören
...
loop(){
    if(f_stop_und_start){
        f_stop_und_start = false;
        connecttoFS(SD_MMC, "file1.mp3");
    }
...
}
2 „Gefällt mir“

Ok, wusste ich nicht.
Hmm, für die zweite Variante müsste ich ganz schön was umbauen. Ist jetzt die Frage, ob man für die erste Variante einfach vor connecttoFS() eben stopSong() aufrufen kann. Vielleicht ein paar ms delay() dazwischen.

Komisch, das war bisher kein Thema. Mein Beispiel würde sicher funkrionieren, aber wirklich gut ist es nicht. Ich schlage vor, die Lib „thread safe“ zu machen. Das wäre die einfachere Lösung. Einige Semaphore kann ich gerne mit einbauen, darf nur keine vergessen :grinning:

Ich habe einen Test-Branch erstellt der die „kritischen Bereiche“ schützt.

das ist
https://github.com/schreibfaul1/ESP32-audioI2S.git#18c3a70
Damit wird es (hoffentlich) keine weiteren Kollisionen geben

1 „Gefällt mir“

@Wolle Vielen Dank für deinen Support!
@fhirschmann Kannst du das in deinem Setting mal testen? Einfach in der platformio.ini den Link zur Audiolib derart modifizieren, dass dort der Link steht, den @Wolle gepostet hat.

Wow, vielen Dank für die schnelle Hilfe. Ich habe das eben ausprobiert, aber leider stürzt der ESPuino immer noch mit dem selben Fehler ab. Ich finde es sehr verwunderlich, dass dieses Problem bei euch bisher nicht aufgetreten ist.

Wenn du die Audiodatei zur Verfügung stellst, würde ich es bei mir testen. Ich verwende bisher ausschließlich MP3 Files.

Der Fehler im AAC Dekoder wird wohl die Ursache gewesen sein. Mit meiner Vermutung lag ich falsch. Ich habe mir den Audiotask angeguckt, alles sauber, Quereinsteiger haben keine Chance.
Aber mal eine Frage, ich habe eine noch SW Version vom Oktober im Einsatz. Wie spult man eigentlich vorwärts/rückwärts? Geht das über die Weboberfläche?

Über die Weboberfäche direkt als Button nicht. Aber du könntest eine Karte als Modifikationskarte anlernen und die springt dann (per Default) 30s nach vorne oder hinten. Das ist am einfachsten, dafür muss man nix kompilieren.
Oder du verwendest einen Button, dem du die Aktionen die passenden Aktionen zuweist:
Aktionen:

Hier den Buttons zuweisen:

Danke, werde demnächst mal testen mit der Modifikationskarte, Pins habe ich leider keine mehr frei :smiley:

Hallo nochmal,

Ich konnte mein Problem mit AAC dank @Wolle lösen, und der Fix ist auch schon in der Audiolib.

Weiterhin konnte ich auch die Ursache für die stotternde Wiedergabe von MP3 lösen: Das Cover Image war einfach zu groß (500kb). Nachdem ich das Image runterskaliert habe, trat kein Stottern mehr auf.

Viele Grüße

1 „Gefällt mir“