///|
/// Convert one finite interleaved buffer through the streaming engine.
/// The convenience API limits output to 16,777,216 samples (128 MiB payload).
/// Use Resampler with caller-owned blocks for longer audio.
pub fn resample(
config : Config,
input : ArrayView[Double],
) -> Result[Array[Double], ResampleError] {
let channels = config.channels
if input.length() % channels != 0 {
return Err(MisalignedInput)
}
for i in 0.. value
Err(error) => return Err(error)
}
if expected > 16777216L / channels.to_int64() {
return Err(ResourceLimit)
}
let result = Array::make(expected.to_int() * channels, 0.0)
let output = FixedArray::make(1024 * channels, 0.0)
let stream = Resampler::new(config)
let mut consumed = 0
let mut written = 0
while consumed < frames {
let end = (consumed + 1024).min(frames)
let progress = match
stream.process(input[consumed * channels:end * channels], output) {
Ok(progress) => progress
Err(error) => return Err(error)
}
if progress.consumed_frames == 0 && progress.produced_frames == 0 {
return Err(InvalidState)
}
consumed += progress.consumed_frames
for i in 0..<(progress.produced_frames * channels) {
result[written + i] = output[i]
}
written += progress.produced_frames * channels
}
while !stream.is_finished() {
let progress = match stream.finish(output) {
Ok(progress) => progress
Err(error) => return Err(error)
}
for i in 0..<(progress.produced_frames * channels) {
result[written + i] = output[i]
}
written += progress.produced_frames * channels
}
Ok(result)
}