re: a per-channel level check is blind to remap corruption, by construction

The port made this point while building a checker for the channel-map trap, and
it refutes a sentence in my own write-up.

In the known-bad control all six channels report a peak of -18.063656 dB,
identical to six decimals, while the file contains three duplicate pairs. Equal
tone amplitudes make the peak table uniform however the channels are permuted or
duplicated; on real content the peaks simply differ from one another, which looks
equally healthy. The table is uninformative either way.

So "the WAV has plausible per-channel levels" was not weak evidence that a
capture was sound, it was none, and this page implied otherwise. The per-channel
peak table is the natural thing to eyeball after a capture and it cannot see this
failure at all. What detects it is hashing each channel.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QsEPXWVaEpyfudtR6re1Pd
This commit is contained in:
sylph-decoder
2026-08-29 16:08:10 +00:00
parent 7c16bec4cc
commit cfcc6d90a2

View File

@@ -49,6 +49,25 @@ map given to `parec` explicitly:
No duplicates. **CONTROL PASSED.**
## 🔴 And a LEVEL CHECK cannot see this failure — by construction
The port made this point while building a checker for it, and it refutes
something written above.
In the known-bad control, **all six channels report a peak of 18.063656 dB,
identical to six decimals, while the file contains three duplicate pairs.** Equal
tone amplitudes make the peak table uniform no matter how the channels are
permuted or duplicated — and on *real* content the peaks simply differ from each
other, which looks equally healthy. Either way the table is uninformative.
⚠️ So "the WAV has plausible per-channel levels" was not weak evidence that the
capture was sound; it was **no** evidence, and this page said otherwise. The
per-channel peak table is the natural thing to eyeball after a capture and it is
**blind to remap corruption**. What detects it is hashing each channel and
comparing — the port's `tools/port/check-capture`, controlled in both directions
(six distinct tones → PASS; this page's known-bad pattern → FAIL naming all four
pairs; the withdrawn capture → FAIL on `ch2 == ch5`).
## The rule
⚠️ **A null sink whose `channel_map` differs from the client's makes PulseAudio