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:
commit
3128ccd207
7 files changed
+614
No files matched your search
@@ -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
|
||||
```
|
||||
Reference in new issue
Block a user