Add native Linux controls and tray menu for BTD 700
This commit is contained in:
@@ -0,0 +1,148 @@
|
||||
# BTD 700 Control für Linux
|
||||
|
||||
Native GTK-4-App zur Steuerung des **Sennheiser BTD 700**, mit einem Menü im
|
||||
Infobereich von GNOME/KDE. Eigenständige Implementierung des HID-Steuerprotokolls,
|
||||
analysiert anhand der offiziellen Windows-Anwendung **Dongle Control 1.0.5**.
|
||||
|
||||
**Keine Firmware-Updates, Firmware-Downloads oder Update-Schnittstellen.** Die App
|
||||
benötigt weder Windows/Wine noch eine Netzwerkverbindung. Sennheiser-Programmcode,
|
||||
Logos und Firmware werden nicht mitgeliefert. Dies ist ein unabhängiges Projekt.
|
||||
|
||||
## Starten
|
||||
|
||||
```bash
|
||||
./run.sh
|
||||
```
|
||||
|
||||
Das Fenster zeigt den echten Dongle-Status. Beim Schließen bleibt die App im
|
||||
Infobereich aktiv. „Beenden“ im Symbolmenü oder das Beenden-Symbol im Fenster
|
||||
beendet die App vollständig. Wenn der Desktop keinen Infobereich anbietet,
|
||||
beendet das Schließen des Fensters die App.
|
||||
|
||||
```bash
|
||||
python3 install.py # Anwendungsmenü-Eintrag für diesen Projektordner
|
||||
./run.sh --background # Nur im Infobereich starten
|
||||
./run.sh --demo # Simulierter Dongle, keinerlei USB-Zugriff
|
||||
```
|
||||
|
||||
Den Projektordner nach der Installation behalten. „Beim Anmelden starten“ in der
|
||||
App aktiviert bei Bedarf den Autostart im Infobereich. Er ist standardmäßig aus.
|
||||
|
||||
## Steuerung
|
||||
|
||||
- **Standard / Gaming / Auracast** direkt im Fenster oder Symbolmenü wählen.
|
||||
- Aktiven **Codec, Auflösung, Abtastrate und Verbindungsstatus** ablesen.
|
||||
- **Codecs** auswählen, die der Dongle für die aktuelle Verbindung meldet.
|
||||
Die Auswahl steht im Standard-Modus zur Verfügung; Gaming setzt seinen Codec selbst.
|
||||
- **Bluetooth Classic / LE Audio / Automatisch** auswählen, entsprechend den
|
||||
vom angeschlossenen Kopfhörer gemeldeten Möglichkeiten.
|
||||
- Bereits gekoppelte Kopfhörer **verbinden / trennen**.
|
||||
- **Auracast:** Name, Passwortschutz, öffentliche Auffindbarkeit und Qualität.
|
||||
Das Symbolmenü bietet Schalter und Untermenüs; für Name/Passwort öffnet es die Eingabe im Fenster.
|
||||
- **Werkseinstellungen** nur nach ausdrücklicher Bestätigung im Dialog. Dabei
|
||||
werden die Kopplungen gelöscht. Die App führt niemals automatisch einen Reset aus.
|
||||
|
||||
Das Passwort wird verdeckt eingegeben und weder gespeichert noch protokolliert.
|
||||
Ein leeres Passwortfeld behält das bisherige Passwort; „Passwortschutz“ ausschalten
|
||||
sendet ohne Passwortschutz. Der Name erlaubt 4–16 ASCII-Buchstaben/Ziffern mit
|
||||
inneren Leerzeichen; ein leerer Name stellt den Gerätenamen wieder her. Passwörter
|
||||
verwenden 4–16 ASCII-Buchstaben/Ziffern, entsprechend den Original-Eingabegrenzen.
|
||||
|
||||
**„Öffentlich auffindbar“ ist die Auracast-Ankündigung, kein Ein/Aus-Schalter für
|
||||
Audio.** Zum Starten/Beenden der Übertragung den Audiomodus umstellen.
|
||||
Die angezeigten Bit-/kHz-Werte stammen vom Dongle. Die USB-Abtastrate wird vom
|
||||
Audiosystem (z. B. PipeWire) bestimmt und ist kein hier nachgewiesener Stellbefehl.
|
||||
Koppeln erfolgt über die Taste am Dongle; „Verbinden“ versucht die bestehende Kopplung.
|
||||
|
||||
## Voraussetzungen
|
||||
|
||||
Python ≥ 3.10, PyGObject, GTK ≥ 4.10, libadwaita ≥ 1.5 und libdbusmenu mit
|
||||
GObject-Introspection. Auf dem hier verwendeten Bazzite sind die benötigten
|
||||
Bibliotheken bereits vorhanden; keine zusätzlichen Pakete waren erforderlich.
|
||||
|
||||
Für andere Systeme typischerweise:
|
||||
|
||||
```bash
|
||||
# Fedora (klassisch, veränderliches System)
|
||||
sudo dnf install python3-gobject gtk4 libadwaita libdbusmenu
|
||||
|
||||
# Debian / Ubuntu
|
||||
sudo apt install python3-gi gir1.2-gtk-4.0 gir1.2-adw-1 gir1.2-dbusmenu-glib-0.4
|
||||
```
|
||||
|
||||
Auf GNOME muss der Desktop StatusNotifier/AppIndicator-Symbole unterstützen;
|
||||
beispielsweise mit „AppIndicator and KStatusNotifierItem Support“. Auf dem
|
||||
getesteten GNOME ist derselbe Dienst bereits für JetBrains Toolbox und andere Apps aktiv.
|
||||
KDE stellt diese Schnittstelle über seinen Infobereich bereit.
|
||||
|
||||
Fehlt die Menü-Bibliothek, bleibt das Fenster nutzbar. Das Terminalinterface
|
||||
benötigt ausschließlich die Python-Standardbibliothek.
|
||||
|
||||
## USB-Zugriff
|
||||
|
||||
Es wird ausschließlich die passende HID-Steuerschnittstelle des Geräts
|
||||
`3542:3001` geöffnet, identifiziert über ihren Report-Deskriptor. Die zweite
|
||||
Schnittstelle für Updates bleibt geschlossen. Audiotreiber werden nicht getrennt.
|
||||
|
||||
Falls die App fehlende Berechtigungen meldet:
|
||||
|
||||
```bash
|
||||
sudo install -m 0644 packaging/70-btd700-control.rules /etc/udev/rules.d/70-btd700-control.rules
|
||||
sudo udevadm control --reload-rules
|
||||
```
|
||||
|
||||
Anschließend den Dongle aus- und wieder einstecken. Die Regel beschränkt den Zugriff
|
||||
auf die Steuerungsschnittstelle und den aktiven lokalen Benutzer. Die App nicht
|
||||
als root starten. Auf dem getesteten System ist bereits Zugriff vorhanden.
|
||||
|
||||
## Terminal
|
||||
|
||||
```bash
|
||||
./run.sh devices
|
||||
./run.sh status
|
||||
./run.sh mode standard
|
||||
./run.sh mode gaming
|
||||
./run.sh mode standard --transport auto
|
||||
./run.sh codec adaptive
|
||||
./run.sh disconnect
|
||||
./run.sh connect
|
||||
./run.sh auracast --name 'Wohnzimmer' --quality high --public on
|
||||
./run.sh auracast --password --encryption on # Passwort verdeckt abfragen
|
||||
./run.sh mode auracast
|
||||
```
|
||||
|
||||
`status` gibt JSON aus und liest kein Passwort. Nur eine Instanz darf den Dongle
|
||||
halten: Vor CLI-Befehlen eine laufende GUI über „Beenden“ schließen. Mehrere Dongles
|
||||
lassen sich mit `--device /dev/hidrawN` vor dem Unterbefehl auswählen.
|
||||
|
||||
## Verifikation
|
||||
|
||||
```bash
|
||||
python3 -m unittest discover -s tests -v
|
||||
python3 tools/check_gui.py
|
||||
```
|
||||
|
||||
`check_gui.py` verwendet **ausschließlich einen simulierten Dongle**, öffnet eine
|
||||
Demo-Oberfläche in der bestehenden Sitzung und prüft die Menüaktionen über den
|
||||
echten D-Bus-Menüexport. Es speichert Fensterbilder unter `/tmp/btd700-gui-test*.png`.
|
||||
|
||||
Nachgewiesen am angeschlossenen BTD 700 mit Firmware **3.11.0**:
|
||||
|
||||
- Erkennung und Öffnen der korrekten HID-Schnittstelle ohne Treiberwechsel.
|
||||
- Echte Antworten auf Status-, Modus-, Codec-, Audioqualitäts-, LE-Zustands-,
|
||||
Transport-, Auracast-Konfigurations-, Namens- und Firmwareversionsabfragen.
|
||||
- Anzeige im GTK-Fenster und Registrierung im GNOME-Infobereich.
|
||||
|
||||
Schreibbefehle wurden aus der Originalsoftware rekonstruiert und in Simulation
|
||||
geprüft. Der Nutzer hat die Funktion der App am eigenen Dongle bestätigt. Eine
|
||||
Aufschlüsselung aller dabei getesteten Funktionen liegt nicht vor; der automatisierte
|
||||
Hardware-Umschalttest wurde bisher nicht ausgeführt.
|
||||
|
||||
Das vorbereitete `tools/check_hardware.py --run` schaltet Modi und Codec um,
|
||||
prüft Auracast-Werte und versucht anschließend die gesicherten Originalwerte
|
||||
wiederherzustellen. Es führt weder Firmware-Updates noch einen Werksreset aus.
|
||||
Den Hardwaretest nur bewusst starten: Er unterbricht kurz die Audiowiedergabe
|
||||
und verändert vorübergehend gespeicherte Einstellungen einschließlich des Passworts. Bei USB-Trennung während
|
||||
einer Änderung ist eine Wiederherstellung nicht garantiert.
|
||||
|
||||
Protokoll, Herkunft und bekannte Grenzen: [docs/PROTOCOL.md](docs/PROTOCOL.md).
|
||||
Reference in New Issue
Block a user