Ich hatte bei mir das Problem, dass beim abspielen mit verbundenen Bluetoothköpfhörern immernoch ganz kurze “Soundfetzen” des Playbacks aus dem Lautsprecher der Box kamen.
Nach kurzer Diskussion mit ClaudeAI war das die Antwort:
Wenn der BT-Source-Modus aktiv ist, wird der GPIO_PA_EN-Pin (der den SD/Shutdown-Pin des MAX98357A-Verstärkers steuert) nicht automatisch deaktiviert – anders als bei kabelgebundenen Kopfhörern, wo die HP_DETECT-Logik das korrekt übernimmt. Dadurch kommen kurze Audiofetzen durch den Lautsprecher durch.
Ursache im Code
In AudioPlayer.cpp schaltet ESPuino den PA via Port_Write(GPIO_PA_EN, false, true) stumm, sobald ein Kopfhörer am Klinkenstecker erkannt wird. Für den Bluetooth-Source-Modus fehlt diese Logik – der Verstärker bleibt aktiv und empfängt kurzzeitig I2S-Daten.”
In der Bluetooth.cpp, in der function void connection_state_changed, habe ich am Ende folgendes ergänzt. #ifdef GPIO_PA_EN
Port_Write(GPIO_PA_EN, !connected, true);
#endif
Das hat mein Problem behoben, allerdings sollte vielleicht nochmal jemand mit Ahnung von der Materie drüberschauen ob das die sinnvollste Lösung ist.
Das Problem kann ich bestätigen, das habe ich auch im anderen Thema angemerkt
[quote=„joker, post:4, topic:4291“]
Ich habe bloß beim Bluetoothkopfhörereinsatz, dass sporadisch kurze Artefakte über den Lautsprecher wiedergegeben werden. Ist das bei euch auch? Im Log sehe ich nix dazu.
[/quote]
Mit der Änderung ist bei mir auch die Artefakte weg.
Was mir aufgefallen ist, dass im Bluetoothmodus die Kopfhörerbuchse nicht funktioniert. Nach dem Einstecken wird der Ton kurz stumm geschalten und dann läuft der Lautsprecher weiter.
Damit das Läuft fehlt noch die Port.h. Meine Änderungen sind von Notepad mit grün neben der Zeilennummer markiert.
Klingt doch gut! Willst du einfach einen PR dazu erstellen? Sollte eigentlich keine Nachteile geben. Oder ist diese Änderung in irgendeinem Kontext kritisch?
Das kann ich gern machen. Mir ist aber noch ein Problem aufgefallen.
Mit der Zeile wird beim BT-Disconnect der Lautsprecher immer aktiviert – auch wenn ein Kabel-Kopfhörer steckt. Das schaue ich mir morgen mal an
Ruhig auch mal mit kabelgebunden Kopfhörern im Wechsel testen, da die Lösung von Claude dazu geführt hat, dass bei gesteckten Kopfhörer der Lautsprecher nicht mehr stumm geschaltet wurde.
Wow, das sind aber viele Änderungen! Für mich sieht es aus, als ob der Großteil davon gar nicht nötig wäre. Ging es nicht eigentlich um paar einzelne Zeilen? Was ist der Grund für diesen großen Umbau?
Kannst du auch nur die relevanten Änderungen in einen PR packen?
Auf die schnelle verstehe ich zumindest nicht direkt, was das mit den Sound-Artefakten zu tun hat
Nachdem man Kopfhörer per Bluetooth verbunden hat und Musik darüber abspielt kommen immer wieder kleine Artefakte aus dem Hauptlautsprecher (ähnlich wie blops wenn man einen Verstärker ohne Lautsprecherverzögerung einschaltet). Mich wundert, dass das Thema so wenig Resonanz erzeugt hat. Scheinbar nutzen nur wenige Bluetooth oder die Störsignale entstehen nicht bei jedem.
Mit dem Bugfix sollte das nicht mehr passieren.
Die Version von Claude war elegant aber hatte das Problem, dass per Kabel eingesteckte Kopfhörer nach dem Trennen von Bluetooth (Ausschalten der Bluetoothkopfhörer) ignoriert wurden - der Hauptlautsprecher wurde trotz eingesteckten Kopfhörer nicht stumm geschalten.
Deswegen diese Zeile AudioPlayer_SetupVolumeAndAmps();
Long Story Short - was sollte jetzt wie laufen:
Keine Artefakte aus dem Lautsprecher bei verbundenen Bluetoothkopfhörern
Sauberes Umschalten zwischen Lautsprecher, Kabel- und Bluetoothkopfhörer
@joker Vielen Dank für den fix. Ich habe kabelgebunden jetzt noch nicht getestet, aber die Artefakte bei Bluetooth-Wiedergabe hat es behoben.
Die Kinder scheinen sie nicht gestört zu haben, aber wenn ich dem Einen vorlese und der Andere mit Kopfhörern hört, war das gelegentliche - aber doch häufige - Knacken schon störend
So hab es endlich auch geschafft… Sorry, dass es so lange gedauert hat.
Konnte es genau wie beschrieben nachstellen. Ohne den Fix die Artefakte. Mit dem Fix nicht mehr.
Keine Probleme Außerhab des Bluetooth-Modus den Kopfhörer oder Lautsprecher weiter zu verwenden.
Daher @biologist, ist das meiner Meinung nach ein sehr guter fix. Fällt dir noch ein spezialfall ein, der überprüft werden müsste?
Aus dem Fix hat sich leider ein Problem ergeben: Durch die Referenzierung von GPIO_PA_EN schlägt das FW-Build für TTGO T8 und lolin_d32_pro fehl.
Bin gerade am Überlegen, wie man das sinnvoll fixen kann. Eine Möglichkeit wäre, die beiden HALs aus dem Buildprozess rauszunehmen - die werden in nennenswerter Anzahl vermutlich nicht verwendet. Andererseits entfernt man sich damit möglicherweise sukzessive von einem generischen ESPuino-Build (ich will ja niemand meine Hardware aufzwängen) - ohne es mitzukriegen.
Ein zusätzlicher GPIO ist bei diesen HALs leider nicht vorhanden. Aber man könnte das doch auch einfach invertierend zu HP_DETECT lösen, oder? Also GPIO_PA_EN rausnehmen und stattdessen !AudioPlayer_SetupVolumeAndAmps() reinnehmen. Oder zumindest halt HAL-abhängig so lösen.
Gut, dass wenigstens einer Überblick hat
Die HAL hatte ich nicht mehr im Blick
Hab mal auf die Schnelle ChatGPT gefragt.
Er hat vorgeschlagen das alles in der Audioplayer.cpp abzufackeln.
Das Läuft auf den ersten Blick - ich bin gerade zu Faul für einen PR bzw. die Zeit fehlt gerade dafür und zum genauen Check.
Als Diskussionsgrundlage die geänderten Dateien: src.zip (17,3 KB)
Bluetooth.cpp: setzt nur den Verbindungsstatus und ruft AudioPlayer_SetupVolumeAndAmps() auf
AudioPlayer.cpp: behandelt Bluetooth wie „virtuellen Kopfhörer“
Mein Vorschlag war natürlich Käse, wie ich gerade gemerkt habe. Die Funktion gibt ja gar nix zurück. Aber ich schätze mal, dass man mit HP_DETECT arbeiten könnte. So als ganz einfacher Fix. Aber ja, kann man auch anders machen.