diff --git a/Assets/Resources/AudioData/MusicSegment.bytes b/Assets/Resources/AudioData/MusicSegment.bytes index a00a00c..8eb793f 100644 Binary files a/Assets/Resources/AudioData/MusicSegment.bytes and b/Assets/Resources/AudioData/MusicSegment.bytes differ diff --git a/Assets/Resources/AudioData/MusicTransition.bytes b/Assets/Resources/AudioData/MusicTransition.bytes index c711ef8..76e3f29 100644 Binary files a/Assets/Resources/AudioData/MusicTransition.bytes and b/Assets/Resources/AudioData/MusicTransition.bytes differ 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/music_game_loop.wav b/Assets/Resources/Audios/au_music_game_loop.wav similarity index 57% rename from Assets/Resources/Audios/music_game_loop.wav rename to Assets/Resources/Audios/au_music_game_loop.wav index ebc8c1f..9b84efa 100644 Binary files a/Assets/Resources/Audios/music_game_loop.wav and b/Assets/Resources/Audios/au_music_game_loop.wav differ 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/music_home_loop.wav b/Assets/Resources/Audios/au_music_home_loop.wav similarity index 57% rename from Assets/Resources/Audios/music_home_loop.wav rename to Assets/Resources/Audios/au_music_home_loop.wav index 3f49d87..2f6ab82 100644 Binary files a/Assets/Resources/Audios/music_home_loop.wav and b/Assets/Resources/Audios/au_music_home_loop.wav differ 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/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