Function convolution_ transition_ with_ continuity
pub fn convolution_transition_with_continuity<E: TransitionEngine>(
initial: Box<E>,
maximum_frames: usize,
options: TransitionOptions,
continuity: TransitionContinuity,
) -> Result<(ConvolutionTransitionControl<E>, ConvolutionTransition<E>), TransitionSetupError<E>>Expand description
convolution_transition with explicit TransitionContinuity policies
(CONTROL). Additionally prepares, before returning, a history ring of
channels * frames samples for PrimingPolicy::History and two delay lines
of channels * (maximum_difference + maximum_frames) samples for
AlignmentPolicy::DelayLower. All lengths and the total
(TRANSITION_MAXIMUM_CONTINUITY_BYTES) are checked before any allocation,
storage is reserved fallibly, and a refusal returns the initial engine
unchanged. TransitionContinuity::NONE allocates nothing extra and behaves
exactly like convolution_transition.
use ravet_graph::{
AlignmentPolicy, CrossfadeLaw, CrossfadePolicy, LatencyPolicy, MidFadePolicy,
PrimingPolicy, TransitionContinuity, TransitionOptions,
convolution_transition_with_continuity,
};
use ravet_signal::{ConvolutionPartitioning, Convolver64};
let zero = ConvolutionPartitioning::ZeroLatency { head: 16 };
let delayed = ConvolutionPartitioning::UniformDelayed { partition: 16 };
let first = Box::new(Convolver64::new(&[1.0, 1.0], zero, 64, 1 << 20).unwrap());
let options = TransitionOptions {
crossfade: CrossfadePolicy { frames: 8, law: CrossfadeLaw::EqualGain },
mid_fade: MidFadePolicy::Refuse,
latency: LatencyPolicy::Report,
};
let continuity = TransitionContinuity {
priming: PrimingPolicy::History { frames: 64, frames_per_block: 64 },
alignment: AlignmentPolicy::DelayLower { maximum_difference: 32 },
};
let (mut control, mut audio) =
convolution_transition_with_continuity(first, 64, options, continuity).unwrap();
let input = [1.0; 32];
let mut output = [0.0; 32];
audio.process(&[&input], &mut [&mut output], 32).unwrap();
// Worker: a 16-frame-latency replacement with the same response.
let next = Box::new(Convolver64::new(&[1.0, 1.0], delayed, 64, 1 << 20).unwrap());
control.offer(next).unwrap();
let status = audio.process(&[&input], &mut [&mut output], 32).unwrap();
// Primed from the recorded input, the old path delayed by 16 frames: the
// fade blends identical steady-state signals (to FFT rounding).
assert_eq!(status.primed_frames, 32);
assert_eq!(status.output_latency_change, Some((0, 16)));
assert_eq!(audio.output_latency_samples(), Some(16));
assert!(output.iter().all(|y| (y - 2.0).abs() < 1e-12));