summaryrefslogtreecommitdiff
path: root/doc/CONTRIBUTING.md
diff options
context:
space:
mode:
authorskal <pascal.massimino@gmail.com>2026-02-05 20:13:46 +0100
committerskal <pascal.massimino@gmail.com>2026-02-05 20:13:46 +0100
commitd55c13a902d4277e35010574a6cee23f65dd6a55 (patch)
tree3066292d315983f1655716b68f76ec47ad651a70 /doc/CONTRIBUTING.md
parent3b201f2cb4d5917bb2fd76051c073b71ad6b3b27 (diff)
feat(audio): Complete Phase 4 - Cleanup and Documentation (Task #56)
Completed final cleanup phase of Audio Lifecycle Refactor. Removed backwards compatibility shims and updated documentation to reflect new AudioEngine-based initialization patterns. Changes: 1. Removed Backwards Compatibility: - Removed synth_init() call from audio_init() in audio.cc - Added comment explaining AudioEngine is the preferred initialization method - All tests already explicitly call synth_init() or use AudioEngine 2. Documentation Updates: - Updated HOWTO.md with AudioEngine usage examples and best practices - Updated CONTRIBUTING.md with audio subsystem initialization protocols - Documented when to use AudioEngine vs direct synth API calls - Clarified that AudioEngine is a lifecycle manager, not a complete facade 3. Size Verification: - Size-optimized build: 5.0MB (vs 6.2MB debug) - AudioEngine overhead: <500 bytes (within acceptable limits) - No size regression from refactor Results: - All 20 tests pass (100% pass rate) - Demo runs successfully - No backwards compatibility issues - Clear documentation for future development - Binary size impact negligible Design Philosophy: - AudioEngine manages initialization order (synth before tracker) - Direct synth API calls remain valid for performance-critical paths - Low-level tests can still use synth_init() directly if needed - Preferred pattern: Use AudioEngine for lifecycle, direct APIs for operations handoff(Claude): Completed Task #56 Phase 4 - All phases complete! Audio Lifecycle Refactor is fully implemented, tested, and documented. The fragile initialization order dependency has been eliminated. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Diffstat (limited to 'doc/CONTRIBUTING.md')
-rw-r--r--doc/CONTRIBUTING.md49
1 files changed, 49 insertions, 0 deletions
diff --git a/doc/CONTRIBUTING.md b/doc/CONTRIBUTING.md
index 4bb894e..27391e4 100644
--- a/doc/CONTRIBUTING.md
+++ b/doc/CONTRIBUTING.md
@@ -253,3 +253,52 @@ Make sure everything is reflected in clang-format.
2. **Register**: Add an `EFFECT` entry to `assets/demo.seq` specifying the class name, start/end times, and any constructor arguments.
3. **Verify**: Build with `DEMO_ALL_OPTIONS=ON` and use `--seek` to test your effect at its specific timestamp.
+### Audio Subsystem Initialization
+
+The audio subsystem uses `AudioEngine` to manage initialization order and lifecycle.
+
+**In production code (`main.cc` or similar):**
+
+```cpp
+#include "audio/audio_engine.h"
+
+// 1. Initialize audio backend
+audio_init();
+
+// 2. Initialize audio engine (manages synth + tracker)
+static AudioEngine g_audio_engine;
+g_audio_engine.init();
+
+// 3. In main loop
+g_audio_engine.update(music_time);
+```
+
+**In tests:**
+
+```cpp
+#include "audio/audio_engine.h"
+
+void test_audio_feature() {
+ AudioEngine engine;
+ engine.init();
+
+ // Test logic here
+ engine.update(1.0f);
+
+ engine.shutdown(); // Always cleanup at end
+}
+```
+
+**Low-level usage (when AudioEngine is not needed):**
+
+For tests that only need synth or tracker (not both), you can still call `synth_init()` or `tracker_init()` directly. However, if you need both, always use `AudioEngine` to ensure correct initialization order.
+
+**Direct synth API calls are valid:**
+
+- `synth_register_spectrogram()` - Register spectrograms
+- `synth_trigger_voice()` - Trigger audio playback
+- `synth_get_output_peak()` - Get audio levels for visualization
+- `synth_render()` - Low-level rendering
+
+These are performance-critical APIs and should be called directly, not wrapped by AudioEngine.
+