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.h | 56 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 src/audio/mock_audio_backend.h (limited to 'src/audio/mock_audio_backend.h') diff --git a/src/audio/mock_audio_backend.h b/src/audio/mock_audio_backend.h new file mode 100644 index 0000000..963d9cb --- /dev/null +++ b/src/audio/mock_audio_backend.h @@ -0,0 +1,56 @@ +// This file is part of the 64k demo project. +// It implements a test-only mock audio backend for event recording. +// Used for tracker timing verification and audio synchronization tests. + +#pragma once + +#if !defined(STRIP_ALL) + +#include "audio_backend.h" +#include + +// Event structure for recorded voice triggers +struct VoiceTriggerEvent { + float timestamp_sec; + int spectrogram_id; + float volume; + float pan; +}; + +// Mock audio backend that records all voice trigger events +// Used for testing tracker timing and synchronization +class MockAudioBackend : public AudioBackend { + public: + MockAudioBackend(); + ~MockAudioBackend() override; + + // AudioBackend interface (no-ops for mock) + void init() override; + void start() override; + void shutdown() override; + + // Event recording hooks + void on_voice_triggered(float timestamp, int spectrogram_id, float volume, + float pan) override; + void on_frames_rendered(int num_frames) override; + + // Test interface methods + const std::vector& get_events() const { + return recorded_events_; + } + void clear_events() { recorded_events_.clear(); } + + // Manual time control for deterministic testing + void advance_time(float delta_sec) { current_time_sec_ += delta_sec; } + void set_time(float time_sec) { current_time_sec_ = time_sec; } + float get_current_time() const { return current_time_sec_; } + + // Sample rate used for frame-to-time conversion + static const int kSampleRate = 32000; + + private: + std::vector recorded_events_; + float current_time_sec_; +}; + +#endif /* !defined(STRIP_ALL) */ -- cgit v1.2.3