148 size_t write(
const uint8_t* data,
size_t len)
override {
155 if (
p_io ==
nullptr)
return 0;
260 float min_confidence = 0.3f,
int channel = 0) {
384 snprintf(msg,
sizeof(msg),
385 "Quality: clicks=%lu, dropouts=%lu, clipping=%lu, samples=%lu, "
386 "rms=%.1f, noise_floor=%.1f, snr=%.1fdB, tonality=%.2f, signal=%s",
395 snprintf(msg,
sizeof(msg),
396 "Quality: clicks=%lu, dropouts=%lu, clipping=%lu, samples=%lu, "
397 "rms=%.1f, noise_floor=%.1f, snr=%.1fdB, signal=%s",
409 void analyze(
const uint8_t* data,
size_t len) {
410 if (data ==
nullptr || len == 0)
return;
418 analyzeT<int8_t>(data, len);
421 analyzeT<int16_t>(data, len);
424 analyzeT<int24_t>(data, len);
427 analyzeT<int32_t>(data, len);
430 LOGE(
"QualityAnalysisStream: unsupported bits_per_sample %d",
437 template <
typename T>
438 void analyzeT(
const uint8_t* buffer,
size_t size) {
439 T* samples = (T*)buffer;
440 int count = size /
sizeof(T);
446 for (
int i = 0; i < count; i++) {
447 float val =
static_cast<float>(
static_cast<int>(samples[i]));
448 float abs_val = val < 0 ? -val : val;
449 int ch = i % channels;
456 if (delta < 0) delta = -delta;
457 if (delta > abs_click) {
465 if (abs_val <= abs_silence) {
479 if (abs_val >= abs_clip) {
524 float level = block_rms > 1.0f ? block_rms : 1.0f;
532 bool level_ok = block_rms > threshold;
535 if (level_ok && tonal_ok) {
#define LOGE(...)
Definition AudioLoggerIDF.h:30
#define DEFAULT_BUFFER_SIZE
Definition avr.h:20
virtual int availableForWrite()
Definition Arduino.h:128
virtual size_t write(const uint8_t *data, size_t len)
Definition Arduino.h:120
virtual void flush()
Definition Arduino.h:130
virtual size_t readBytes(uint8_t *data, size_t len)
Definition Arduino.h:140
virtual int available()
Definition Arduino.h:139
QualityIssue
Quality issues detected by QualityAnalysisStream.
Definition QualityAnalysisStream.h:14