From e46c324ac5a6adcd9b17c07deeb2c2c90593d687 Mon Sep 17 00:00:00 2001 From: Oliver Wong Date: Tue, 21 Apr 2026 15:01:55 +0800 Subject: [PATCH] refactor: WaitForAlignment coroutine use BeatClock.cs insted of calculate independently. --- .../Resources/AudioData/MusicTransition.bytes | Bin 34 -> 34 bytes .../HandWritten/HandWrittenDefinitions.cs | 14 ++++---- .../Audio/HandWritten/LongAudio/BeatClock.cs | 22 ++++++++++++- .../LongAudio/MusicChannelPlayer.cs | 30 ++---------------- 4 files changed, 30 insertions(+), 36 deletions(-) diff --git a/Assets/Resources/AudioData/MusicTransition.bytes b/Assets/Resources/AudioData/MusicTransition.bytes index 794109c0a3d5f090deabbbc7a58c863aa8c4bf99..c711ef89a92d9055fc957dcbaa92017e22107c91 100644 GIT binary patch delta 15 QcmY#Vnjpc&$jAT%01Vmy`2YX_ delta 15 QcmY#Vnjpc&#K-^z01V^+`Tzg` diff --git a/Assets/Scripts/OCES/Audio/HandWritten/HandWrittenDefinitions.cs b/Assets/Scripts/OCES/Audio/HandWritten/HandWrittenDefinitions.cs index 2caa092..e7a199f 100644 --- a/Assets/Scripts/OCES/Audio/HandWritten/HandWrittenDefinitions.cs +++ b/Assets/Scripts/OCES/Audio/HandWritten/HandWrittenDefinitions.cs @@ -46,6 +46,13 @@ namespace OCES.Audio Bar, } + public enum CallbackFlags + { + MusicSyncBeat = 1, + MusicSyncBar = 2, + MusicSyncGrid = 3, + } + public enum ActiveSoundState { Pending, // 已进入调度,但还没真正播放 @@ -91,11 +98,4 @@ namespace OCES.Audio public partial class MusicPath : IPathEntry { } public partial class AmbiencePath : IPathEntry { } - - public enum CallbackFlags - { - MusicSyncBeat = 1, - MusicSyncBar = 2, - MusicSyncGrid = 3, - } } diff --git a/Assets/Scripts/OCES/Audio/HandWritten/LongAudio/BeatClock.cs b/Assets/Scripts/OCES/Audio/HandWritten/LongAudio/BeatClock.cs index b715214..2113491 100644 --- a/Assets/Scripts/OCES/Audio/HandWritten/LongAudio/BeatClock.cs +++ b/Assets/Scripts/OCES/Audio/HandWritten/LongAudio/BeatClock.cs @@ -26,7 +26,7 @@ namespace OCES.Audio this.m_onGrid = onGrid; } - public void Restart(MusicContainer container, float inheritedBpm, double dspTime) + internal void Restart(MusicContainer container, float inheritedBpm, double dspTime) { //Debug.Log($"[BeatClock] Restart called, container={container.Id}, bpm={container.Bpm}, inherited={inheritedBpm}"); @@ -63,6 +63,26 @@ namespace OCES.Audio this.m_beatCoroutine = this.m_barCoroutine = this.m_gridCoroutine = null; } + internal double GetNextDspTime(AlignMode mode) + { + double now = AudioSettings.dspTime; + + if (this.m_blendError || this.m_stopped) + { + return now; + } + + double elapsed = now - this.m_startDspTime; + double period = mode switch + { + AlignMode.Beat => this.m_secondsPerBeat, + AlignMode.Bar => this.m_secondsPerBeat * this.m_beatsPerBar, + _ => this.m_secondsPerBeat, + }; + long next = (long)(elapsed / period) + 1L; + return this.m_startDspTime + next * period; + } + IEnumerator BeatCoroutine() { double elapsed = AudioSettings.dspTime - this.m_startDspTime; diff --git a/Assets/Scripts/OCES/Audio/HandWritten/LongAudio/MusicChannelPlayer.cs b/Assets/Scripts/OCES/Audio/HandWritten/LongAudio/MusicChannelPlayer.cs index 0310c9b..3e9a75f 100644 --- a/Assets/Scripts/OCES/Audio/HandWritten/LongAudio/MusicChannelPlayer.cs +++ b/Assets/Scripts/OCES/Audio/HandWritten/LongAudio/MusicChannelPlayer.cs @@ -197,34 +197,8 @@ namespace OCES.Audio if (mode == AlignMode.Immediate || container.Bpm <= 0f) yield break; - double now = AudioSettings.dspTime; - double elapsed = now - this.m_playStartTime; - - double secondsPerBeat = 60.0 / container.Bpm; - - switch (mode) - { - case AlignMode.Beat: - { - double beatsElapsed = elapsed / secondsPerBeat; - double nextBeat = Math.Ceiling(beatsElapsed); - double waitSeconds = (nextBeat - beatsElapsed) * secondsPerBeat; - if (waitSeconds > 0.001) - yield return new WaitForSeconds((float)waitSeconds); - break; - } - case AlignMode.Bar: - { - int beatsPerBar = MusicContainerConfig.GetBeatsPerBar(container.TimeSig); - double secondsPerBar = secondsPerBeat * beatsPerBar; - double barsElapsed = elapsed / secondsPerBar; - double nextBar = Math.Ceiling(barsElapsed); - double waitSeconds = (nextBar - barsElapsed) * secondsPerBar; - if (waitSeconds > 0.001) - yield return new WaitForSeconds((float)waitSeconds); - break; - } - } + double target = this.m_beatClock.GetNextDspTime(mode); + yield return new WaitUntil(() => AudioSettings.dspTime >= target); } // ─────────────────────────────────────────────