Reverse-engineered from Maono Link 4.0.88 (DGM20_OLD.dll) and verified against a DGM20 (352f:0105, firmware 2.1.2). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2.4 KiB
dgm20-linux
Control the Maono DGM20 USB microphone on Linux. Maono Link only runs on Windows and macOS; this covers the same settings with a local web page and a command-line tool.
- Noise cancellation on/off and strength
- Vocal enhancement
- Hear yourself (headphone monitoring)
- Mute, kept in sync with the mic's touch pad
- RGB ring brightness
- Factory reset
Pure Python 3.9+, no dependencies. Nothing leaves your machine: the page is served from localhost and loads no external fonts or scripts.
Unofficial. Not affiliated with or endorsed by Maono. Tested on a DGM20 with USB ID
352f:0105, firmware 2.1.2. Newer DGM20 revisions (352f:0112) and the DGM20G/DGM20W use different firmware and are not supported yet.
Install
pipx install git+https://git.reiners.dev/ReinersCloudConsulting/dgm20-linux.git
# or, from a checkout
pipx install .
Let your user reach the mic without root, then unplug and replug it:
sudo cp udev/70-maono-dgm20.rules /etc/udev/rules.d/
sudo udevadm control --reload && sudo udevadm trigger
The rule grants access to the logged-in desktop user (uaccess) and to the wheel group, which
covers ssh sessions. Change the group if your distro uses a different one.
Use
dgm20-web --open # control page at http://localhost:8720
dgm20ctl # show settings
dgm20ctl set nc on nc-level 80 enhance off
dgm20ctl watch # print changes made on the mic itself
dgm20ctl factory-reset --yes
To keep the page running in the background:
cp contrib/dgm20-web.service ~/.config/systemd/user/
systemctl --user enable --now dgm20-web
dgm20-web only listens on localhost. --host 0.0.0.0 makes it reachable from your network, and
anyone on that network can then change your mic settings, because there is no login.
Input gain and headphone volume are standard USB audio controls. Set them in your desktop's sound
settings, pavucontrol or alsamixer. The mic does not expose them on its control channel.
How it works
The settings were found by reading Maono Link's DGM20 plugin. See PROTOCOL.md for
the packet format and register map. dgm20ctl raw gives direct register access if you want to
explore.
Development
PYTHONPATH=src python3 -m unittest discover -s tests
PYTHONPATH=src python3 -m dgm20.web
License
MIT
