///|
/// 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)
}
///|
/// Convert a complete buffer into caller-owned storage; return output frames.
/// The output tail is untouched. Alignment, finite inputs, sample budget and
/// capacity are checked before any writes. NumericOverflow may leave partial
/// output; discard it on error. Input/output must not alias.
pub fn resample_into(
config : Config,
input : ArrayView[Double],
output_buffer : FixedArray[Double],
) -> Result[Int, ResampleError] {
let channels = config.channels
if input.length() % channels != 0 {
return Err(MisalignedInput)
}
if output_buffer.length() % channels != 0 {
return Err(MisalignedOutput)
}
for i in 0.. value
Err(error) => return Err(error)
}
if expected > 16777216L / channels.to_int64() {
return Err(ResourceLimit)
}
if expected > (output_buffer.length() / channels).to_int64() {
return Err(ResourceLimit)
}
let result = output_buffer
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(expected.to_int())
}