Issue
Consolidate SyncPullAudioMode + SyncPullRenderer into unified SyncPullStrategy.
Background
Current architecture has coupled pair that cannot be swapped independently:
- SyncPullAudioMode: Handles lifecycle and simulation updates
- SyncPullRenderer: Handles on-demand rendering
This creates unnecessary complexity and violates OCP.
Goal
Create SyncPullStrategy that unifies lifecycle and rendering:
- Single class implementing IAudioStrategy
- Uses IAudioHardwareProvider for platform-specific audio
- Handles on-demand rendering internally
- No buffering (direct callback to bridge API)
Implementation Plan
- Create SyncPullStrategy.h/cpp implementing IAudioStrategy
- Merge SyncPullAudioMode lifecycle methods into SyncPullStrategy
- Merge SyncPullRenderer rendering methods into SyncPullStrategy
- Inject IAudioHardwareProvider instead of using AudioUnit directly
- Implement on-demand rendering (call bridge RenderOnDemand in callback)
- Maintain sync-pull diagnostics (timing, budget tracking)
Acceptance Criteria
- SyncPullStrategy.h/cpp created implementing IAudioStrategy
- Combines SyncPullAudioMode + SyncPullRenderer functionality
- Uses IAudioHardwareProvider for audio hardware access
- Maintains all sync-pull behavior (on-demand rendering, diagnostics)
- All tests pass (existing SyncPullRenderer tests)
- Clean build with no warnings
Testing
- All existing SyncPullRenderer unit tests pass
- All existing SyncPullAudioMode unit tests pass
- Simulator-level audio tests produce identical output
- No behavioral changes (audio sounds identical)
Dependencies
Related Issues
Issue
Consolidate SyncPullAudioMode + SyncPullRenderer into unified SyncPullStrategy.
Background
Current architecture has coupled pair that cannot be swapped independently:
This creates unnecessary complexity and violates OCP.
Goal
Create SyncPullStrategy that unifies lifecycle and rendering:
Implementation Plan
Acceptance Criteria
Testing
Dependencies
Related Issues