Audit your Windows audio setup before you hit record.
Half of all "my recording is ruined" posts are one of four settings. miccheck reads them all and tells you which one is about to bite you.
.\miccheck.ps1miccheck is read-only. It never writes a setting, so there is nothing to undo. It tells you exactly which box to untick and where to find it.
You can do everything else right and still end up with a ruined recording because of a setting you never knew existed:
- Your mic and speakers run at different sample rates. Windows resamples one of them in real time. Over a two-hour session that is the usual reason your audio slowly drifts out of sync with the video.
- Communications ducking. The moment any app opens the microphone — Discord, a browser tab, OBS itself — Windows drops every other sound by 80%. Your game audio goes quiet mid-recording and nothing on screen explains why. It is on by default.
- Driver "enhancements". Noise suppression, loudness equalisation and virtual surround are applied before OBS ever sees the signal. You cannot undo that in the edit.
- The mic was muted, or the default device is something you unplugged. Windows will happily keep a missing device as the default and record silence.
# audit everything
.\miccheck.ps1
# watch your microphone level live - speak and see the bar move
.\miccheck.ps1 -Meter
# include disabled and unplugged devices
.\miccheck.ps1 -All
# machine-readable
.\miccheck.ps1 -JsonWindows PowerShell 5.1 (ships with Windows 10/11) or PowerShell 7+. No dependencies, no installer, no network access, no admin rights. One file.
The live meter uses the audio API built into Windows. If that is unavailable
for any reason miccheck says so in one line and the rest of the report still
works, or you can pass -NoCom to skip it entirely.
| Option | Default | What it does |
|---|---|---|
-Meter |
off | Live input meter for the default microphone |
-Seconds |
8 |
How long the meter runs |
-All |
off | Include disabled, unplugged and absent devices |
-Json |
off | Emit the report as JSON |
-NoCom |
off | Registry only: skip default device, volume, mute and meter |
-RegistryRoot |
— | Testing hook: read endpoints from another registry path |
An actual run on the development machine:
miccheck v1.0.0
----------------------------------------------------------------
Playback
----------------------------------------------------------------
default Speakers - Realtek High Definition Audio(SST)
48000 Hz stereo 16-bit volume 80%
Recording
----------------------------------------------------------------
default Microphone Array - Realtek High Definition Audio(SST)
48000 Hz stereo 16-bit volume 92%
Checks
----------------------------------------------------------------
[ ok ] mic and speakers agree at 48000 Hz.
[ ok ] both default devices run at 48000 Hz, which is what video wants.
[ ok ] default microphone is not muted, level 92%.
[ ok ] both default devices are present and active.
[warn] communications ducking is set to "reduce other sounds by 80%".
that is the Windows default, so it is on unless you changed it.
the moment any app opens the microphone - Discord, a browser tab, OBS
itself - Windows drops everything else. Your game audio gets quieter
mid-recording and nothing on screen explains why.
Fix: Sound Control Panel > Communications > "Do nothing".
[warn] audio enhancements are not disabled on: Speakers, Microphone Array.
driver DSP - noise suppression, loudness equalisation, virtual surround -
is applied before OBS sees the signal, and you cannot undo it afterwards.
Fix: Sound Control Panel > device > Advanced > uncheck enhancements.
Summary
----------------------------------------------------------------
[warn] 2 thing(s) worth changing
- communications ducking is on (reduce other sounds by 80%)
- audio enhancements are active on a default device
miccheck only reads. Nothing was changed.
Both warnings are real. Neither is visible anywhere in the modern Settings app.
-Meter opens a real capture stream and shows the level of what the microphone
is actually hearing (trimmed):
Input meter
----------------------------------------------------------------
listening on the default microphone at 48000 Hz.
speak normally. Ctrl+C to stop early.
[............................................] 0.4% peak 0.9%
[##..........................................] 5.6% peak 5.6%
[####........................................] 8.6% peak 8.6%
[########....................................] 17.2% peak 17.2%
[###.........................................] 6.8% peak 17.2%
[ ok ] healthy level - peak 17.2%, average 2.0%.
It tells you whether the level is silent, too quiet, healthy or clipping, so you find out now rather than in the edit.
67 checks, all passing. The interesting ones:
Format parsing against known ground truth. Windows stores each endpoint's format as a binary blob. A synthetic registry tree was built containing blobs hand-written at rates chosen to be distinctive, and miccheck had to read back exactly what went in:
| Planted | miccheck read |
|---|---|
| 48000 Hz, 2ch, 16-bit | 48000 Hz, 2ch, 16-bit |
| 44100 Hz, 1ch, 16-bit | 44100 Hz, 1ch, 16-bit |
| 22050 Hz, 2ch, 8-bit | 22050 Hz, 2ch, 8-bit |
| 96000 Hz, 2ch, 24-bit | 96000 Hz, 2ch, 24-bit |
Device states (Active, Disabled, Unplugged) decoded correctly in the same
run, and the 44100/48000 pair was correctly reported as a mismatch.
The parser refuses to invent numbers. Inside the blob, nBlockAlign and
nAvgBytesPerSec are derived from the rate, channel count and bit depth, so
they can be used to check the parse. Blobs with a lying block alignment, a
lying byte rate, an absurd sample rate, or pure random bytes are all rejected
rather than reported as fact. A blob written without the usual header is
still parsed correctly, because the offset is detected rather than assumed.
Cross-checked against Windows itself. The active endpoint list was compared
with Get-PnpDevice -Class AudioEndpoint:
Windows (Get-PnpDevice, Status=OK) reports 2 endpoints:
Microphone Array (2- Realtek High Definition Audio(SST))
Speakers (2- Realtek High Definition Audio(SST))
miccheck reports 2 active endpoints:
Speakers [Active] 48000 Hz
Microphone Array [Active] 48000 Hz
Same count, same devices.
The meter measures real sound. A tone was generated at an amplitude of
exactly 0.10 and played back while sampling the output meter, which read
0.10004. For the microphone path, ambient room noise measured 0.079 and the
peak rose to 0.348 — a 4.4x jump — while a tone played through the speakers.
It does not cry wolf. A synthetic setup with both devices at 48000 Hz and no enhancements reported zero warnings and zero failures. A device with a missing or corrupt format blob is listed without a rate rather than crashing, and an empty endpoint tree prints one clean line instead of a stack trace.
-Jsonemitted invalid JSON on real hardware. OneWrite-Hostcall on the "this is the default device" branch bypassed the quiet check. Synthetic tests never hit it because nothing in a fake registry is ever the system default; only the cross-check against the real machine exposed it.- The meter reported 0.0% on a perfectly good microphone. Windows' endpoint meter only reports a level while some application is actively recording — with nothing recording it reads a flat zero. Left alone, miccheck would have told every user their mic was dead. It now opens its own capture stream and computes the peak from the audio samples themselves.
Does it change any of my settings? No. miccheck only reads. That is why there is no undo and no dry-run flag — there is nothing to undo.
Does the meter record me? It reads audio samples to measure loudness and throws them away immediately. Nothing is written to disk and nothing leaves your machine. The stream closes when the meter stops.
Why does it want 48000 Hz? OBS, ffmpeg and every common video container use 48 kHz. Anything else gets resampled on the way in, which costs a little quality for no benefit. 44.1 kHz is a music standard, not a video one.
Where is the Sound Control Panel?
Win+R, then mmsys.cpl. The modern Settings app does not expose ducking,
enhancements or per-device sample rate.
My mic and speakers disagree but audio seems fine. It often is, for short clips. The drift accumulates, so it shows up on long recordings and streams rather than a two-minute test.
It says enhancements are active but I never turned them on. Most Realtek and similar drivers ship with them on.
- obs-4k60-recorder — record 4K60 in OBS without dropped frames
- framecheck — diagnose a recording after the fact, including audio desync
- clipmine — find the loud moments in a recording and cut them out
- pathfix — audit and repair your Windows PATH
- gamemode — free up your machine before a session
- vidkit — trim, compress and convert without memorising ffmpeg
MIT — see LICENSE.