From f38103d2dcb2cf0c1697b28554da66e09234703b Mon Sep 17 00:00:00 2001 From: Oliver Wong Date: Tue, 21 Apr 2026 17:25:48 +0800 Subject: [PATCH] feature: Segment end offset --- Assets/Resources/AudioData/MusicSegment.bytes | Bin 551 -> 893 bytes .../Resources/AudioData/MusicTransition.bytes | Bin 34 -> 27 bytes .../Audios/Japanese Number 02.wav.meta | 2 +- .../Audios/Spanish Number 03.wav.meta | 2 +- .../Resources/Audios/au_music_game_loop.wav | 3 ++ ...p.wav.meta => au_music_game_loop.wav.meta} | 6 ++-- .../Resources/Audios/au_music_home_loop.wav | 3 ++ ...p.wav.meta => au_music_home_loop.wav.meta} | 6 ++-- Assets/Resources/Audios/music_game_loop.wav | 3 -- Assets/Resources/Audios/music_home_loop.wav | 3 -- .../OCES/Audio/Generated/MusicSegment.cs | 14 +++++++++ .../OCES/Audio/Generated/MusicTransition.cs | 16 ++++------- .../HandWritten/HandWrittenDefinitions.cs | 6 ++++ .../LongAudio/MusicContainerPlayer.cs | 27 ++++++++++++------ ProjectSettings/AudioManager.asset | 2 +- 15 files changed, 59 insertions(+), 34 deletions(-) create mode 100644 Assets/Resources/Audios/au_music_game_loop.wav rename Assets/Resources/Audios/{music_game_loop.wav.meta => au_music_game_loop.wav.meta} (83%) create mode 100644 Assets/Resources/Audios/au_music_home_loop.wav rename Assets/Resources/Audios/{music_home_loop.wav.meta => au_music_home_loop.wav.meta} (83%) delete mode 100644 Assets/Resources/Audios/music_game_loop.wav delete mode 100644 Assets/Resources/Audios/music_home_loop.wav diff --git a/Assets/Resources/AudioData/MusicSegment.bytes b/Assets/Resources/AudioData/MusicSegment.bytes index a00a00cbc0a4ba9b23f704a4eaa1649c29115358..8eb793f66980325b94b10073adf84f8eb35bbe67 100644 GIT binary patch literal 893 zcmZ|O%TB{E5CzciYJmbRfl%=fEA}*LVa=adPGhB(>ezA;DwcdG|H3T~$#%z)yqL+E z>)2AVBuVzLM!aWbt=LK{fzo^SQH}rJFSQkB%|ASV;s7gCeJhtg5v=5`V6&X%uc16d zBi)fj$c{)h57_{XTPLluz1r?;@{-tl2z|4oi>(fWkI`@s^cy@ULQf#4PN*=FH<~{D zDeN6--wPso6p5znSzzm4cHGjRaUQW$?nT5>S22#*1#z}X#J&*r5_aNTo9MivXx^88XE8EqN)PDpZ?K%zTIr-SkS5%Gu9F0>JL zk4iG^nnB<0G_^Vhxd-%vdkifg@6HfYoHnvQ?g{oeXn!e2m!45;&o@>Y-cjAJeesx` zd-a$-HT2jIY~`_E*c!HSenWN@(-Fd*6Ly+5E$_H&NFk5Sk?LZD%GYqkC|lT~5ITig NN)`WSB^8X=>1@2mk}>0O|k$ delta 13 Ocmb1Enjpo&00jUFfB^6S diff --git a/Assets/Resources/Audios/Japanese Number 02.wav.meta b/Assets/Resources/Audios/Japanese Number 02.wav.meta index 6564a8f..ab83668 100644 --- a/Assets/Resources/Audios/Japanese Number 02.wav.meta +++ b/Assets/Resources/Audios/Japanese Number 02.wav.meta @@ -11,7 +11,7 @@ AudioImporter: compressionFormat: 1 quality: 0.5 conversionMode: 0 - preloadAudioData: 1 + preloadAudioData: 0 platformSettingOverrides: {} forceToMono: 0 normalize: 1 diff --git a/Assets/Resources/Audios/Spanish Number 03.wav.meta b/Assets/Resources/Audios/Spanish Number 03.wav.meta index 5cb0a34..810c081 100644 --- a/Assets/Resources/Audios/Spanish Number 03.wav.meta +++ b/Assets/Resources/Audios/Spanish Number 03.wav.meta @@ -11,7 +11,7 @@ AudioImporter: compressionFormat: 1 quality: 0.5 conversionMode: 0 - preloadAudioData: 1 + preloadAudioData: 0 platformSettingOverrides: {} forceToMono: 0 normalize: 1 diff --git a/Assets/Resources/Audios/au_music_game_loop.wav b/Assets/Resources/Audios/au_music_game_loop.wav new file mode 100644 index 0000000..66e9db6 --- /dev/null +++ b/Assets/Resources/Audios/au_music_game_loop.wav @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8d9da778f85a56be411e52da4e39710f9b1adb35c3da7b778fe9f9739c04c285 +size 11219946 diff --git a/Assets/Resources/Audios/music_game_loop.wav.meta b/Assets/Resources/Audios/au_music_game_loop.wav.meta similarity index 83% rename from Assets/Resources/Audios/music_game_loop.wav.meta rename to Assets/Resources/Audios/au_music_game_loop.wav.meta index 5fb423f..00b46b3 100644 --- a/Assets/Resources/Audios/music_game_loop.wav.meta +++ b/Assets/Resources/Audios/au_music_game_loop.wav.meta @@ -1,17 +1,17 @@ fileFormatVersion: 2 -guid: c084ace48a6004923bb9d762a2a31908 +guid: 8b55a0f62ff1a4f6cb7e68410bc51eac AudioImporter: externalObjects: {} serializedVersion: 7 defaultSettings: serializedVersion: 2 - loadType: 0 + loadType: 2 sampleRateSetting: 2 sampleRateOverride: 44100 compressionFormat: 1 quality: 0.13 conversionMode: 0 - preloadAudioData: 0 + preloadAudioData: 1 platformSettingOverrides: {} forceToMono: 0 normalize: 1 diff --git a/Assets/Resources/Audios/au_music_home_loop.wav b/Assets/Resources/Audios/au_music_home_loop.wav new file mode 100644 index 0000000..8e92546 --- /dev/null +++ b/Assets/Resources/Audios/au_music_home_loop.wav @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fc9f444c33a33807d3ca3bff1b871729d74d70f1abbb6f6dca16eb60acf4b7e6 +size 11219946 diff --git a/Assets/Resources/Audios/music_home_loop.wav.meta b/Assets/Resources/Audios/au_music_home_loop.wav.meta similarity index 83% rename from Assets/Resources/Audios/music_home_loop.wav.meta rename to Assets/Resources/Audios/au_music_home_loop.wav.meta index 41aba6f..a809dde 100644 --- a/Assets/Resources/Audios/music_home_loop.wav.meta +++ b/Assets/Resources/Audios/au_music_home_loop.wav.meta @@ -1,17 +1,17 @@ fileFormatVersion: 2 -guid: 6f16847f355c146d4a93c6199bae1e22 +guid: e7261e35dead34c2493620079319c598 AudioImporter: externalObjects: {} serializedVersion: 7 defaultSettings: serializedVersion: 2 - loadType: 0 + loadType: 2 sampleRateSetting: 2 sampleRateOverride: 44100 compressionFormat: 1 quality: 0.13 conversionMode: 0 - preloadAudioData: 0 + preloadAudioData: 1 platformSettingOverrides: {} forceToMono: 0 normalize: 1 diff --git a/Assets/Resources/Audios/music_game_loop.wav b/Assets/Resources/Audios/music_game_loop.wav deleted file mode 100644 index 281b538..0000000 --- a/Assets/Resources/Audios/music_game_loop.wav +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4eb3f8abc9a4e6ffd82e4da84b9581d076d2538818b54bf4bd7104cd7e6318af -size 11081544 diff --git a/Assets/Resources/Audios/music_home_loop.wav b/Assets/Resources/Audios/music_home_loop.wav deleted file mode 100644 index 2b07758..0000000 --- a/Assets/Resources/Audios/music_home_loop.wav +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a2cabcc5318b0f04d6386e9da27808b53685cb37a3756831433e26898c2b9f25 -size 11081544 diff --git a/Assets/Scripts/OCES/Audio/Generated/MusicSegment.cs b/Assets/Scripts/OCES/Audio/Generated/MusicSegment.cs index 2d3b139..34b73b9 100644 --- a/Assets/Scripts/OCES/Audio/Generated/MusicSegment.cs +++ b/Assets/Scripts/OCES/Audio/Generated/MusicSegment.cs @@ -22,17 +22,31 @@ public partial class MusicSegment : IBinarySerializable /// public string Name { get; set; } + /// + /// time(s) + /// + public double StartOffset { get; set; } + + /// + /// time(s) + /// + public double EndOffset { get; set; } + public void DeSerialize(BinaryReader reader) { Id = reader.ReadUInt32(); Name = reader.ReadString(); + StartOffset = reader.ReadDouble(); + EndOffset = reader.ReadDouble(); } public void Serialize(BinaryWriter writer) { writer.Write(Id); writer.Write(Name); + writer.Write(StartOffset); + writer.Write(EndOffset); } } diff --git a/Assets/Scripts/OCES/Audio/Generated/MusicTransition.cs b/Assets/Scripts/OCES/Audio/Generated/MusicTransition.cs index ee54cc9..90b992a 100644 --- a/Assets/Scripts/OCES/Audio/Generated/MusicTransition.cs +++ b/Assets/Scripts/OCES/Audio/Generated/MusicTransition.cs @@ -51,14 +51,10 @@ public partial class MusicTransition : IBinarySerializable public SyncPoint SyncPoint { get; set; } /// - /// samples + /// 0 = Start + /// 1 = Last Played Segment /// - public uint StartOffset { get; set; } - - /// - /// samples - /// - public uint EndOffset { get; set; } + public SyncSegment SyncSegment { get; set; } public void DeSerialize(BinaryReader reader) @@ -70,8 +66,7 @@ public partial class MusicTransition : IBinarySerializable FadeInOffset = reader.ReadSingle(); AlignMode = (AlignMode)reader.ReadByte(); SyncPoint = (SyncPoint)reader.ReadByte(); - StartOffset = reader.ReadUInt32(); - EndOffset = reader.ReadUInt32(); + SyncSegment = (SyncSegment)reader.ReadByte(); } public void Serialize(BinaryWriter writer) @@ -83,8 +78,7 @@ public partial class MusicTransition : IBinarySerializable writer.Write(FadeInOffset); writer.Write((byte)AlignMode); writer.Write((byte)SyncPoint); - writer.Write(StartOffset); - writer.Write(EndOffset); + writer.Write((byte)SyncSegment); } } diff --git a/Assets/Scripts/OCES/Audio/HandWritten/HandWrittenDefinitions.cs b/Assets/Scripts/OCES/Audio/HandWritten/HandWrittenDefinitions.cs index e7a199f..44cb83b 100644 --- a/Assets/Scripts/OCES/Audio/HandWritten/HandWrittenDefinitions.cs +++ b/Assets/Scripts/OCES/Audio/HandWritten/HandWrittenDefinitions.cs @@ -65,6 +65,12 @@ namespace OCES.Audio Start, SameAsCurrentSegment, } + + public enum SyncSegment + { + Start, + LastPlayedSegment, + } public interface IBinarySerializable { diff --git a/Assets/Scripts/OCES/Audio/HandWritten/LongAudio/MusicContainerPlayer.cs b/Assets/Scripts/OCES/Audio/HandWritten/LongAudio/MusicContainerPlayer.cs index 4150b1c..085add0 100644 --- a/Assets/Scripts/OCES/Audio/HandWritten/LongAudio/MusicContainerPlayer.cs +++ b/Assets/Scripts/OCES/Audio/HandWritten/LongAudio/MusicContainerPlayer.cs @@ -289,8 +289,11 @@ namespace OCES.Audio yield return new WaitUntil(() => done || parentHandle.Cancelled); - if (parentHandle.Cancelled && child != null) - Stop(child); + if (!parentHandle.Cancelled || child == null) + yield break; + Stop(child); + parentHandle.ChildHandles.Remove(child); + } /// @@ -333,20 +336,28 @@ namespace OCES.Audio var handle = new ContainerPlayHandle(); handle.ActiveSources.Add(source); handle.Coroutine = this.m_coroutineHost.StartCoroutine( - WaitSegmentFinish(source, handle, onFinished)); + WaitSegmentFinish(source, handle, onFinished, segment.EndOffset)); return handle; } - IEnumerator WaitSegmentFinish(AudioSource source, ContainerPlayHandle handle, Action onFinished) + IEnumerator WaitSegmentFinish(AudioSource source, ContainerPlayHandle handle, Action onFinished, double endOffset) { + double effectiveTime = endOffset > 0f ? source.clip.length - endOffset : 0f; + + // 1. 等待"逻辑结束"(EndOffset 或自然结束) + yield return new WaitWhile(() => + source.isPlaying && + !handle.Cancelled && + source.time < effectiveTime); + + // 2. 立即通知 container 推进 + if (!handle.Cancelled) onFinished?.Invoke(); + + // 3. 如果 source 还在物理播放(EndOffset 提前退出的情况),等它自然结束并清理资源 yield return new WaitWhile(() => source.isPlaying && !handle.Cancelled); - - source.Stop(); ReturnSource(source); handle.ActiveSources.Remove(source); - if (!handle.Cancelled) - onFinished?.Invoke(); } // ───────────────────────────────────────────── diff --git a/ProjectSettings/AudioManager.asset b/ProjectSettings/AudioManager.asset index 90312f7..8c4ceb6 100644 --- a/ProjectSettings/AudioManager.asset +++ b/ProjectSettings/AudioManager.asset @@ -8,7 +8,7 @@ AudioManager: Rolloff Scale: 1 Doppler Factor: 1 Default Speaker Mode: 2 - m_SampleRate: 48000 + m_SampleRate: 44100 m_DSPBufferSize: 256 m_VirtualVoiceCount: 512 m_RealVoiceCount: 32