Mute HyperX QuadCast S at logon and sync Windows mute to it

Sets the mic's own hardware mute (USB Audio SET_CUR mute on feature
unit 6, via IDeviceTopology/IAudioMute) when it appears, and follows its
05 10 xx HID mute reports to keep the Windows endpoint mute in step.
Includes build/install/uninstall scripts and a read-only HID listener.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
mangavalkandClaude Opus 5.5 committed 2026-11-01 23:10:45 +01:00
commit 3128ccd207
7 files changed
+614

No files matched your search

+87
View File
@@ -0,0 +1,87 @@
# quadcast-mute-sync
Makes a **HyperX QuadCast S** start **muted on the mic itself** (light off) every time you log in to Windows, and keeps the **Windows microphone mute in step** with the mic's tap-to-mute button.
HyperX NGENUITY has no "start muted" option, and the QuadCast S always powers up live. This small background app fixes both.
## What it does
| When | Mic (hardware) | Windows mic mute |
|---|---|---|
| You log in / the mic is plugged in | muted | on |
| You tap the mic to unmute | live | off |
| You tap the mic to mute | muted | on |
The sync is one-way, from the mic to Windows. Changing mute in Windows doesn't change the mic.
## Install
Requirements: Windows 10/11, a QuadCast S. No admin rights, no extra runtimes (it builds with the C# compiler that ships with Windows' .NET Framework 4).
```powershell
powershell -ExecutionPolicy Bypass -File .\install.ps1
```
This builds `bin\QuadCastMuteSync.exe`, copies it to `%USERPROFILE%\QuadCastMuteSync`, registers a per-user logon task named **QuadCastMuteSync**, and starts it right away. Pass `-InstallDir <folder>` to install somewhere else.
Uninstall:
```powershell
powershell -ExecutionPolicy Bypass -File .\uninstall.ps1
```
## Command line
```
QuadCastMuteSync.exe run # background mode (what the logon task runs)
QuadCastMuteSync.exe mute # mute mic + Windows now
QuadCastMuteSync.exe unmute # unmute mic + Windows now
QuadCastMuteSync.exe status # show Windows mute and the KS mute nodes
```
`run` writes a short log to `log.txt` next to the exe. It waits for the mic if it isn't connected yet, and mutes it again whenever it is reconnected, since the mic powers up live.
## How it works
Found by capturing the NGENUITY software with USBPcap + Wireshark while toggling mute.
The QuadCast S shows up as two USB devices:
| Device | Role |
|---|---|
| `03F0:0294` | USB Audio device (the microphone) |
| `03F0:028C` | Controller: RGB, plus a vendor HID collection that reports mute |
**Muting the mic.** NGENUITY sends a standard USB Audio Class request to the audio device:
```
bmRequestType 0x21 bRequest 0x01 (SET_CUR)
wValue 0x0100 (MUTE_CONTROL, channel 0) wIndex 0x0600 (feature unit 6, interface 0)
data 01 = mute, 00 = unmute
```
The mic's firmware treats this like a tap, so the light changes too. Windows' `usbaudio` driver exposes that feature unit as a KS *Mute* node (`.../00020006`), so the app sets it through Core Audio `IDeviceTopology` → `IAudioMute`. No driver, WinUSB or admin rights needed. The Windows endpoint mute (`IAudioEndpointVolume`) is a separate software mute, which is why Windows mute and the mic button normally don't follow each other.
**Reading the mic's state.** Every mute change, from a tap or from software, makes the controller send an 8-byte input report on its vendor collection (usage page `0xFFFF`):
```
05 10 01 ... mic is live
05 10 00 ... mic is muted
```
The app blocks on reads from that collection and sets the Windows endpoint mute to match.
## Limitations
- Only tested on the QuadCast S (`03F0:0294` / `03F0:028C`). The QuadCast 2 uses a different protocol.
- The KS node id `/00020006` is what Windows assigned on the test machine. If `status` lists different ids for you, pass the right suffix: `QuadCastMuteSync.exe run /000200xx`.
- If the mic shows up under a name without "QuadCast", the audio endpoint won't be found.
- After sleep/resume the mic usually keeps its state. If it comes back live, it's because the device re-enumerated, and the app mutes it again.
## Tools
`tools/hidlisten.ps1` is a read-only listener that prints every input report from HyperX (`VID 03F0`) HID interfaces. It's useful for checking the mute reports on another unit or model.
```powershell
powershell -ExecutionPolicy Bypass -File .\tools\hidlisten.ps1 -Seconds 30
```