Connection monitoring for the beyerdynamic MMX 150 wireless headset dongle
README.md

mmx150d #

Connection monitoring for the beyerdynamic MMX 150 wireless headset dongle.

The daemon watches the headset link state over the dongle's vendor HID interface and runs shell commands when the headset connects or disconnects. Typical use: switch the default audio sink between the headset and monitor speakers as the headset powers on and off.

Usage #

Run mmx150d --help for the full, generated usage text.

mmx150d status

Prints connected or disconnected. Exit codes: 0 connected, 1 disconnected, 2 dongle missing or error.

mmx150d daemon [--on-connect CMD] [--on-disconnect CMD] [--interval SECS] [--no-initial]

Hooks run via sh -c with output discarded. At startup the daemon fires the hook matching the current state, unless --no-initial is given.

Example, switching the default sink with PipeWire:

mmx150d daemon \
  --on-connect 'wpctl set-default <mmx150-sink-id>' \
  --on-disconnect 'wpctl set-default <speakers-sink-id>'

Find sink ids with wpctl status.

How it works #

The dongle exposes a vendor HID interface (2e50:0035). Writing the 61-byte output report 0x3a (payload prefix 09 22 01) makes the dongle answer with an input report 0x3c, but only when the headset is linked. A query with no response within 400 ms therefore means the headset is off or out of range.

The daemon polls this once per interval (default 2 s). A disconnect needs two consecutive missed polls, so a single dropped radio packet does not cause a bogus state change.

Building #

Development uses devenv:

devenv shell cargo build
devenv shell cargo test

The binaries land at target/debug/mmx150d (status and daemon) and target/debug/mmx150-probe (protocol reverse-engineering tool).