Neuling braucht Hilfe ([mp3_decoder.cpp:1555] MP3Decoder_AllocateBuffers)

Hallo liebe Community,

Ein ESPUino-Neuling braucht eure Hilfe.

In den letzten zwei Jahren habe ich mehrfach die Boxen des TONUINO-Projektes gebaut.

Nun habe ich ESPUino entdeckt und bin sehr von den Funktionen und dem Projekt angetan.

Ich habe nun auf einem Breadboard zum Test folgende Hardware zusammengesteckt:

Lolin 32 (Aktuell ohne Batteriebetrieb)

RFID-RC522 (Karten werden problemlos gelesen)

Einen Micro-SD-Card Adapter von AZ-Delivery im SPI-Modus (Ein Adapter der MMC kann ist auf dem Weg, die SD-Karte wird ebenfalls gelesen)

1x MAX98357A

Die Umgebung (env) habe ich auf lolin32 geändert und alles soweit angepasst (Kein rotary encoder, keine Neopixel….)

Auf dem Webinterface kann ich eine RFID-Karte einer mp3-Datei (zum Test die einzige auf der Karte) zuweisen.

Möchte ich sie jedoch abspielen bekomme ich im Terminal:

I [24039] Partition nvs found, 262144 bytes
I [27813] RFID-Karte erkannt: a5-75-96-2d 
I [27813] RFID-Karte empfangen: 165117150045
I [27833] Freier Speicher: 44160 Bytes
N [27833] Playlist-Generierung
N [27834] Dateimodus erkannt.
N [27834] Modus: Einzelner Track
I [27845] Neue Playlist mit 1 Titel(n) empfangen
I [27853] info        : PSRAM not found, inputBufferSize: 14399 bytes
I [27854] info        : buffers freed, free Heap: 34156 bytes
I [27854] info        : Reading file: "/Test/01 Never Grow Old.mp3"
[ 27884][E][mp3_decoder.cpp:1555] MP3Decoder_AllocateBuffers(): not enough memory to allocate mp3decoder buffers
I [27884] info        : The MP3Decoder could not be initialized
I [27895] info        : Closing audio file
N [27895] Ende der Playlist erreicht.

Direkt nach dem Einschalten steht in der Info:

ESPuino Software-revision: 20231027-2
ESPuino Git-revision: unknown
Arduino Version: 2.0.11 (ESP-IDF 4.4.5)
Hardware: ESP32-D0WD-V3, Revision 3, CPU: 240 MHZ
Freier Heap: 46716 Bytes
Größter freier Heap-Block: 15860 Bytes
Freier PS-RAM:  Bytes
Aktuelle IP-Adresse: 192.168.1.149
WLAN Signalstärke: -69 dBm
Audio-Gesamtspielzeit seit 5.11.2023: 

Ich habe schon mehrfach alles geprüft. Auch mehrfach neu compiliert und geflasht.
Auch andere mp3s funktionieren einfach nicht.
Kann mir jemand sagen was ich falsch mache? Ich bin leider kein Programmiergenie.

Vielen lieben Dank

Geht’s um das „unknown“?
Falls ja: Ich gehe mal davon aus, dass du das Projekt als ZIP-File runtergeladen hast. Dann fehlen die ganzen GIT-Informationen.

PS-RAM hat dein Board keinen.
@tueddy Ich glaube das sollten wir abfangen, so dass da 0 Bytes steht oder wir lassen die Zeile in dem Falle gleich ganz weg.

Danke für deine Antwort.
Das dort unknown steht war mir bislang nicht als Problem in’s Auge gefallen.

Das Problem ist, das er nicht abspielen möchte mit dem Fehler:

[ 27884][E][mp3_decoder.cpp:1555] MP3Decoder_AllocateBuffers(): not enough memory to allocate mp3decoder buffers
I [27884] info        : The MP3Decoder could not be initialized

Ich bin mir sicher ich übersehe nur etwas, aber was?

Ach sorry, das ist mir gar nicht aufgefallen.
Hast du an der settings.h Änderungen vorgenommen? Wenn nein, dann könntest du mal testen, ob das Weglassen von Optionen dort das Ganze besser macht.

Es ist so, dass wir ESP32-technisch Module mit PSRAM haben (WROVER) und solche wie deines (WROOM). Am Anfang bin ich auch mit Lolin32 gestartet, aber inzwischen arbeiten hier gut (schätzungsweise) 90 bis 95 % der Leute mit WROVER und da ist das ggf. nicht aufgefallen.

Hat man PSRAM, dann können Teile, die sonst im „normalen“ RAM des uC gespeichert werden, dorthin ausgelagert werden.

Ich habe soeben zum Test alle Module deaktiviert bis auf:
MDNS_ENABLE
LANGUAGE DE
VOLUMECURVE 0

Das hat es noch schlimmer gemacht. Jetzt kommt direkt bei Starten:

E (4803) MDNS: Cannot allocate memory (line: 1388, free heap: 136 bytes)
E (5103) MDNS: Cannot allocate memory (line: 1388, free heap: 136 bytes)
E (5403) MDNS: Cannot allocate memory (line: 1388, free heap: 136 bytes)
E (5703) MDNS: Cannot allocate memory (line: 1388, free heap: 136 bytes)
E (6003) MDNS: Cannot allocate memory (line: 1388, free heap: 136 bytes)
[  3432][E][WiFiGeneric.cpp:321] postArduinoEvent(): Arduino Event Malloc Failed!
E (6303) MDNS: Cannot allocate memory (line: 1388, free heap: 136 bytes)
E (6603) MDNS: Cannot allocate memory (line: 1388, free heap: 136 bytes)
E (6903) MDNS: Cannot allocate memory (line: 1388, free heap: 136 bytes)
E (7203) MDNS: Cannot allocate memory (line: 1388, free heap: 136 bytes)
E (7503) MDNS: Cannot allocate memory (line: 1388, free heap: 136 bytes)
E (7803) MDNS: Cannot allocate memory (line: 1388, free heap: 136 bytes)
E (8103) MDNS: Cannot allocate memory (line: 1388, free heap: 136 bytes)
E (8403) MDNS: Cannot allocate memory (line: 1388, free heap: 136 bytes)
E (8703) MDNS: Cannot allocate memory (line: 1388, free heap: 136 bytes)
E (9003) MDNS: Cannot allocate memory (line: 1409, free heap: 224 bytes)
E (9303) MDNS: Cannot allocate memory (line: 1409, free heap: 224 bytes)

Hmm, also ehrlich gesagt bin ich bisschen überrascht.
Also ich meine demletzt hat wer gepostet, dass er ESPuino mit Arduino2 auf einem Lolin32 mit SD via SPI erfolgreich zum Laufen gebracht hatte.

Edit: Ach nee, das war ein Lolin D32 pro.

Bin jetzt auch überrascht aber es scheint nicht genügend Speicher zur Verfügung zu stehen. 46716 Bytes freier Heap ist schon sehr wenig!
@Mike_i386 Du musst wohl einige Features in settings.h deaktivieren, insbesondere
// #define BLUETOOTH_ENABLE
// #define MDNS_ENABLE

Klappt es dann?
@biologist Die Log-Ausgabe bei fehlenden PSRAM schaue ich mir an

Ich habe nun alles deaktiviert bis auf:
#define LANGUAGE DE
#define VOLUMECURVE 0

Weiterhin:

I [8386] Neue Playlist mit 1 Titel(n) empfangen
I [8396] Free heap: 55788
I [8404] info        : buffers freed, free Heap: 55788 bytes
I [8404] info        : Reading file: "/Test/01 Never Grow Old.mp3"
[  8423][E][mp3_decoder.cpp:1555] MP3Decoder_AllocateBuffers(): not enough memory to allocate mp3decoder buffers
I [8423] info        : The MP3Decoder could not be initialized
I [8434] info        : Closing audio file
N [8434] Ende der Playlist erreicht.

:man_shrugging:

Habe grad’ mal einen Lolin 32 Lite angeschlossen (ohne SD, mit Standard Settings):

D [526] Freier Heap-Speicher nach Setup-Routine: 114252
D [526] PSRAM: 0 bytes
D [527] Flash-size: 4194304 bytes

Dann Uhrzeitansage in Weboberfläche:

I [155174] info        : PSRAM not found, inputBufferSize: 14399 bytes
I [155175] info        : buffers freed, free Heap: 61572 bytes
I [155423] info        : chunked data transfer
I [155433] info        : MP3Decoder has been initialized, free Heap: 31936 bytes , free stack 3336 DWORDs
I [155433] lasthost    : Es ist 10:51 Uhr

Mehr kann ich da nicht testen ohne SD-Karte…

Hast Du dieses Profil aktiv?

grafik

Ich habe „env:lolin32 (ESPuino-master)“ aktiviert.

Ich kann es gerne gegen-testen indem ich SD deaktiviere und die log-ausgabe ansehe. (#define NO_SDCARD)

Hier die Ausgabe mit

#define NO_SDCARD
N [154] Software-revision: 20231027-2
N [154] Git-revision: unknown
I [164] Arduino version: 2.0.11
I [165] ESP-IDF version: 4.4.5
I [165] Wakeup was not caused by deepsleep: 0
N [165] Versuche SD-Karte im SPI-Modus zu mounten...
I [175] SD card type: UNKNOWN
I [175] SD-Kartengröße / freier Speicherplatz: 0 MB / 0 MB
I [187] FTP-User wurde aus NVS geladen: esp32
I [188] FTP-Passwort wurde aus NVS geladen: esp32
                                                                                                                                                                                     E (184) gpio: GPIO can only be used as input mode
[   190][E][esp32-hal-gpio.c:130] __pinMode(): GPIO config failed
N [295] RFID-Tags koennen jetzt gescannt werden...
I [296] Hostname aus NVS geladen: ESPuino
I [298] SSID 0 von NVS geladen: C= C64 Arpanet 2,4|5Ghz
I [500] Versuche mit WLAN 'C= C64 Arpanet 2,4|5Ghz' zu verbinden...
I [544] Freier Heap-Speicher nach Setup-Routine: 112800
                                                                                                                                                                                                                          I [544] PSRAM: 0 bytes                                                                                                                                                                                                                                              I [544] Flash-size: 4194304 bytes
N [1753] HTTP-Server gestartet.
I [1760] Verbunden mit WLAN 'C= C64 Arpanet 2,4|5Ghz' (Signalstärke: -71 dBm, Kanal: 5, MAC-Adresse: 50:E6:36:63:30:91)
I [1760] Aktuelle IP: 192.168.1.149
N [1771] Synchronisiere Uhrzeit via NTP...
N [5949] Datum/Uhrzeit empfangen von NTP-Server: 08.11.2023, 11:11:18

NACHTRAG:

Möchte ich nun auf das Webinterface passiert nichts und es heißt im Log:

I [77402] ws[/ws][2] connect
[ 77438][E][vfs_api.cpp:24] open(): File system is not mounted
N [77438] Öffnen des Verzeichnisses fehlgeschlagen
[ 80541][E][vfs_api.cpp:24] open(): File system is not mounted
N [80541] Öffnen des Verzeichnisses fehlgeschlagen
[ 84036][E][vfs_api.cpp:24] open(): File system is not mounted
N [84037] Öffnen des Verzeichnisses fehlgeschlagen

Du müsstest auf die Weboberfläche kommen und kannst hier mal testweise Audio ausgeben:

Nach einigen Experimenten und Gegenproben konnte ich nun folgendes Verhalten feststellen:

Compiliere ich OHNE SD-Unterstüzung funktioniert es. Ich kann die Uhrzeit durchsagen lassen.

Compiliere ich dann MIT SD-Unterstüzung bekomme ich wieder das alte Problem mit dem Speicher.

Ich konnte OHNE SD-Unterstüzung sogar eine MP3 von meinem Privaten Webserver abspielen. Jedoch Stürzt das Webinterface ab, sobald ich versuche etwas zu ändern wie beispielsweise die Lautstärke. Danach kommt bis zum Neustart der Fehler das nicht genügen Speicher vorhanden ist.

Also auf die Schnelle kannst du da nur auf den Branch „Arduino1“ gehen und es mal testen. Wenn das nicht geht, dann musst du auf einen Stand vom Dezember 2022 zurück oder halt dazwischen mal ein paar Software-Stände testen. Es könnte dann aber sein, dass du wegen Änderungen in der Audio-Lib, die zuweilen zu Knacksen führt, auf einen älteren Stand der Audio-Lib zurück musst.

Das ist generell übrigens auch mal jetzt schon ein Versuch wert: Du gehst bei der Audio-Lib mal auf einen älteren Stand - ggf reduziert das den Speicherverbrauch (entfernt allerdings auch Bugfixes, die es seitdem gab):

Gehe dazu in die platformio.ini und ändere https://github.com/schreibfaul1/ESP32-audioI2S.git#2ef8cf7 z.B. durch https://github.com/schreibfaul1/ESP32-audioI2S.git#4baa52b. Kompiliere neu und lade es hoch.

Disclaimer:
Wobei wenn es knackst du halt nie so genau weißt, ob das jetzt ein Software-Problem ist oder der fliegende Aufbau auf deinem Steckbrett.

Eine Sache ist mir noch eingefallen: Inzwischen kompilieren wir Arduino als Komponente. Man könnte über menuconfig ggf. noch ein bisschen tweaken. Ich weiß allerdings nicht, ob das wirklich zu mehr Heap führt. Und, klar, das ist schon ziemlich lowlevel, was man da einstellt; nicht ganz einfach.

Für die Audio-Bibliothek wird der Heap-Speicherverbrauch mit 6.25KBytes angegeben:

Das scheint aber seit einiger Zeit deutlich mehr zu sein:

I [20596] info        : PSRAM not found, inputBufferSize: 14399 bytes

Vielleicht kann @wolle etwas dazu sagen?

Ber der Erzeugung der audio-Objekts wird zunächst das PSRAM initialisiert. Das ist unschädlich, denn nicht immer macht es das Hauptprogramm. Ist PSRAM verfügbar, wird alles was geht und sinnvoll erscheint ins PSRAM verlagert. Das betrifft die Dekoder und auch den InputBuffer. Bei großen Projekten, wie ESPuino ist die Verwendungs eines ESP32 mit PSRAM zu empfehlen.

Ich klink mich mal ein. Hab das selbe Problem mit einem Lolin D32.

D [596] Freier Heap-Speicher nach Setup-Routine: 103424
D [596] PSRAM: --
D [597] Flash-size: 4194304 bytes

Lustigerweise hat das heut schon mal mit der gleichen Firmware und der selben Datei(!) funktioniert. Hab jetzt Bluetooth und MDNS zusätzlich deaktiviert und bekomme trotzdem:

N [109254] Neue Playlist mit 1 Titel(n) empfangen
D [109256] Free heap: 74236
I [109261] info        : PSRAM not found, inputBufferSize: 13951 bytes
I [109262] info        : buffers freed, free Heap: 59120 bytes
I [109273] info        : Reading file: "/Vorlesen/Buch/Datei.mp3"
[109296][E][mp3_decoder.cpp:1555] MP3Decoder_AllocateBuffers(): not enough memory to allocate mp3decoder buffers
I [109296] info        : The MP3Decoder could not be initialized
I [109307] info        : Closing audio file
N [109308] Ende der Playlist erreicht.

und der neue dev branch hat das Problem behoben. Danke! (im anderen Thread gespickelt)