Audio: robust rate estimation + color-coded log levels

Harden the guessed-stream sample-rate measurement that produced wrong rates
(e.g. 44100 read as ~46205). New rate_estimator.hpp measures over longer
~0.5 s windows, rejects any window that doesn't snap to a standard rate
(standard rates are >8% apart, so a quantization/burst error big enough to
miss one lands in no-man's-land, never on a wrong neighbour), and requires
consensus across windows before committing. If consensus isn't reached it
commits a low-confidence estimate (new AudioFormat_LowConfidence, shown red)
rather than spinning or publishing garbage. Pure logic, unit-tested with
adversarial cadences (rate_estimator_test) incl. the real 46205 bug value.

Add log severity levels: hook logw/loge set LogRecord.level; the host Log
window colors warnings amber and errors red. The low-confidence rate logs a
warning. Protocol -> v15 (new format states); also reserves AudioFormat_Override.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-22 01:11:06 +02:00
parent f72da74f78
commit cb6749b511
11 changed files with 462 additions and 102 deletions

View File

@@ -44,6 +44,10 @@ const char* audio_format_state_name(std::uint32_t state)
return "measuring rate...";
case AudioFormat_Measured:
return "measured rate (ch/bits assumed)";
case AudioFormat_LowConfidence:
return "LOW-CONFIDENCE rate (verify / override)";
case AudioFormat_Override:
return "manual override";
default:
return "unknown";
}
@@ -55,11 +59,12 @@ ImVec4 audio_format_state_color(std::uint32_t state)
{
case AudioFormat_Exact:
case AudioFormat_Measured:
case AudioFormat_Override:
return kGreen; // format trustworthy -> correct pitch
case AudioFormat_Measuring:
return kAmber; // still verifying the rate
default:
return kRed; // unknown
return kRed; // unknown or low-confidence -> needs attention
}
}