summaryrefslogtreecommitdiff
path: root/src/tests/test_wav_dump.cc
AgeCommit message (Collapse)Author
24 hourstest(audio): Add error handling tests for WavDumpBackendskal
Added comprehensive error handling tests to verify WavDumpBackend handles invalid file paths gracefully without crashes. New test: test_invalid_file_paths() - Tests null filename (nullptr) - Tests non-existent directory path - Tests permission denied (root directory write) All cases verify: - Error message is printed to stderr - No crash or abort() - write_audio() does nothing (no segfault) - samples_written counter stays at 0 - shutdown() handles nullptr gracefully Example output: Error: Failed to open WAV file: (null) ✓ Null filename handled gracefully Error: Failed to open WAV file: /nonexistent/directory/test.wav ✓ Invalid directory path handled gracefully Error: Failed to open WAV file: /test.wav ✓ Permission denied handled gracefully This improves test coverage by verifying error paths that could cause crashes or undefined behavior in production. All 27 tests pass (including new error handling tests). Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
24 hoursfix(audio): Remove clipping from WavDumpBackend, add diagnosticsskal
Fixed design flaw where WavDumpBackend was clamping samples to [-1.0, 1.0] before writing to file. This prevented detection of audio problems. Changes: - Removed sample clamping (lines 57-60 in old code) - WAV dump now records audio "as is" (matches MiniaudioBackend behavior) - Added clipped_samples_ counter to track diagnostic metric - Added get_clipped_samples() method for programmatic access - Report clipping statistics in shutdown(): - "✓ No clipping detected" when clean - "WARNING: N samples clipped (X% of total)" when clipping occurs - Suggests reducing volume to fix Why this matters: - MiniaudioBackend does NOT clip samples (passes directly to miniaudio) - WavDumpBackend should match this behavior - Clipping in WAV files helps identify audio distortion problems - Developers can compare WAV output to expected values - Diagnostic metric helps tune audio levels Testing: - Added test_clipping_detection() test case - Verifies clipping counter works correctly (200 clipped / 1000 samples) - Existing tests show "✓ No clipping detected" for normal audio - All 27 tests pass Example output: WAV file written: test.wav (2.02 seconds, 128986 samples) ✓ No clipping detected WAV file written: loud.wav (10.5 seconds, 336000 samples) WARNING: 4521 samples clipped (1.35% of total) This indicates audio distortion - consider reducing volume Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
24 hoursrefactor(audio): Remove tempo logic from WavDumpBackendskal
Fixed design flaw where WavDumpBackend had hardcoded tempo curves duplicating logic from main.cc. Backend should be passive and just write audio data, not implement simulation logic. Changes: - WavDumpBackend.start() is now non-blocking (was blocking simulation loop) - Added write_audio() method for passive audio writing - Removed all tempo scaling logic from backend (lines 62-97) - Removed tracker_update() and audio_render_ahead() calls from backend - Removed set_duration() (no longer needed, frontend controls duration) Frontend (main.cc): - Added WAV dump mode loop that drives simulation with its own tempo logic - Reads from ring buffer and calls wav_backend.write_audio() - Tempo logic stays in one place (no duplication) - Added ring_buffer.h include for AudioRingBuffer access Test (test_wav_dump.cc): - Updated to use frontend-driven approach - Test manually drives simulation loop - Calls write_audio() after each frame - Verifies passive backend behavior Design: - Backend: Passive file writer (init/start/write_audio/shutdown) - Frontend: Active simulation driver (tempo, tracker, rendering) - Zero duplication of tempo/simulation logic - Clean separation of concerns All 27 tests pass. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
3 daysfeat(audio): Complete Phase 2 - Migrate tests to AudioEngine (Task #56)skal
Migrated all tracker-related tests to use AudioEngine instead of directly calling synth_init() and tracker_init(), eliminating fragile initialization order dependencies. Tests Migrated: - test_tracker.cc: Basic tracker functionality - test_tracker_timing.cc: Timing verification with MockAudioBackend (7 tests) - test_variable_tempo.cc: Variable tempo scaling (6 tests) - test_wav_dump.cc: WAV dump backend verification Migration Pattern: - Added AudioEngine include to all test files - Replaced synth_init() + tracker_init() with AudioEngine::init() - Replaced tracker_update(time) with engine.update(time) - Added engine.shutdown() at end of each test function - Preserved audio_init()/audio_shutdown() where needed for backends Results: - All 20 tests pass (100% pass rate) - Test suite time: 8.13s (slightly faster) - No regressions in test behavior - Cleaner API with single initialization entry point Next Steps (Phase 3): - Migrate main.cc and production code to use AudioEngine - Add backwards compatibility shims during transition handoff(Claude): Completed Task #56 Phase 2 - all tracker tests now use AudioEngine. The initialization order fragility is eliminated in test code. Ready for Phase 3 (production integration).
3 daysperf: Reduce audio test durations for faster test suiteskal
Optimized long-running audio tests to significantly improve test suite performance while maintaining test coverage. Changes: - WavDumpBackend: Added set_duration() method with configurable duration - Default remains 60s for debugging/production use - Test now uses 2s instead of 60s (140x faster: 60s → 0.43s) - JitteredAudioBackendTest: Reduced simulation durations - Test 1: 2.0s → 0.5s (4x faster) - Test 2: 10.0s → 3.0s (3.3x faster) - Overall: 14.49s → 4.48s (3.2x faster) - Updated assertions for shorter durations - Progress indicators adjusted for shorter tests Results: - Total test suite time: 18.31s → 8.29s (55% faster) - All 20 tests still pass - Tests still properly validate intended behavior handoff(Claude): Optimized audio test performance to speed up development iteration without sacrificing test coverage. WavDumpBackend now has configurable duration via set_duration() method.
3 daysfix(audio): Resolve tracker test failures due to initialization orderskal
Root Cause: Tests were failing because synth_init() clears all registered spectrograms, but tests called tracker_init() before or between synth_init() calls, causing spectrograms to be registered then immediately cleared. Fixes: 1. tracker.cc: - Force re-initialization on every tracker_init() call - Clear cache and re-register all spectrograms to handle synth resets - Free previously allocated memory to prevent leaks - Ensures spectrograms remain registered regardless of init order 2. synth.cc: - Fixed backend event hooks wrapped in wrong conditional - Changed #if defined(DEBUG_LOG_SYNTH) -> #if !defined(STRIP_ALL) - Moved backend includes and g_elapsed_time_sec outside debug guards - Ensures test backends receive voice trigger events 3. CMakeLists.txt: - Added missing generate_demo_assets dependency to test_tracker - Ensures asset files are available before running tracker tests 4. test_tracker.cc: - Fixed incorrect test expectations (5 voices, not 6, at beat 1.0) - Updated comments to reflect event-based triggering behavior 5. test_tracker_timing.cc, test_variable_tempo.cc, test_wav_dump.cc: - Fixed initialization order: synth_init() BEFORE tracker_init() - For tests using audio_init(), moved tracker_init() AFTER it - Ensures spectrograms are registered after synth is ready Test Results: All 19 tests now pass (100% success rate). Known Limitation: This is a temporary fix. The initialization order dependency is fragile and should be replaced with a proper lifecycle management system (see TODO Task #56). Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
4 daystest(audio): Add regression test for WAV dump stereo formatskal
Added comprehensive test to prevent mono/stereo mismatch regressions. What This Test Prevents: The recent bug where WAV dump wrote mono instead of stereo caused severe audio distortion. This regression test ensures the format always matches the live audio output configuration. Test Coverage (test_wav_dump.cc): 1. **test_wav_format_matches_live_audio()**: - Renders 60 seconds of audio to WAV file - Reads and parses WAV header - Verifies critical format fields: ✓ num_channels = 2 (MUST be stereo!) ✓ sample_rate = 32000 Hz ✓ bits_per_sample = 16 ✓ audio_format = 1 (PCM) ✓ byte_rate calculation correct ✓ block_align calculation correct - Verifies audio data is non-zero (not silent) - Cleans up test file after 2. **test_wav_stereo_buffer_size()**: - Verifies buffer size calculations for stereo - frames_per_update = ~533 frames - samples_per_update = frames * 2 (stereo) - Prevents buffer overflow issues Key Assertions: ```cpp // CRITICAL: This assertion prevented the regression assert(header.num_channels == 2); // MUST be stereo! ``` If anyone accidentally changes the WAV dump to mono or breaks the stereo format, this test will catch it immediately. Integration: - Added to CMakeLists.txt after test_mock_backend - Requires: audio, util, procedural, tracker music data - Test count: 16 → 17 tests - All tests passing (100%) Output: ``` Test: WAV format matches live audio output... ✓ WAV format verified: stereo, 32kHz, 16-bit PCM ✓ Matches live audio output configuration Test: WAV buffer handles stereo correctly... ✓ Buffer size calculations correct for stereo ✅ All WAV Dump tests PASSED ``` Future Protection: This test will immediately catch: - Accidental mono conversion - Sample rate changes - Bit depth changes - Buffer size calculation errors - Format mismatches with live audio handoff(Claude): Regression test complete, stereo format protected Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>