summaryrefslogtreecommitdiff
path: root/src/audio/wav_dump_backend.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/audio/wav_dump_backend.cc')
-rw-r--r--src/audio/wav_dump_backend.cc27
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;