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:
@@ -69,19 +69,31 @@ void set_log_ring(coop::LogRing* ring)
|
||||
g_log_ring.store(ring, std::memory_order_release);
|
||||
}
|
||||
|
||||
void logf(const char* fmt, ...)
|
||||
namespace
|
||||
{
|
||||
const char* level_tag(std::uint32_t level)
|
||||
{
|
||||
switch (level)
|
||||
{
|
||||
case coop::LogLevel_Warn:
|
||||
return "WARN ";
|
||||
case coop::LogLevel_Error:
|
||||
return "ERROR";
|
||||
default:
|
||||
return "info ";
|
||||
}
|
||||
}
|
||||
|
||||
void vlog(std::uint32_t level, const char* fmt, va_list args)
|
||||
{
|
||||
// Format the line once.
|
||||
char line[coop::kLogMsgLen];
|
||||
va_list args;
|
||||
va_start(args, fmt);
|
||||
std::vsnprintf(line, sizeof(line), fmt, args);
|
||||
va_end(args);
|
||||
|
||||
// Stream to the host's Log window over the shared ring (the primary sink).
|
||||
if (coop::LogRing* ring = g_log_ring.load(std::memory_order_acquire))
|
||||
{
|
||||
coop::log_ring_push(*ring, GetCurrentProcessId(), GetTickCount64(), line);
|
||||
coop::log_ring_push(*ring, GetCurrentProcessId(), level, GetTickCount64(), line);
|
||||
}
|
||||
|
||||
// Also mirror to the file when the opt-in trace is enabled.
|
||||
@@ -91,10 +103,35 @@ void logf(const char* fmt, ...)
|
||||
{
|
||||
SYSTEMTIME st;
|
||||
GetLocalTime(&st);
|
||||
std::fprintf(f, "[%02u:%02u:%02u.%03u pid=%lu] %s\n", st.wHour, st.wMinute, st.wSecond,
|
||||
st.wMilliseconds, GetCurrentProcessId(), line);
|
||||
std::fprintf(f, "[%02u:%02u:%02u.%03u pid=%lu %s] %s\n", st.wHour, st.wMinute, st.wSecond,
|
||||
st.wMilliseconds, GetCurrentProcessId(), level_tag(level), line);
|
||||
std::fflush(f);
|
||||
}
|
||||
}
|
||||
} // namespace
|
||||
|
||||
void logf(const char* fmt, ...)
|
||||
{
|
||||
va_list args;
|
||||
va_start(args, fmt);
|
||||
vlog(coop::LogLevel_Info, fmt, args);
|
||||
va_end(args);
|
||||
}
|
||||
|
||||
void logw(const char* fmt, ...)
|
||||
{
|
||||
va_list args;
|
||||
va_start(args, fmt);
|
||||
vlog(coop::LogLevel_Warn, fmt, args);
|
||||
va_end(args);
|
||||
}
|
||||
|
||||
void loge(const char* fmt, ...)
|
||||
{
|
||||
va_list args;
|
||||
va_start(args, fmt);
|
||||
vlog(coop::LogLevel_Error, fmt, args);
|
||||
va_end(args);
|
||||
}
|
||||
|
||||
} // namespace coop::hook
|
||||
|
||||
Reference in New Issue
Block a user