Skip to content

Commit fb96f50

Browse files
committed
Update dependencies, improve tests, bump to v2.0
1 parent f1207d1 commit fb96f50

9 files changed

Lines changed: 114 additions & 41 deletions

File tree

Cargo.toml

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
[package]
22
name = "rubato"
3-
version = "1.0.1"
4-
rust-version = "1.74"
3+
version = "2.0.0"
4+
rust-version = "1.85"
55
authors = ["HEnquist <henrik.enquist@gmail.com>"]
66
description = "Asynchronous resampling library intended for audio data"
77
license = "MIT"
@@ -25,24 +25,24 @@ realfft = { version = "3.5.0", optional = true }
2525
num-complex = { version = "0.4", optional = true }
2626
num-integer = "0.1.45"
2727
num-traits = "0.2"
28-
#audioadapter = {version = "2.0.0", path = "../audioadapter-rs/audioadapter"}
29-
audioadapter = "2.0"
30-
#audioadapter-buffers = {version = "2.0.0", path = "../audioadapter-rs/audioadapter-buffers"}
31-
audioadapter-buffers = "2.0"
28+
#audioadapter = {version = "3.0.0", path = "../audioadapter-rs/audioadapter"}
29+
audioadapter = "3.0"
30+
#audioadapter-buffers = {version = "3.0.0", path = "../audioadapter-rs/audioadapter-buffers"}
31+
audioadapter-buffers = "3.0"
3232
visibility = "0.1.1"
3333
windowfunctions = "0.1.1"
3434

3535
[dev-dependencies]
36-
env_logger = "0.10.0"
36+
env_logger = "0.11.0"
3737
criterion = "0.8"
38-
rand = "0.8.5"
38+
rand = "0.10.0"
3939
num-traits = "0.2.15"
4040
log = "0.4.18"
4141
approx = "0.5.1"
4242
test-log = "0.2.16"
4343
test-case = "3"
44-
#audioadapter-sample = {version = "2.0.0", path = "../audioadapter-rs/audioadapter-sample"}
45-
audioadapter-sample = "2.0"
44+
#audioadapter-sample = {version = "3.0.0", path = "../audioadapter-rs/audioadapter-sample"}
45+
audioadapter-sample = "3.0"
4646

4747
[[bench]]
4848
name = "resamplers"

README.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -310,9 +310,12 @@ Many audio editors, for example Audacity, are also able to directly import and e
310310

311311
## Compatibility
312312

313-
The `rubato` crate requires rustc version 1.74 or newer.
313+
The `rubato` crate requires rustc version 1.85 or newer.
314314

315315
## Changelog
316+
- v2.0.0
317+
- Update to `audioadapter` 3.0.
318+
- Add re-export of `audioadapter-buffers`.
316319
- v1.0.1
317320
- Fix calculation in process_all_needed_output_len method.
318321
- v1.0.0

src/asynchro.rs

Lines changed: 87 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -641,7 +641,6 @@ mod tests {
641641
};
642642
use crate::{Async, FixedAsync};
643643
use audioadapter_buffers::direct::SequentialSliceOfVecs;
644-
use rand::Rng;
645644
use test_case::test_matrix;
646645

647646
fn basic_params() -> SincInterpolationParameters {
@@ -815,4 +814,91 @@ mod tests {
815814
resampler.set_chunk_size(600).unwrap();
816815
check_output!(resampler, f64);
817816
}
817+
818+
fn process_and_get_frame_counts(resampler: &mut Async<f64>) -> (usize, usize) {
819+
let input_frames = resampler.input_frames_next();
820+
let output_frames_max = resampler.output_frames_max();
821+
let input_data = vec![vec![0.25; input_frames]; 2];
822+
let input = SequentialSliceOfVecs::new(&input_data, 2, input_frames).unwrap();
823+
824+
let mut output_data = vec![vec![0.0; output_frames_max]; 2];
825+
let mut output =
826+
SequentialSliceOfVecs::new_mut(&mut output_data, 2, output_frames_max).unwrap();
827+
828+
let (consumed_frames, produced_frames) = resampler
829+
.process_into_buffer(&input, &mut output, None)
830+
.unwrap();
831+
(consumed_frames, produced_frames)
832+
}
833+
834+
fn process_chunks_and_get_total_frame_counts(
835+
resampler: &mut Async<f64>,
836+
nbr_chunks: usize,
837+
) -> (usize, usize) {
838+
(0..nbr_chunks).fold((0, 0), |(sum_in, sum_out), _| {
839+
let (frames_in, frames_out) = process_and_get_frame_counts(resampler);
840+
(sum_in + frames_in, sum_out + frames_out)
841+
})
842+
}
843+
844+
fn assert_ratio_within_tolerance(
845+
total_in: usize,
846+
total_out: usize,
847+
expected_ratio: f64,
848+
tolerance: f64,
849+
label: &str,
850+
) {
851+
let measured_ratio = total_out as f64 / total_in as f64;
852+
let lower = expected_ratio - tolerance;
853+
let upper = expected_ratio + tolerance;
854+
assert!(
855+
measured_ratio >= lower && measured_ratio <= upper,
856+
"{} ratio out of range: got {}, expected {} +/- {} (out {}, in {})",
857+
label,
858+
measured_ratio,
859+
expected_ratio,
860+
tolerance,
861+
total_out,
862+
total_in,
863+
);
864+
}
865+
866+
fn check_relative_ratio_changes_frame_ratio(mut resampler: Async<f64>) {
867+
let nbr_chunks = 8;
868+
let tolerance = 0.01;
869+
870+
let (baseline_in, baseline_out) =
871+
process_chunks_and_get_total_frame_counts(&mut resampler, nbr_chunks);
872+
assert_ratio_within_tolerance(baseline_in, baseline_out, 1.0, tolerance, "Baseline");
873+
874+
// Lower ratio speeds up output.
875+
resampler.set_resample_ratio_relative(0.75, false).unwrap();
876+
let (lower_in, lower_out) =
877+
process_chunks_and_get_total_frame_counts(&mut resampler, nbr_chunks);
878+
assert_ratio_within_tolerance(lower_in, lower_out, 0.75, tolerance, "0.75x");
879+
880+
// Higher ratio slows down output.
881+
resampler.set_resample_ratio_relative(1.25, false).unwrap();
882+
let (higher_in, higher_out) =
883+
process_chunks_and_get_total_frame_counts(&mut resampler, nbr_chunks);
884+
assert_ratio_within_tolerance(higher_in, higher_out, 1.25, tolerance, "1.25x");
885+
}
886+
887+
#[test_log::test(test_matrix(
888+
[FixedAsync::Input, FixedAsync::Output]
889+
))]
890+
fn poly_relative_ratio_changes_frame_ratio(fixed: FixedAsync) {
891+
let resampler =
892+
Async::<f64>::new_poly(1.0, 4.0, PolynomialDegree::Cubic, 1024, 2, fixed).unwrap();
893+
check_relative_ratio_changes_frame_ratio(resampler);
894+
}
895+
896+
#[test_log::test(test_matrix(
897+
[FixedAsync::Input, FixedAsync::Output]
898+
))]
899+
fn sinc_relative_ratio_changes_frame_ratio(fixed: FixedAsync) {
900+
let params = basic_params();
901+
let resampler = Async::<f64>::new_sinc(1.0, 4.0, &params, 1024, 2, fixed).unwrap();
902+
check_relative_ratio_changes_frame_ratio(resampler);
903+
}
818904
}

src/lib.rs

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
extern crate log;
55

66
pub use audioadapter;
7+
pub use audioadapter_buffers;
78

89
use audioadapter::{Adapter, AdapterMut};
910
use audioadapter_buffers::owned::InterleavedOwned;
@@ -679,11 +680,10 @@ pub mod tests {
679680
($resampler:ident) => {
680681
let frames_in = $resampler.input_frames_next();
681682

682-
let mut rng = rand::thread_rng();
683683
let mut input_data = vec![vec![0.0f64; frames_in]; 2];
684684
input_data
685685
.iter_mut()
686-
.for_each(|ch| ch.iter_mut().for_each(|s| *s = rng.gen()));
686+
.for_each(|ch| ch.iter_mut().for_each(|s| *s = rand::random()));
687687

688688
let input = SequentialSliceOfVecs::new(&input_data, 2, frames_in).unwrap();
689689

@@ -718,11 +718,10 @@ pub mod tests {
718718
($resampler:ident) => {
719719
let frames_in = $resampler.input_frames_next();
720720

721-
let mut rng = rand::thread_rng();
722721
let mut input_data_1 = vec![vec![0.0f64; frames_in]; 2];
723722
input_data_1
724723
.iter_mut()
725-
.for_each(|ch| ch.iter_mut().for_each(|s| *s = rng.gen()));
724+
.for_each(|ch| ch.iter_mut().for_each(|s| *s = rand::random()));
726725

727726
let offset = 123;
728727
let mut input_data_2 = vec![vec![0.0f64; frames_in + offset]; 2];
@@ -771,11 +770,10 @@ pub mod tests {
771770
($resampler:ident) => {
772771
let frames_in = $resampler.input_frames_next();
773772

774-
let mut rng = rand::thread_rng();
775773
let mut input_data = vec![vec![0.0f64; frames_in]; 2];
776774
input_data
777775
.iter_mut()
778-
.for_each(|ch| ch.iter_mut().for_each(|s| *s = rng.gen()));
776+
.for_each(|ch| ch.iter_mut().for_each(|s| *s = rand::random()));
779777

780778
let input = SequentialSliceOfVecs::new(&input_data, 2, frames_in).unwrap();
781779

@@ -823,11 +821,10 @@ pub mod tests {
823821
($resampler:ident) => {
824822
let frames_in = $resampler.input_frames_next();
825823

826-
let mut rng = rand::thread_rng();
827824
let mut input_data = vec![vec![0.0f64; frames_in]; 2];
828825
input_data
829826
.iter_mut()
830-
.for_each(|ch| ch.iter_mut().for_each(|s| *s = rng.gen()));
827+
.for_each(|ch| ch.iter_mut().for_each(|s| *s = rand::random()));
831828

832829
let input = SequentialSliceOfVecs::new(&input_data, 2, frames_in).unwrap();
833830

src/sinc_interpolator/mod.rs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,6 @@ mod tests {
156156
use super::SincInterpolator;
157157
use crate::WindowFunction;
158158
use num_traits::Float;
159-
use rand::Rng;
160159
use test_log::test;
161160

162161
fn get_sinc_interpolated<T: Float>(wave: &[T], index: usize, sinc: &[T]) -> T {
@@ -169,10 +168,9 @@ mod tests {
169168

170169
#[test]
171170
fn test_scalar_interpolator_64() {
172-
let mut rng = rand::thread_rng();
173171
let mut wave = Vec::new();
174172
for _ in 0..2048 {
175-
wave.push(rng.gen::<f64>());
173+
wave.push(rand::random::<f64>());
176174
}
177175
let sinc_len = 256;
178176
let f_cutoff = 0.94733715;
@@ -188,10 +186,9 @@ mod tests {
188186

189187
#[test]
190188
fn test_scalar_interpolator_32() {
191-
let mut rng = rand::thread_rng();
192189
let mut wave = Vec::new();
193190
for _ in 0..2048 {
194-
wave.push(rng.gen::<f32>());
191+
wave.push(rand::random::<f32>());
195192
}
196193
let sinc_len = 256;
197194
let f_cutoff = 0.94733715;

src/sinc_interpolator/sinc_interpolator_avx.rs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,6 @@ mod tests {
219219
use crate::sinc_interpolator::SincInterpolator;
220220
use crate::WindowFunction;
221221
use num_traits::Float;
222-
use rand::Rng;
223222
use test_log::test;
224223

225224
fn get_sinc_interpolated<T: Float>(wave: &[T], index: usize, sinc: &[T]) -> T {
@@ -232,10 +231,9 @@ mod tests {
232231

233232
#[test]
234233
fn test_avx_interpolator_64() {
235-
let mut rng = rand::thread_rng();
236234
let mut wave = Vec::new();
237235
for _ in 0..2048 {
238-
wave.push(rng.gen::<f64>());
236+
wave.push(rand::random::<f64>());
239237
}
240238
let sinc_len = 256;
241239
let f_cutoff = 0.94733715;
@@ -259,10 +257,9 @@ mod tests {
259257

260258
#[test]
261259
fn test_avx_interpolator_32() {
262-
let mut rng = rand::thread_rng();
263260
let mut wave = Vec::new();
264261
for _ in 0..2048 {
265-
wave.push(rng.gen::<f32>());
262+
wave.push(rand::random::<f32>());
266263
}
267264
let sinc_len = 256;
268265
let f_cutoff = 0.94733715;

src/sinc_interpolator/sinc_interpolator_neon.rs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,6 @@ mod tests {
223223
use crate::sinc_interpolator::SincInterpolator;
224224
use crate::WindowFunction;
225225
use num_traits::Float;
226-
use rand::Rng;
227226
use test_log::test;
228227

229228
fn get_sinc_interpolated<T: Float>(wave: &[T], index: usize, sinc: &[T]) -> T {
@@ -236,10 +235,9 @@ mod tests {
236235

237236
#[test]
238237
fn test_neon_interpolator_64() {
239-
let mut rng = rand::thread_rng();
240238
let mut wave = Vec::new();
241239
for _ in 0..2048 {
242-
wave.push(rng.gen::<f64>());
240+
wave.push(rand::random::<f64>());
243241
}
244242
let sinc_len = 256;
245243
let f_cutoff = 0.94733715;
@@ -255,10 +253,9 @@ mod tests {
255253

256254
#[test]
257255
fn test_neon_interpolator_32() {
258-
let mut rng = rand::thread_rng();
259256
let mut wave = Vec::new();
260257
for _ in 0..2048 {
261-
wave.push(rng.gen::<f32>());
258+
wave.push(rand::random::<f32>());
262259
}
263260
let sinc_len = 256;
264261
let f_cutoff = 0.94733715;

src/sinc_interpolator/sinc_interpolator_sse.rs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -231,7 +231,6 @@ mod tests {
231231
use crate::sinc_interpolator::SincInterpolator;
232232
use crate::WindowFunction;
233233
use num_traits::Float;
234-
use rand::Rng;
235234
use test_log::test;
236235

237236
fn get_sinc_interpolated<T: Float>(wave: &[T], index: usize, sinc: &[T]) -> T {
@@ -244,10 +243,9 @@ mod tests {
244243

245244
#[test]
246245
fn test_sse_interpolator_64() {
247-
let mut rng = rand::thread_rng();
248246
let mut wave = Vec::new();
249247
for _ in 0..2048 {
250-
wave.push(rng.gen::<f64>());
248+
wave.push(rand::random::<f64>());
251249
}
252250
let sinc_len = 256;
253251
let f_cutoff = 0.94733715;
@@ -263,10 +261,9 @@ mod tests {
263261

264262
#[test]
265263
fn test_sse_interpolator_32() {
266-
let mut rng = rand::thread_rng();
267264
let mut wave = Vec::new();
268265
for _ in 0..2048 {
269-
wave.push(rng.gen::<f32>());
266+
wave.push(rand::random::<f32>());
270267
}
271268
let sinc_len = 256;
272269
let f_cutoff = 0.94733715;

src/synchro.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -645,7 +645,6 @@ mod tests {
645645
};
646646
use approx::assert_abs_diff_eq;
647647
use audioadapter_buffers::direct::SequentialSliceOfVecs;
648-
use rand::Rng;
649648
use test_case::test_matrix;
650649

651650
#[test_log::test]

0 commit comments

Comments
 (0)