Soundfetzen aus Lautsprecher bei verbundenen Bluetoothkopfhörern

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.

Vielen Dank für das tolle Projekt.

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]

@tueddy kannst du dir das mal bitte anschauen?

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

Whoop whoop…mein erster Pullrequest - ich hab es doch noch auf die Kette bekommen

Wer testet es?

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 :slight_smile:

ne, das sind auch nur 7 Zeilen in der bluetooth.cpp…da habe ich mich wohl bei git verrannt. Ich schaue dann mal.

Danke aber, dass du dich scheinbar bereit erklärt hast das zu testen :slight_smile:

Danke nochmal für den Hinweis.

Ich habe den alten PR jetzt geschlossen und einen neuen PR aufgemacht.

Top. Kannst du noch kurz eine Anleitung zur Verfügung stellen, wie man den Fehler reproduzieren kann? Dann kann ich es die Tage mal testen…

Der Bug verhält es sich wie folgt:

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.:man_shrugging:

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 :smiley:

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?

Ok, dann merge ich das morgen mal und habe selbst keine Anmerkungen dazu.

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 :slight_smile:
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.

Ich habe einen neuen PR zu dem Thema erstellt

  • die Kopfhörer/Lautsprecher-Unterscheidung findet jetzt in der Audioplayer.cpp statt
  • TTGOT8 konnte ich bauen
  • die Artefakte kommen nicht durch
  • ein wildes Spiel mit Bluetooth-Kopfhörer und Kabelkopfhörer hat keine Probleme verursacht

Bitte ausprobieren, gern auch einen Codereview machen und wenn nötig bin ich auch für Verbesserungen offen :slight_smile:

Bug fix: Suppression of sound artifacts on the speaker during Bluetooth playback - Secound Edition by joker-mik · Pull Request #402 · biologist79/ESPuino