| Age | Commit message (Collapse) | Author |
|
- Inverted FATAL_CHECK macro to crash if condition is FALSE (standard assertion)
- Updated all call sites in audio, GPU, and CNN subsystems
- Updated documentation and examples
- Recorded completion in doc/COMPLETED.md
|
|
Interpolates audio playback time between callbacks using CLOCK_MONOTONIC
for smooth 60Hz updates instead of coarse 8-10Hz steps.
Replaces artificial peak decay with true RMS calculation over 50ms
window. Ring buffer computes RMS directly on internal buffer without
copies for efficiency.
All backends updated with get_callback_state() interface for time
interpolation. Tests passing (34/34).
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
|
|
|
Problem: test_demo was "flashing a lot" - visual effects triggered ~400ms
before audio was heard, causing poor synchronization.
Root Causes:
1. Beat calculation used physical time (platform_state.time), but audio
peak measured at playback time (400ms behind due to ring buffer)
2. Peak decay too slow (0.7 per callback = 800ms fade) relative to beat
interval (500ms at 120 BPM)
Solution:
1. Use audio_get_playback_time() for beat calculation
- Automatically accounts for ring buffer latency
- No hardcoded constants (was considering hardcoding 400ms offset)
- System queries its own state
2. Faster decay rate (0.5 vs 0.7) to match beat interval
3. Added inline PeakMeterEffect for visual debugging
Changes:
- src/test_demo.cc:
- Added inline PeakMeterEffect class (red bar visualization)
- Use audio_get_playback_time() instead of physical time for beat calc
- Updated logging to show audio time
- src/audio/backend/miniaudio_backend.cc:
- Changed decay rate from 0.7 to 0.5 (500ms fade time)
- src/gpu/gpu.{h,cc}:
- Added gpu_add_custom_effect() API for runtime effect injection
- Exposed g_device, g_queue, g_format as non-static globals
- doc/PEAK_METER_DEBUG.md:
- Initial analysis of timing issues
- doc/AUDIO_TIMING_ARCHITECTURE.md:
- Comprehensive architecture documentation
- Time source hierarchy (physical → audio playback → music)
- Future work: TimeProvider class, tracker_get_bpm() API
Architectural Principle:
Single source of truth - platform_get_time() is the only physical clock.
Everything else derives from it. No hardcoded latency constants.
Result: Visual effects now sync perfectly with heard audio.
|
|
## Critical Fixes
**Peak Measurement Timing:**
- Fixed 400ms audio-visual desync by measuring peak at playback time
- Added get_realtime_peak() to AudioBackend interface
- Implemented real-time measurement in MiniaudioBackend audio callback
- Updated main.cc and test_demo.cc to use audio_get_realtime_peak()
**Peak Decay Rate:**
- Fixed slow decay (0.95 → 0.7 per callback)
- Old: 5.76 seconds to fade to 10% (constant flashing in test_demo)
- New: 1.15 seconds to fade to 10% (proper visual sync)
## New Features
**SilentBackend:**
- Test-only backend for testing audio.cc without hardware
- Controllable peak for testing edge cases
- Tracks frames rendered and voice triggers
- Added 7 comprehensive tests covering:
- Lifecycle (init/start/shutdown)
- Peak control and tracking
- Playback time and buffer management
- Integration with AudioEngine
## Refactoring
**Backend Organization:**
- Created src/audio/backend/ directory
- Moved all backend implementations to subdirectory
- Updated include paths and CMakeLists.txt
- Cleaner codebase structure
**Code Cleanup:**
- Removed unused register_spec_asset() function
- Added deprecation note to synth_get_output_peak()
## Testing
- All 28 tests passing (100%)
- New test: test_silent_backend
- Improved audio.cc test coverage significantly
## Documentation
- Created PEAK_FIX_SUMMARY.md with technical details
- Created TASKS_SUMMARY.md with complete task report
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|