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:
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.
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?
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
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…
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
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
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:
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
@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.
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:
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.