diff options
Diffstat (limited to 'src/audio/wav_dump_backend.cc')
| -rw-r--r-- | src/audio/wav_dump_backend.cc | 27 |
1 files changed, 21 insertions, 6 deletions
diff --git a/src/audio/wav_dump_backend.cc b/src/audio/wav_dump_backend.cc index eda835c..82803a2 100644 --- a/src/audio/wav_dump_backend.cc +++ b/src/audio/wav_dump_backend.cc @@ -10,7 +10,7 @@ #include <string.h> WavDumpBackend::WavDumpBackend() - : wav_file_(nullptr), samples_written_(0), + : wav_file_(nullptr), samples_written_(0), clipped_samples_(0), output_filename_("audio_dump.wav"), is_active_(false), duration_sec_(0.0f) { sample_buffer_.resize(kBufferSize); @@ -36,6 +36,7 @@ void WavDumpBackend::init() { write_wav_header(wav_file_, 0); samples_written_ = 0; + clipped_samples_ = 0; printf("WAV dump backend initialized: %s\n", output_filename_); } @@ -50,15 +51,18 @@ void WavDumpBackend::write_audio(const float* samples, int num_samples) { } // Convert float samples to int16 and write to WAV + // Note: We do NOT clamp samples (matches MiniaudioBackend behavior) + // Instead, we count samples that would clip during int16 conversion for (int i = 0; i < num_samples; ++i) { float sample = samples[i]; - // Clamp to [-1.0, 1.0] - if (sample > 1.0f) - sample = 1.0f; - if (sample < -1.0f) - sample = -1.0f; + // Track clipping for diagnostics (but don't prevent it) + if (sample > 1.0f || sample < -1.0f) { + clipped_samples_++; + } + // Convert to int16 (allows overflow for diagnostic purposes) + // This matches hardware behavior where clipping occurs in the DAC const int16_t sample_i16 = (int16_t)(sample * 32767.0f); fwrite(&sample_i16, sizeof(int16_t), 1, wav_file_); } @@ -76,6 +80,17 @@ void WavDumpBackend::shutdown() { const float duration_sec = (float)samples_written_ / (kSampleRate * 2); printf("WAV file written: %s (%.2f seconds, %zu samples)\n", output_filename_, duration_sec, samples_written_); + + // Report clipping diagnostics + if (clipped_samples_ > 0) { + const float clip_percent = + (float)clipped_samples_ / (float)samples_written_ * 100.0f; + printf(" WARNING: %zu samples clipped (%.2f%% of total)\n", + clipped_samples_, clip_percent); + printf(" This indicates audio distortion - consider reducing volume\n"); + } else { + printf(" ✓ No clipping detected\n"); + } } is_active_ = false; |
