Skip to content
appsmypassPublic

About

Audit your Windows audio setup before you hit record. Finds sample-rate mismatches that drift audio out of sync, muted or quiet mics, and the communications ducking setting that silently drops your game audio by 80% mid-recording. Read-only, with a live input meter.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

 

History

1 Commit

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 

Repository files navigation

miccheck

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.ps1

miccheck 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.


Why this exists

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.

Quick start

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

Requirements

Windows 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.

Options

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

Real output

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.

The meter

-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.

How it was tested

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.

Two bugs this testing caught

  • -Json emitted invalid JSON on real hardware. One Write-Host call 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.

FAQ

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.

See also

  • 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

License

MIT — see LICENSE.

About

Audit your Windows audio setup before you hit record. Finds sample-rate mismatches that drift audio out of sync, muted or quiet mics, and the communications ducking setting that silently drops your game audio by 80% mid-recording. Read-only, with a live input meter.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages