# 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 ` 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 ```