feature: Segment end offset

This commit is contained in:
2026-04-21 17:25:48 +08:00
parent a4dee6d59b
commit e0ab4e4f7e
13 changed files with 53 additions and 28 deletions
Binary file not shown.
Binary file not shown.
@@ -11,7 +11,7 @@ AudioImporter:
compressionFormat: 1 compressionFormat: 1
quality: 0.5 quality: 0.5
conversionMode: 0 conversionMode: 0
preloadAudioData: 1 preloadAudioData: 0
platformSettingOverrides: {} platformSettingOverrides: {}
forceToMono: 0 forceToMono: 0
normalize: 1 normalize: 1
@@ -11,7 +11,7 @@ AudioImporter:
compressionFormat: 1 compressionFormat: 1
quality: 0.5 quality: 0.5
conversionMode: 0 conversionMode: 0
preloadAudioData: 1 preloadAudioData: 0
platformSettingOverrides: {} platformSettingOverrides: {}
forceToMono: 0 forceToMono: 0
normalize: 1 normalize: 1
@@ -1,17 +1,17 @@
fileFormatVersion: 2 fileFormatVersion: 2
guid: c084ace48a6004923bb9d762a2a31908 guid: 8b55a0f62ff1a4f6cb7e68410bc51eac
AudioImporter: AudioImporter:
externalObjects: {} externalObjects: {}
serializedVersion: 7 serializedVersion: 7
defaultSettings: defaultSettings:
serializedVersion: 2 serializedVersion: 2
loadType: 0 loadType: 2
sampleRateSetting: 2 sampleRateSetting: 2
sampleRateOverride: 44100 sampleRateOverride: 44100
compressionFormat: 1 compressionFormat: 1
quality: 0.13 quality: 0.13
conversionMode: 0 conversionMode: 0
preloadAudioData: 0 preloadAudioData: 1
platformSettingOverrides: {} platformSettingOverrides: {}
forceToMono: 0 forceToMono: 0
normalize: 1 normalize: 1
@@ -1,17 +1,17 @@
fileFormatVersion: 2 fileFormatVersion: 2
guid: 6f16847f355c146d4a93c6199bae1e22 guid: e7261e35dead34c2493620079319c598
AudioImporter: AudioImporter:
externalObjects: {} externalObjects: {}
serializedVersion: 7 serializedVersion: 7
defaultSettings: defaultSettings:
serializedVersion: 2 serializedVersion: 2
loadType: 0 loadType: 2
sampleRateSetting: 2 sampleRateSetting: 2
sampleRateOverride: 44100 sampleRateOverride: 44100
compressionFormat: 1 compressionFormat: 1
quality: 0.13 quality: 0.13
conversionMode: 0 conversionMode: 0
preloadAudioData: 0 preloadAudioData: 1
platformSettingOverrides: {} platformSettingOverrides: {}
forceToMono: 0 forceToMono: 0
normalize: 1 normalize: 1
@@ -22,17 +22,31 @@ public partial class MusicSegment : IBinarySerializable
/// </summary> /// </summary>
public string Name { get; set; } public string Name { get; set; }
/// <summary>
/// time(s)
/// </summary>
public double StartOffset { get; set; }
/// <summary>
/// time(s)
/// </summary>
public double EndOffset { get; set; }
public void DeSerialize(BinaryReader reader) public void DeSerialize(BinaryReader reader)
{ {
Id = reader.ReadUInt32(); Id = reader.ReadUInt32();
Name = reader.ReadString(); Name = reader.ReadString();
StartOffset = reader.ReadDouble();
EndOffset = reader.ReadDouble();
} }
public void Serialize(BinaryWriter writer) public void Serialize(BinaryWriter writer)
{ {
writer.Write(Id); writer.Write(Id);
writer.Write(Name); writer.Write(Name);
writer.Write(StartOffset);
writer.Write(EndOffset);
} }
} }
@@ -51,14 +51,10 @@ public partial class MusicTransition : IBinarySerializable
public SyncPoint SyncPoint { get; set; } public SyncPoint SyncPoint { get; set; }
/// <summary> /// <summary>
/// samples /// 0 = Start
/// 1 = Last Played Segment
/// </summary> /// </summary>
public uint StartOffset { get; set; } public SyncSegment SyncSegment { get; set; }
/// <summary>
/// samples
/// </summary>
public uint EndOffset { get; set; }
public void DeSerialize(BinaryReader reader) public void DeSerialize(BinaryReader reader)
@@ -70,8 +66,7 @@ public partial class MusicTransition : IBinarySerializable
FadeInOffset = reader.ReadSingle(); FadeInOffset = reader.ReadSingle();
AlignMode = (AlignMode)reader.ReadByte(); AlignMode = (AlignMode)reader.ReadByte();
SyncPoint = (SyncPoint)reader.ReadByte(); SyncPoint = (SyncPoint)reader.ReadByte();
StartOffset = reader.ReadUInt32(); SyncSegment = (SyncSegment)reader.ReadByte();
EndOffset = reader.ReadUInt32();
} }
public void Serialize(BinaryWriter writer) public void Serialize(BinaryWriter writer)
@@ -83,8 +78,7 @@ public partial class MusicTransition : IBinarySerializable
writer.Write(FadeInOffset); writer.Write(FadeInOffset);
writer.Write((byte)AlignMode); writer.Write((byte)AlignMode);
writer.Write((byte)SyncPoint); writer.Write((byte)SyncPoint);
writer.Write(StartOffset); writer.Write((byte)SyncSegment);
writer.Write(EndOffset);
} }
} }
@@ -66,6 +66,12 @@ namespace OCES.Audio
SameAsCurrentSegment, SameAsCurrentSegment,
} }
public enum SyncSegment
{
Start,
LastPlayedSegment,
}
public interface IBinarySerializable public interface IBinarySerializable
{ {
void DeSerialize(BinaryReader reader); void DeSerialize(BinaryReader reader);
@@ -289,8 +289,11 @@ namespace OCES.Audio
yield return new WaitUntil(() => done || parentHandle.Cancelled); yield return new WaitUntil(() => done || parentHandle.Cancelled);
if (parentHandle.Cancelled && child != null) if (!parentHandle.Cancelled || child == null)
Stop(child); yield break;
Stop(child);
parentHandle.ChildHandles.Remove(child);
} }
/// <summary> /// <summary>
@@ -333,20 +336,28 @@ namespace OCES.Audio
var handle = new ContainerPlayHandle(); var handle = new ContainerPlayHandle();
handle.ActiveSources.Add(source); handle.ActiveSources.Add(source);
handle.Coroutine = this.m_coroutineHost.StartCoroutine( handle.Coroutine = this.m_coroutineHost.StartCoroutine(
WaitSegmentFinish(source, handle, onFinished)); WaitSegmentFinish(source, handle, onFinished, segment.EndOffset));
return handle; 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); yield return new WaitWhile(() => source.isPlaying && !handle.Cancelled);
source.Stop(); source.Stop();
ReturnSource(source); ReturnSource(source);
handle.ActiveSources.Remove(source); handle.ActiveSources.Remove(source);
if (!handle.Cancelled)
onFinished?.Invoke();
} }
// ───────────────────────────────────────────── // ─────────────────────────────────────────────
+1 -1
View File
@@ -8,7 +8,7 @@ AudioManager:
Rolloff Scale: 1 Rolloff Scale: 1
Doppler Factor: 1 Doppler Factor: 1
Default Speaker Mode: 2 Default Speaker Mode: 2
m_SampleRate: 48000 m_SampleRate: 44100
m_DSPBufferSize: 256 m_DSPBufferSize: 256
m_VirtualVoiceCount: 512 m_VirtualVoiceCount: 512
m_RealVoiceCount: 32 m_RealVoiceCount: 32