feature: Segment end offset
This commit is contained in:
@@ -22,17 +22,31 @@ public partial class MusicSegment : IBinarySerializable
|
||||
/// </summary>
|
||||
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)
|
||||
{
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -51,14 +51,10 @@ public partial class MusicTransition : IBinarySerializable
|
||||
public SyncPoint SyncPoint { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// samples
|
||||
/// 0 = Start
|
||||
/// 1 = Last Played Segment
|
||||
/// </summary>
|
||||
public uint StartOffset { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// samples
|
||||
/// </summary>
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -65,6 +65,12 @@ namespace OCES.Audio
|
||||
Start,
|
||||
SameAsCurrentSegment,
|
||||
}
|
||||
|
||||
public enum SyncSegment
|
||||
{
|
||||
Start,
|
||||
LastPlayedSegment,
|
||||
}
|
||||
|
||||
public interface IBinarySerializable
|
||||
{
|
||||
|
||||
@@ -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);
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
// ─────────────────────────────────────────────
|
||||
|
||||
Reference in New Issue
Block a user