From bb49daa17cfbb244a239b620372eaf27ed252b0f Mon Sep 17 00:00:00 2001 From: skal Date: Wed, 4 Feb 2026 13:10:57 +0100 Subject: feat(audio): Implement mock audio backend for testing (Task #51.2) Created MockAudioBackend for deterministic audio event recording and timing verification. Enables robust tracker synchronization testing. Changes: - Created VoiceTriggerEvent structure (timestamp, spec_id, volume, pan) - Implemented MockAudioBackend with event recording capabilities - Added time tracking: manual (advance_time) and automatic (on_frames_rendered) - Created test_mock_backend.cc with 6 comprehensive test scenarios - Verified synth integration and audio_render_silent compatibility - Added to CMake test builds All test infrastructure guarded by #if !defined(STRIP_ALL). Zero size impact on production build. All 14 tests pass. handoff(Claude): Task #51.2 complete, mock backend ready for tracker tests Co-Authored-By: Claude Sonnet 4.5 --- src/audio/mock_audio_backend.cc | 45 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 src/audio/mock_audio_backend.cc (limited to 'src/audio/mock_audio_backend.cc') diff --git a/src/audio/mock_audio_backend.cc b/src/audio/mock_audio_backend.cc new file mode 100644 index 0000000..3f5a57a --- /dev/null +++ b/src/audio/mock_audio_backend.cc @@ -0,0 +1,45 @@ +// This file is part of the 64k demo project. +// It implements the mock audio backend for testing. +// Records voice trigger events with precise timestamps. + +#include "mock_audio_backend.h" + +#if !defined(STRIP_ALL) + +MockAudioBackend::MockAudioBackend() : current_time_sec_(0.0f) { +} + +MockAudioBackend::~MockAudioBackend() { +} + +void MockAudioBackend::init() { + // No-op for mock backend +} + +void MockAudioBackend::start() { + // No-op for mock backend +} + +void MockAudioBackend::shutdown() { + // No-op for mock backend +} + +void MockAudioBackend::on_voice_triggered(float timestamp, int spectrogram_id, + float volume, float pan) { + // Record the event with the timestamp provided by synth + VoiceTriggerEvent event; + event.timestamp_sec = timestamp; + event.spectrogram_id = spectrogram_id; + event.volume = volume; + event.pan = pan; + recorded_events_.push_back(event); +} + +void MockAudioBackend::on_frames_rendered(int num_frames) { + // Update internal time based on frames rendered + // This is called by audio_render_silent() for seek/fast-forward simulation + const float delta_sec = (float)num_frames / (float)kSampleRate; + current_time_sec_ += delta_sec; +} + +#endif /* !defined(STRIP_ALL) */ -- cgit v1.2.3