Add Elgato Wave:3 support#3
Open
AlexDicy wants to merge 5 commits into
Open
Conversation
Device layer now picks a per-model DeviceProfile (profiles.py); the XLR profile carries the old device.py constants unchanged, connect() takes the first supported model found. Wave:3 vendor protocol mapped on hardware — same 0x85/0x05 transfers and wIndex 0x3303, different blocks: 16-byte config with gain uint16 Q8.8 dB @0 (max 0x2800), mute @4, HP volume int16 Q8.8 @7, monitor mix uint16 Q8.8 percent @10 (0..0x6400), dial mode @12 (1=gain 2=hp 3=mix); 8-byte meters; fw version @21-23 and serial @36-47 in devinfo. ALSA numids/ranges match the XLR, so the firmware<->ALSA sync carries over as-is. probe.py (dump/watch/poke) is the CLI the mapping was done with. UI adapts to the connected profile: gain shown in dB, low-Z row hidden, monitor mix slider, dial-mode label. udev rule now covers both PIDs and setup re-runs when installed rules/configs are stale. Daemon keepalive, mixer node lookup and the WirePlumber rule match the shared Elgato_Wave_ prefix. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Hello there! Thank you for this awesome project, really really useful as I just started out with CachyOS and it's a pain to use the Elgato Wave 3 with linux.
I did create most of the code changes using Claude Code, but I manually reviewed every patch and adjusted where needed. Feel free to change as needed but I hope this PR proves useful.
I tested changing gain, volume, mix and mute status from the OpenWave UI, physically from the microphone, and from the OS's volumes panel. They're all synchronized (as long as OpenWave is running, at least minimized).
Volume restore also seems to be working as expected (OpenWave sends the gain/volume to ALSA, WirePlumber/PipeWire recognizes it, at reboot it sets it back as expected).
Feel free to edit/override as you see fit.
Now to the full description:
OpenWave supports the Wave XLR (
0fd9:007d). This PR adds support for the Wave:3 microphone (0fd9:0070): gain, mute, headphone volume, monitor mix, dial-mode display, bidirectional hardware ↔ OS volume sync, the capture-fix daemon, and first-run setup.Approach
The Wave:3 speaks the same vendor protocol as the XLR (control transfers via the unclaimed vendor interface,
wIndex=0x3303), but with a different config-block layout. All device-specific constants were moved into per-model profiles (wavexlr/profiles.py);device.pyis parameterized by profile and connects to the first supported device it finds (one device at a time). The Wave XLR profile reproduces the previously hardcoded constants 1:1, so XLR behavior is unchanged.The Wave:3 layout was reverse-engineered and verified on hardware (fw 1.2.2) — 16-byte config block:
The UI adapts to the connected model's capabilities: monitor-mix slider (Wave:3), low-impedance toggle (XLR only), gain shown in dB where the firmware works in dB. The probe CLI used for the mapping (
python3 -m wavexlr.probe—dump/watch/poke) is included to make supporting future devices easier.Also in this PR
Elgato_Wave_prefixMic Capture Volumecontrol, so desktop volume panels follow the physical dial (the XLR exposes no ALSA gain control)openwave-autostart.desktoptemplate (installed toshare/openwave/, opt-in via~/.config/autostart/)--hide, not-- --hide— GLib treats--as end-of-options, so the documented form never workedNotes