feature: Segment end offset
This commit is contained in:
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
|
||||||
|
|||||||
BIN
Binary file not shown.
+3
-3
@@ -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
|
||||||
BIN
Binary file not shown.
+3
-3
@@ -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)
|
||||||
|
yield break;
|
||||||
Stop(child);
|
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();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ─────────────────────────────────────────────
|
// ─────────────────────────────────────────────
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user