From 892fb808b6656fe9f0e57d63a8ae359bb07cd3eb Mon Sep 17 00:00:00 2001 From: Christian Semmler Date: Thu, 26 Mar 2026 19:33:32 -0700 Subject: [PATCH] Fix animation audio playing ~1.5x too fast with 3D sound enabled Camera animations compute high listener velocities via CalculateWorldVelocity, and miniaudio's default Doppler factor of 1.0 shifts the pitch/speed of all spatialized sounds accordingly. Disable Doppler on sounds created by the multiplayer AudioPlayer using a friend class to access LegoCacheSound's private ma_sound handle. Co-Authored-By: Claude Opus 4.6 (1M context) --- LEGO1/lego/legoomni/include/legocachsound.h | 3 +++ extensions/include/extensions/fwd.h | 1 + extensions/src/multiplayer/animation/audioplayer.cpp | 5 +++++ 3 files changed, 9 insertions(+) diff --git a/LEGO1/lego/legoomni/include/legocachsound.h b/LEGO1/lego/legoomni/include/legocachsound.h index cf5e1e2e..4ea3739e 100644 --- a/LEGO1/lego/legoomni/include/legocachsound.h +++ b/LEGO1/lego/legoomni/include/legocachsound.h @@ -2,6 +2,7 @@ #define LEGOCACHSOUND_H #include "decomp.h" +#include "extensions/fwd.h" #include "lego3dsound.h" #include "mxcore.h" #include "mxstring.h" @@ -58,6 +59,8 @@ class LegoCacheSound : public MxCore { // LegoCacheSound::`scalar deleting destructor' private: + friend class Multiplayer::Animation::AudioPlayer; + void Init(); void CopyData(MxU8* p_data, MxU32 p_dataSize); MxString GetBaseFilename(MxString& p_path); diff --git a/extensions/include/extensions/fwd.h b/extensions/include/extensions/fwd.h index c10c809d..dae20fd1 100644 --- a/extensions/include/extensions/fwd.h +++ b/extensions/include/extensions/fwd.h @@ -22,6 +22,7 @@ class NetworkManager; class WorldStateSync; namespace Animation { +class AudioPlayer; class Catalog; class Controller; } // namespace Animation diff --git a/extensions/src/multiplayer/animation/audioplayer.cpp b/extensions/src/multiplayer/animation/audioplayer.cpp index 95dc88af..807bf460 100644 --- a/extensions/src/multiplayer/animation/audioplayer.cpp +++ b/extensions/src/multiplayer/animation/audioplayer.cpp @@ -13,6 +13,11 @@ void AudioPlayer::Init(const std::vector& p_tracks) MxWavePresenter::WaveFormat format = audioTrack.format; if (sound->Create(format, mediaSrcPath, audioTrack.volume, audioTrack.pcmData, audioTrack.pcmDataSize) == SUCCESS) { + // Disable Doppler on extension-created sounds. Camera animations drive high + // listener velocities via CalculateWorldVelocity, and miniaudio's default + // dopplerFactor of 1.0 shifts the pitch/speed of spatialized sounds. + ma_sound_set_doppler_factor(sound->m_cacheSound, 0); + ActiveSound active; active.sound = sound; active.timeOffset = audioTrack.timeOffset;