From bc388303be09a82de6d604e15fa98be2ae45513d Mon Sep 17 00:00:00 2001 From: Oliver Wong Date: Fri, 8 May 2026 16:41:04 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=B5=8B=E8=AF=95=E6=96=87?= =?UTF-8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Resources/AudioData/MusicContainer.bytes | Bin 212 -> 212 bytes Assets/Resources/AudioData/MusicPath.bytes | Bin 84 -> 100 bytes Assets/Resources/AudioData/MusicSegment.bytes | Bin 290 -> 418 bytes .../Resources/AudioData/MusicTransition.bytes | Bin 190 -> 190 bytes Assets/Resources/Audios/30-number-1.wav | 3 + Assets/Resources/Audios/30-number-1.wav.meta | 23 +++++ Assets/Resources/Audios/30-number-2.wav | 3 + Assets/Resources/Audios/30-number-2.wav.meta | 23 +++++ Assets/Resources/Audios/30-number-3.wav | 3 + Assets/Resources/Audios/30-number-3.wav.meta | 23 +++++ Assets/Resources/Audios/30-number-4.wav | 3 + Assets/Resources/Audios/30-number-4.wav.meta | 23 +++++ Assets/Scenes/SampleScene.unity | 4 +- .../OCES/Audio/Generated/AudioConsts.cs | 3 +- StartOffset 测试清单.md | 84 ++++++++++++++++++ commit message draft.md | 4 + 16 files changed, 196 insertions(+), 3 deletions(-) create mode 100644 Assets/Resources/Audios/30-number-1.wav create mode 100644 Assets/Resources/Audios/30-number-1.wav.meta create mode 100644 Assets/Resources/Audios/30-number-2.wav create mode 100644 Assets/Resources/Audios/30-number-2.wav.meta create mode 100644 Assets/Resources/Audios/30-number-3.wav create mode 100644 Assets/Resources/Audios/30-number-3.wav.meta create mode 100644 Assets/Resources/Audios/30-number-4.wav create mode 100644 Assets/Resources/Audios/30-number-4.wav.meta create mode 100644 StartOffset 测试清单.md create mode 100644 commit message draft.md diff --git a/Assets/Resources/AudioData/MusicContainer.bytes b/Assets/Resources/AudioData/MusicContainer.bytes index 88087229b8ed601ef02cdde045726d1a5c1fef05..826947d016b762fb77bb7a36467fbe4597753ff4 100644 GIT binary patch delta 59 pcmcb@c!hDo0uycq2>Ab>f#HJ_vx&Y53sAt_iJyTHNb_Ko1ptS{3tIpH delta 24 ecmcb@c!hDo0!Frp`l6ifPW%jv3=9nHKn?&@Y6Ud_ diff --git a/Assets/Resources/AudioData/MusicPath.bytes b/Assets/Resources/AudioData/MusicPath.bytes index a426cfe3837686dda478c2624fb7b8aff60fff84..f2e27c27d3cf9e3b12e4b0ac6ac01e26e22d28ab 100644 GIT binary patch delta 52 rcmWGZk!53GU|M1R@S#3P|t(F_OFyM4ZC`LNhS% VqRJb?#9=fas=NtI97;1X005J{5rzN& delta 10 RcmZ3)yoiaBeIuhHBLEJ{0ww?e diff --git a/Assets/Resources/AudioData/MusicTransition.bytes b/Assets/Resources/AudioData/MusicTransition.bytes index 1aa12d8d2116fb4312d3b48d8a281c20fd0769a2..1a1b5df9c2fd02ae7683008b79a28bd1180b74c6 100644 GIT binary patch delta 17 WcmdnTxQ}syG&=(bFfmM2ngakMZ3BV; delta 17 XcmdnTxQ}syG`l?m5HK=MRGI?-CE^3Y diff --git a/Assets/Resources/Audios/30-number-1.wav b/Assets/Resources/Audios/30-number-1.wav new file mode 100644 index 0000000..bde2c6d --- /dev/null +++ b/Assets/Resources/Audios/30-number-1.wav @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:529a3317033959ce6d2eb19a92c082cb9b3d341db329efa9857249ae6400bdcc +size 2680354 diff --git a/Assets/Resources/Audios/30-number-1.wav.meta b/Assets/Resources/Audios/30-number-1.wav.meta new file mode 100644 index 0000000..51e0189 --- /dev/null +++ b/Assets/Resources/Audios/30-number-1.wav.meta @@ -0,0 +1,23 @@ +fileFormatVersion: 2 +guid: 534256c3d6f404a2f9c8c21a637da590 +AudioImporter: + externalObjects: {} + serializedVersion: 7 + defaultSettings: + serializedVersion: 2 + loadType: 0 + sampleRateSetting: 0 + sampleRateOverride: 44100 + compressionFormat: 1 + quality: 1 + conversionMode: 0 + preloadAudioData: 0 + platformSettingOverrides: {} + forceToMono: 0 + normalize: 1 + loadInBackground: 0 + ambisonic: 0 + 3D: 1 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/Audios/30-number-2.wav b/Assets/Resources/Audios/30-number-2.wav new file mode 100644 index 0000000..e495bd9 --- /dev/null +++ b/Assets/Resources/Audios/30-number-2.wav @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:21a99717d67e874c7c3ee72ca2712b83227e7d52266a4ef6f9d701dfe1caef5e +size 2680354 diff --git a/Assets/Resources/Audios/30-number-2.wav.meta b/Assets/Resources/Audios/30-number-2.wav.meta new file mode 100644 index 0000000..169f319 --- /dev/null +++ b/Assets/Resources/Audios/30-number-2.wav.meta @@ -0,0 +1,23 @@ +fileFormatVersion: 2 +guid: 9575587d5b2674abdb50a85876af1cff +AudioImporter: + externalObjects: {} + serializedVersion: 7 + defaultSettings: + serializedVersion: 2 + loadType: 0 + sampleRateSetting: 0 + sampleRateOverride: 44100 + compressionFormat: 1 + quality: 1 + conversionMode: 0 + preloadAudioData: 0 + platformSettingOverrides: {} + forceToMono: 0 + normalize: 1 + loadInBackground: 0 + ambisonic: 0 + 3D: 1 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/Audios/30-number-3.wav b/Assets/Resources/Audios/30-number-3.wav new file mode 100644 index 0000000..d33c023 --- /dev/null +++ b/Assets/Resources/Audios/30-number-3.wav @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:86b9e0ccf5781dba249a99782cc6d33b118a13ed1d9a19cab4de7aae053b339f +size 2680354 diff --git a/Assets/Resources/Audios/30-number-3.wav.meta b/Assets/Resources/Audios/30-number-3.wav.meta new file mode 100644 index 0000000..6353629 --- /dev/null +++ b/Assets/Resources/Audios/30-number-3.wav.meta @@ -0,0 +1,23 @@ +fileFormatVersion: 2 +guid: 72b8b58741dfc4283888c0db8fc50b85 +AudioImporter: + externalObjects: {} + serializedVersion: 7 + defaultSettings: + serializedVersion: 2 + loadType: 0 + sampleRateSetting: 0 + sampleRateOverride: 44100 + compressionFormat: 1 + quality: 1 + conversionMode: 0 + preloadAudioData: 0 + platformSettingOverrides: {} + forceToMono: 0 + normalize: 1 + loadInBackground: 0 + ambisonic: 0 + 3D: 1 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/Audios/30-number-4.wav b/Assets/Resources/Audios/30-number-4.wav new file mode 100644 index 0000000..c66849e --- /dev/null +++ b/Assets/Resources/Audios/30-number-4.wav @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6ba0749d0a20d98178c7c9bc0004d8613db040df315f85b83ed473919549f779 +size 2680354 diff --git a/Assets/Resources/Audios/30-number-4.wav.meta b/Assets/Resources/Audios/30-number-4.wav.meta new file mode 100644 index 0000000..ce0bfb8 --- /dev/null +++ b/Assets/Resources/Audios/30-number-4.wav.meta @@ -0,0 +1,23 @@ +fileFormatVersion: 2 +guid: e9950b0e480f34857949541778727e30 +AudioImporter: + externalObjects: {} + serializedVersion: 7 + defaultSettings: + serializedVersion: 2 + loadType: 0 + sampleRateSetting: 0 + sampleRateOverride: 44100 + compressionFormat: 1 + quality: 1 + conversionMode: 0 + preloadAudioData: 0 + platformSettingOverrides: {} + forceToMono: 0 + normalize: 1 + loadInBackground: 0 + ambisonic: 0 + 3D: 1 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scenes/SampleScene.unity b/Assets/Scenes/SampleScene.unity index 55be1e6..f928f9b 100644 --- a/Assets/Scenes/SampleScene.unity +++ b/Assets/Scenes/SampleScene.unity @@ -411,7 +411,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 2ce47fe7df364a8fa37501256e5b5155, type: 3} m_Name: m_EditorClassIdentifier: - targetGameState: 1 + targetGameState: 4 enableLowpass: 0 buttonText: {fileID: 17265520} --- !u!114 &392790006 @@ -1961,7 +1961,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 2ce47fe7df364a8fa37501256e5b5155, type: 3} m_Name: m_EditorClassIdentifier: - targetGameState: 4 + targetGameState: 5 enableLowpass: 0 buttonText: {fileID: 519563562} --- !u!114 &1542973985 diff --git a/Assets/Scripts/OCES/Audio/Generated/AudioConsts.cs b/Assets/Scripts/OCES/Audio/Generated/AudioConsts.cs index e470b83..decae6a 100644 --- a/Assets/Scripts/OCES/Audio/Generated/AudioConsts.cs +++ b/Assets/Scripts/OCES/Audio/Generated/AudioConsts.cs @@ -118,7 +118,8 @@ namespace OCES.Audio Game, // 关卡内 Win, // 胜利 Lose, // 失败 - Test, + Test_A, + Test_B, } } //public class Parameters diff --git a/StartOffset 测试清单.md b/StartOffset 测试清单.md new file mode 100644 index 0000000..95e22a4 --- /dev/null +++ b/StartOffset 测试清单.md @@ -0,0 +1,84 @@ +## 测试清单 + +### 测试优先级 + +1. ~~**P0 冒烟**:#1, #2, #5, #25(核心路径 + 回归)~~ +2. **P1 功能**:#9, #10, #13, #14, #16, #20(SyncPoint + BeatClock + Align) +3. **P2 边界**:#3, #4, #11, #18, #19, #23, #28, #29 +4. **P3 回归**:#6, #7, #8, #12, #15, #17, #21, #22, #26, #27, #30, #31 + +### 一、StartOffset 核心功能 + +| # | 测试场景 | 验证点 | 是否通过 | +|---|---------|-------|:--------:| +| 1 | 播放 StartOffset=5s 的 Segment | AudioClip 从 0 开始播放(可听到前奏);BeatClock 在 5s 后才触发第一次 Beat 回调 | ✅ +| 2 | 播放 StartOffset=0 的 Segment | 行为与改动前完全一致 | ✅ +| 3 | StartOffset + EndOffset 组合 | 播放到 `clip.length - EndOffset` 时 Segment 逻辑结束,物理播放继续到自然结束 | +| 4 | StartOffset 值大于 Clip 长度 | 应有合理降级(当前为 TODO,至少不崩溃) | + +### 二、循环播放 + +| # | 测试场景 | 验证点 | 是否通过 | +|---|---------|--------|:--------:| +| 5 | LoopCount=-1,StartOffset=5s | 第一轮从 0 播放;第二轮及之后从 5s 开始播放 | ✅ +| 6 | LoopCount=2,StartOffset=5s | 第一轮从 0 播放,第二轮从 5s 开始,播满 2 轮后停止 | +| 7 | LoopCount=-1,StartOffset=0 | 行为与改动前完全一致 | +| 8 | 循环时 BeatClock | 每次循环 BeatClock 重新启动,逻辑时间从 0 重新开始计数 | + +### 三、SyncPoint.SameAsCurrentSegment + +| # | 测试场景 | 验证点 | 是否通过 | +|---|---------|--------|:--------:| +| 9 | 旧 Container StartOffset=5s,播放到 15s 时切换;新 Container StartOffset=3s | 逻辑时长=15-5=10s;新位置=10+3=13s;新 AudioSource.timeSamples 对应 13s | ✅ | +| 10 | 旧 Container StartOffset=5s,播放到 3s 时切换(还没过 StartOffset) | 新 Container 从自身 StartOffset 开始播放 | ✅ | +| 11 | 计算出新位置 < 新 StartOffset | 新 Container 从自身 StartOffset 开始播放 | +| 12 | 旧 Container 无 StartOffset,新 Container 有 StartOffset | 旧 SourceStartOffset=0,计算逻辑正确 | + +### 四、SyncPoint.Start + +| # | 测试场景 | 验证点 | 是否通过 | +|---|---------|--------|:--------:| +| 13 | StartOffset=5s,FadeInTime=2s | AudioSource 从 3s 开始播放(5-2=3),淡入 2s 后刚好到 5s | +| 14 | StartOffset=1s,FadeInTime=3s | StartPlayTime=1-3=-2→0,从头开始淡入,忽略 StartOffset | +| 15 | StartOffset=5s,FadeInTime=0 | StartPlayTime=5,从 5s 开始播放(无淡入) | + +### 五、BeatClock 延迟启动 + +| # | 测试场景 | 验证点 | 是否通过 | +|---|---------|--------|:--------:| +| 16 | 首次启动 StartOffset=5s | BeatClock 等 5s 后才触发首次 Beat 回调 | +| 17 | 首次启动 StartOffset=0 | BeatClock 立即启动,行为不变 | +| 18 | 延迟期间调用 Stop() | BeatClock 立即停止,不触发任何回调 | +| 19 | SameAsCurrentSegment 切换时逻辑起点已过 | BeatClock 立即启动(delay<=0),从正确的逻辑时间继续 | + +### 六、对齐(AlignMode) + +| # | 测试场景 | 验证点 | 是否通过 | +|---|---------|--------|:--------:| +| 20 | AlignMode.Beat,StartOffset=5s | 对齐基于逻辑起点(m_startDspTime = dspTime + 5),不是物理起点 | +| 21 | AlignMode.Bar,StartOffset=5s | 同上 | +| 22 | 在 StartOffset 延迟期间调用 GetNextDspTime | 返回 m_startDspTime(逻辑起点),不会返回过去的时间 | + +### 七、Blend Container + +| # | 测试场景 | 验证点 | 是否通过 | +|---|---------|--------|:--------:| +| 23 | Blend Container 的子 Segment 有 StartOffset | GetEffectiveStartOffset 返回 0,isLoop=false,行为与改动前一致 | +| 24 | SyncPoint.SameAsCurrentSegment 降级 | Blend 不支持 SameAsCurrentSegment,降级为 Start(原有行为不变) | + +### 八、回归测试(无 StartOffset 时行为不变) + +| # | 测试场景 | 验证点 | 是否通过 +|---|---------|--------|:---:| +| 25 | 所有 Segment 的 StartOffset=0,EndOffset=0 | 全流程与改动前一致:播放、循环、切换、SyncPoint、FadeIn/Out | ✅ +| 26 | Segment 只有 EndOffset,无 StartOffset | WaitSegmentFinish 到达 effectiveTime 后通知 container 推进 | +| 27 | AmbienceChannelPlayer | 不涉及 BeatClock,StartOffset 仅影响 PlaySegment 的 isLoop 跳转,需确认无副作用 | + +### 九、Sequence/Random Container 内多个 Segment + +| # | 测试场景 | 验证点 | 是否通过 | +|---|---------|--------|:--------:| +| 28 | Sequence Container,3 个 Segment 各有不同 StartOffset,首次播放 | 所有 Segment 从 0 开始播放 | +| 29 | 同上,LoopCount=-1 | 第二轮起所有 Segment 从各自 StartOffset 开始 | +| 30 | Random Container,循环时 | 选中 Segment 从其 StartOffset 开始 | +| 31 | Step Sequence Container | 每次切 Segment 时 isLoop 传递正确 | \ No newline at end of file diff --git a/commit message draft.md b/commit message draft.md new file mode 100644 index 0000000..93fcc8c --- /dev/null +++ b/commit message draft.md @@ -0,0 +1,4 @@ +feat: StartOffset + +- 实现startOffset +- 修复EndOffset = 0 + 循环播放时,音乐会大量重复播放的错误 \ No newline at end of file