Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
877cee5
feat(engine): report audio effect/node latency for lookahead effects
yuto-trd Jun 23, 2026
6c63c83
test(engine): guard GetTotalLatencySamples sampleRate at the entry point
yuto-trd Jun 23, 2026
8e1255e
feat(engine): compensate lookahead tail loss via a node Flush contract
yuto-trd Jun 23, 2026
90bf840
fix(engine): apply downstream processing and fan-in to flushed tails
yuto-trd Jun 23, 2026
91559e9
fix(engine): dispose drained buffer if ProcessTail throws in Flush
yuto-trd Jun 23, 2026
92830a7
fix(engine): report worst-case animated latency on LimiterEffect too
yuto-trd Jun 23, 2026
7f61a94
fix(engine): remap nested ClipNode flush to clip-local time
yuto-trd Jun 24, 2026
d1a2025
fix(engine): flush a trimmed nested clip from its last processed time
yuto-trd Jun 25, 2026
514d013
fix(engine): continue a nested clip drain after a partial tail append
yuto-trd Jun 25, 2026
4e3709e
fix(engine): advance clip-local drain state on nested ClipNode Flush
yuto-trd Jun 25, 2026
18e7e14
fix(engine): drain limiter tail at retained lookahead under animation
yuto-trd Jun 25, 2026
c869759
fix(engine): skip dead branches when flushing a SoundGroup mixer
yuto-trd Jun 25, 2026
701faf4
fix(engine): flush a sound's tail when it ends on a compose boundary
yuto-trd Jun 25, 2026
bffc3ec
fix(engine): gate AudioEffectGroup latency on its own IsEnabled
yuto-trd Jun 25, 2026
c029568
test(engine): pin Composer flush-suppression guards; document SpeedNo…
yuto-trd Jul 3, 2026
61ae3ef
fix: address audio latency review feedback
yuto-trd Jul 26, 2026
05b8d84
refactor!: require composition eligibility snapshots
yuto-trd Jul 26, 2026
dfeca8e
fix: preserve audio tails across graph transitions
yuto-trd Jul 26, 2026
06a023e
refactor!: clarify audio flush and eligibility contracts
yuto-trd Jul 26, 2026
215e7ae
fix: scale audio tail budgets through speed changes
yuto-trd Jul 26, 2026
e64d0a7
fix: keep speed source reads sample-exact
yuto-trd Jul 26, 2026
9f5635b
fix: saturate grouped audio effect latency
yuto-trd Jul 26, 2026
e755eb3
fix: discard cached audio tails after sound moves
yuto-trd Jul 26, 2026
5c1e504
fix(review): harden audio cache and input updates
yuto-trd Jul 27, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions src/Beutl.Engine/Animation/Easings/BackEaseIn.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,15 @@

public sealed class BackEaseIn : Easing
{
public override bool TryGetOutputRange(out float minimum, out float maximum)
{
// p^3 - p*sin(pi*p), with p in [0,1]. Since p^3 - p is minimized at
// -2/(3*sqrt(3)) ~= -0.3849 and sin(pi*p) <= 1, [-0.39, 1] is conservative.
minimum = -0.39f;
maximum = 1;
return true;
}

public override float Ease(float progress)
{
return Funcs.BackEaseIn(progress);
Expand Down
7 changes: 7 additions & 0 deletions src/Beutl.Engine/Animation/Easings/BackEaseInOut.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,13 @@

public sealed class BackEaseInOut : Easing
{
public override bool TryGetOutputRange(out float minimum, out float maximum)
{
minimum = -0.195f;
maximum = 1.195f;
return true;
}

public override float Ease(float progress)
{
return Funcs.BackEaseInOut(progress);
Expand Down
7 changes: 7 additions & 0 deletions src/Beutl.Engine/Animation/Easings/BackEaseOut.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,13 @@

public sealed class BackEaseOut : Easing
{
public override bool TryGetOutputRange(out float minimum, out float maximum)
{
minimum = 0;
maximum = 1.39f;
return true;
}

public override float Ease(float progress)
{
return Funcs.BackEaseOut(progress);
Expand Down
2 changes: 1 addition & 1 deletion src/Beutl.Engine/Animation/Easings/BounceEaseIn.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
namespace Beutl.Animation.Easings;

public sealed class BounceEaseIn : Easing
public sealed class BounceEaseIn : UnitRangeEasing
{
public override float Ease(float progress)
{
Expand Down
2 changes: 1 addition & 1 deletion src/Beutl.Engine/Animation/Easings/BounceEaseInOut.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
namespace Beutl.Animation.Easings;

public sealed class BounceEaseInOut : Easing
public sealed class BounceEaseInOut : UnitRangeEasing
{
public override float Ease(float progress)
{
Expand Down
2 changes: 1 addition & 1 deletion src/Beutl.Engine/Animation/Easings/BounceEaseOut.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
namespace Beutl.Animation.Easings;

public sealed class BounceEaseOut : Easing
public sealed class BounceEaseOut : UnitRangeEasing
{
public override float Ease(float progress)
{
Expand Down
2 changes: 1 addition & 1 deletion src/Beutl.Engine/Animation/Easings/CircularEaseIn.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
namespace Beutl.Animation.Easings;

public sealed class CircularEaseIn : Easing
public sealed class CircularEaseIn : UnitRangeEasing
{
public override float Ease(float progress)
{
Expand Down
2 changes: 1 addition & 1 deletion src/Beutl.Engine/Animation/Easings/CircularEaseInOut.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
namespace Beutl.Animation.Easings;

public sealed class CircularEaseInOut : Easing
public sealed class CircularEaseInOut : UnitRangeEasing
{
public override float Ease(float progress)
{
Expand Down
2 changes: 1 addition & 1 deletion src/Beutl.Engine/Animation/Easings/CircularEaseOut.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
namespace Beutl.Animation.Easings;

public sealed class CircularEaseOut : Easing
public sealed class CircularEaseOut : UnitRangeEasing
{
public override float Ease(float progress)
{
Expand Down
2 changes: 1 addition & 1 deletion src/Beutl.Engine/Animation/Easings/CubicEaseIn.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
namespace Beutl.Animation.Easings;

public sealed class CubicEaseIn : Easing
public sealed class CubicEaseIn : UnitRangeEasing
{
public override float Ease(float progress)
{
Expand Down
2 changes: 1 addition & 1 deletion src/Beutl.Engine/Animation/Easings/CubicEaseInOut.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
namespace Beutl.Animation.Easings;

public sealed class CubicEaseInOut : Easing
public sealed class CubicEaseInOut : UnitRangeEasing
{
public override float Ease(float progress)
{
Expand Down
2 changes: 1 addition & 1 deletion src/Beutl.Engine/Animation/Easings/CubicEaseOut.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
namespace Beutl.Animation.Easings;

public sealed class CubicEaseOut : Easing
public sealed class CubicEaseOut : UnitRangeEasing
{
public override float Ease(float progress)
{
Expand Down
15 changes: 15 additions & 0 deletions src/Beutl.Engine/Animation/Easings/Easing.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,19 @@
public abstract class Easing
{
public abstract float Ease(float progress);

/// <summary>
/// Tries to provide conservative bounds for every value <see cref="Ease"/> can return when
/// <c>progress</c> is in the inclusive range [0, 1].
/// </summary>
/// <remarks>
/// Custom easings should override this when they can prove finite bounds. Consumers must treat
/// <see langword="false"/> as unbounded rather than estimating the range by sampling.
/// </remarks>
public virtual bool TryGetOutputRange(out float minimum, out float maximum)
{
minimum = default;
maximum = default;
return false;
}
}
7 changes: 7 additions & 0 deletions src/Beutl.Engine/Animation/Easings/ElasticEaseIn.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,13 @@

public sealed class ElasticEaseIn : Easing
{
public override bool TryGetOutputRange(out float minimum, out float maximum)
{
minimum = -1;
maximum = 1;
return true;
}

public override float Ease(float progress)
{
return Funcs.ElasticEaseIn(progress);
Expand Down
7 changes: 7 additions & 0 deletions src/Beutl.Engine/Animation/Easings/ElasticEaseInOut.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,13 @@

public sealed class ElasticEaseInOut : Easing
{
public override bool TryGetOutputRange(out float minimum, out float maximum)
{
minimum = -0.5f;
maximum = 1.5f;
return true;
}

public override float Ease(float progress)
{
return Funcs.ElasticEaseInOut(progress);
Expand Down
7 changes: 7 additions & 0 deletions src/Beutl.Engine/Animation/Easings/ElasticEaseOut.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,13 @@

public sealed class ElasticEaseOut : Easing
{
public override bool TryGetOutputRange(out float minimum, out float maximum)
{
minimum = 0;
maximum = 2;
return true;
}

public override float Ease(float progress)
{
return Funcs.ElasticEaseOut(progress);
Expand Down
2 changes: 1 addition & 1 deletion src/Beutl.Engine/Animation/Easings/ExponentialEaseIn.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
namespace Beutl.Animation.Easings;

public sealed class ExponentialEaseIn : Easing
public sealed class ExponentialEaseIn : UnitRangeEasing
{
public override float Ease(float progress)
{
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
namespace Beutl.Animation.Easings;

public sealed class ExponentialEaseInOut : Easing
public sealed class ExponentialEaseInOut : UnitRangeEasing
{
public override float Ease(float progress)
{
Expand Down
2 changes: 1 addition & 1 deletion src/Beutl.Engine/Animation/Easings/ExponentialEaseOut.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
namespace Beutl.Animation.Easings;

public sealed class ExponentialEaseOut : Easing
public sealed class ExponentialEaseOut : UnitRangeEasing
{
public override float Ease(float progress)
{
Expand Down
2 changes: 1 addition & 1 deletion src/Beutl.Engine/Animation/Easings/HoldEasing.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
namespace Beutl.Animation.Easings;

public sealed class HoldEasing : Easing
public sealed class HoldEasing : UnitRangeEasing
{
public override float Ease(float progress)
{
Expand Down
2 changes: 1 addition & 1 deletion src/Beutl.Engine/Animation/Easings/LinearEasing.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
namespace Beutl.Animation.Easings;

public sealed class LinearEasing : Easing
public sealed class LinearEasing : UnitRangeEasing
{
public override float Ease(float progress)
{
Expand Down
2 changes: 1 addition & 1 deletion src/Beutl.Engine/Animation/Easings/QuadraticEaseIn.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
namespace Beutl.Animation.Easings;

public sealed class QuadraticEaseIn : Easing
public sealed class QuadraticEaseIn : UnitRangeEasing
{
public override float Ease(float progress)
{
Expand Down
2 changes: 1 addition & 1 deletion src/Beutl.Engine/Animation/Easings/QuadraticEaseInOut.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
namespace Beutl.Animation.Easings;

public sealed class QuadraticEaseInOut : Easing
public sealed class QuadraticEaseInOut : UnitRangeEasing
{
public override float Ease(float progress)
{
Expand Down
2 changes: 1 addition & 1 deletion src/Beutl.Engine/Animation/Easings/QuadraticEaseOut.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
namespace Beutl.Animation.Easings;

public sealed class QuadraticEaseOut : Easing
public sealed class QuadraticEaseOut : UnitRangeEasing
{
public override float Ease(float progress)
{
Expand Down
2 changes: 1 addition & 1 deletion src/Beutl.Engine/Animation/Easings/QuarticEaseIn.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
namespace Beutl.Animation.Easings;

public sealed class QuarticEaseIn : Easing
public sealed class QuarticEaseIn : UnitRangeEasing
{
public override float Ease(float progress)
{
Expand Down
2 changes: 1 addition & 1 deletion src/Beutl.Engine/Animation/Easings/QuarticEaseInOut.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
namespace Beutl.Animation.Easings;

public sealed class QuarticEaseInOut : Easing
public sealed class QuarticEaseInOut : UnitRangeEasing
{
public override float Ease(float progress)
{
Expand Down
2 changes: 1 addition & 1 deletion src/Beutl.Engine/Animation/Easings/QuarticEaseOut.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
namespace Beutl.Animation.Easings;

public sealed class QuarticEaseOut : Easing
public sealed class QuarticEaseOut : UnitRangeEasing
{
public override float Ease(float progress)
{
Expand Down
2 changes: 1 addition & 1 deletion src/Beutl.Engine/Animation/Easings/QuinticEaseIn.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
namespace Beutl.Animation.Easings;

public sealed class QuinticEaseIn : Easing
public sealed class QuinticEaseIn : UnitRangeEasing
{
public override float Ease(float progress)
{
Expand Down
2 changes: 1 addition & 1 deletion src/Beutl.Engine/Animation/Easings/QuinticEaseInOut.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
namespace Beutl.Animation.Easings;

public sealed class QuinticEaseInOut : Easing
public sealed class QuinticEaseInOut : UnitRangeEasing
{
public override float Ease(float progress)
{
Expand Down
2 changes: 1 addition & 1 deletion src/Beutl.Engine/Animation/Easings/QuinticEaseOut.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
namespace Beutl.Animation.Easings;

public sealed class QuinticEaseOut : Easing
public sealed class QuinticEaseOut : UnitRangeEasing
{
public override float Ease(float progress)
{
Expand Down
2 changes: 1 addition & 1 deletion src/Beutl.Engine/Animation/Easings/SineEaseIn.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
namespace Beutl.Animation.Easings;

public sealed class SineEaseIn : Easing
public sealed class SineEaseIn : UnitRangeEasing
{
public override float Ease(float progress)
{
Expand Down
2 changes: 1 addition & 1 deletion src/Beutl.Engine/Animation/Easings/SineEaseInOut.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
namespace Beutl.Animation.Easings;

public sealed class SineEaseInOut : Easing
public sealed class SineEaseInOut : UnitRangeEasing
{
public override float Ease(float progress)
{
Expand Down
2 changes: 1 addition & 1 deletion src/Beutl.Engine/Animation/Easings/SineEaseOut.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
namespace Beutl.Animation.Easings;

public sealed class SineEaseOut : Easing
public sealed class SineEaseOut : UnitRangeEasing
{
public override float Ease(float progress)
{
Expand Down
8 changes: 8 additions & 0 deletions src/Beutl.Engine/Animation/Easings/SplineEasing.cs
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,14 @@ public float Y2

private readonly KeySpline _internalKeySpline;

public override bool TryGetOutputRange(out float minimum, out float maximum)
{
// A cubic Bézier curve stays inside the convex hull of its control points.
minimum = Math.Min(0, Math.Min(Y1, Math.Min(Y2, 1)));
maximum = Math.Max(0, Math.Max(Y1, Math.Max(Y2, 1)));
return float.IsFinite(minimum) && float.IsFinite(maximum);
}

public override float Ease(float progress)
{
return _internalKeySpline.GetSplineProgress(progress);
Expand Down
12 changes: 12 additions & 0 deletions src/Beutl.Engine/Animation/Easings/UnitRangeEasing.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
namespace Beutl.Animation.Easings;

/// <summary>An easing whose output is guaranteed to stay in [0, 1] for progress in [0, 1].</summary>
public abstract class UnitRangeEasing : Easing
{
public sealed override bool TryGetOutputRange(out float minimum, out float maximum)
{
minimum = 0;
maximum = 1;
return true;
}
}
Loading
Loading