- PSP output thread now caches the last computed leftVolume/rightVolume and
only recomputes them when stream->volume/directionality actually changed
since the previous chunk, instead of recomputing every ~23ms chunk
unconditionally.
- Mixer channels and the mixer itself now carry their own volume
(audioMixerSetChannelVolume()/audioMixerSetMasterVolume()), multiplied
with each sound's own volume every audioMixerUpdateEarly() and applied via
audioStreamSetVolume() - so changing a channel's or the master volume
affects whatever's already playing, not just future sounds. Also fixed
audioMixerUpdateEarly() to tolerate a PLAY command queued outside the
normal per-frame cycle (no loadingAsset yet from a preceding
audioMixerUpdateLate(), e.g. during engine startup) by leaving it queued
for the following frame instead of asserting.
- engine.c now plays boa.mp3 on AUDIO_MIXER_CHANNEL_BGM_0 on loop through
the mixer instead of driving a raw audiostream_t directly, exercising the
new mixer pipeline end to end.
Built and verified on Linux, PSP (Docker) and GameCube (Docker).
Co-Authored-By: Claude Sonnet 5 <[email protected]>