diff --git a/src/Beutl.Engine/Audio/Graph/AudioContext.cs b/src/Beutl.Engine/Audio/Graph/AudioContext.cs index b4bf48c52..1f4d1ea24 100644 --- a/src/Beutl.Engine/Audio/Graph/AudioContext.cs +++ b/src/Beutl.Engine/Audio/Graph/AudioContext.cs @@ -144,8 +144,6 @@ public GainNode CreateGainNode(IProperty gain) public ShiftNode CreateShiftNode(TimeSpan shift) { ThrowIfDisposed(); - if(shift < TimeSpan.Zero) - throw new ArgumentOutOfRangeException(nameof(shift), "Shift must be non-negative."); // Try to reuse from previous nodes if (_previousNodes != null) @@ -500,12 +498,16 @@ public void EndUpdate() ThrowIfDisposed(); // Dispose unused nodes from previous state - if (_previousNodes != null) + if (_previousNodes is { Count: > 0 }) { foreach (var prevNode in _previousNodes) { if (!_nodes.Contains(prevNode)) { + foreach (AudioNode node in _nodes) + { + node.RemoveInput(prevNode); + } prevNode.Dispose(); } } diff --git a/src/Beutl.Engine/Audio/Sound.cs b/src/Beutl.Engine/Audio/Sound.cs index a2665bb58..a9580948e 100644 --- a/src/Beutl.Engine/Audio/Sound.cs +++ b/src/Beutl.Engine/Audio/Sound.cs @@ -15,6 +15,8 @@ public Sound() ScanProperties(); } + public IProperty OffsetPosition { get; } = Property.Create(); + [Range(0, float.MaxValue)] public IProperty Gain { get; } = Property.CreateAnimatable(100f); @@ -39,8 +41,11 @@ public virtual void Compose(AudioContext context) // Create source node var sourceNode = context.CreateSourceNode(soundSource); + var shiftNode = context.CreateShiftNode(OffsetPosition.CurrentValue); + context.Connect(sourceNode, shiftNode); + var resampleNode = context.CreateResampleNode(soundSource.SampleRate); - context.Connect(sourceNode, resampleNode); + context.Connect(shiftNode, resampleNode); var speedNode = context.CreateSpeedNode(Speed); context.Connect(resampleNode, speedNode); diff --git a/src/Beutl.Engine/Audio/SourceSound.cs b/src/Beutl.Engine/Audio/SourceSound.cs index cdd0b6a4c..14522ab0d 100644 --- a/src/Beutl.Engine/Audio/SourceSound.cs +++ b/src/Beutl.Engine/Audio/SourceSound.cs @@ -12,8 +12,6 @@ public SourceSound() public IProperty Source { get; } = Property.Create(); - public IProperty OffsetPosition { get; } = Property.Create(); - protected override ISoundSource? GetSoundSource() { return Source.CurrentValue;