insta_fun/
warmup.rs

1use std::{cell::RefCell, rc::Rc};
2
3use crate::input::InputSource;
4
5#[derive(Default, Clone)]
6pub enum WarmUp {
7    /// No warm-up
8    #[default]
9    None,
10    /// Warm-up with a specific number of samples
11    Samples(usize),
12    /// Warm-up with a specific duration in seconds
13    Seconds(f64),
14    /// Warm-up with a specific number of samples and input source
15    SamplesWithInput {
16        samples: usize,
17        input: Rc<RefCell<InputSource>>,
18    },
19}
20
21impl std::fmt::Debug for WarmUp {
22    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
23        match self {
24            Self::None => write!(f, "None"),
25            Self::Samples(arg0) => f.debug_tuple("Samples").field(arg0).finish(),
26            Self::Seconds(arg0) => f.debug_tuple("Seconds").field(arg0).finish(),
27            Self::SamplesWithInput { samples, .. } => f
28                .debug_struct("SamplesWithInput")
29                .field("Samples", samples)
30                .finish(),
31        }
32    }
33}
34
35impl WarmUp {
36    pub(crate) fn warm_up_samples(&self, sample_rate: f64, num_inputs: usize) -> Vec<Vec<f32>> {
37        let none_input = Rc::new(RefCell::new(InputSource::None));
38        let (num_samples, input) = match self {
39            WarmUp::None => (0, &none_input),
40            WarmUp::Samples(samples) => (*samples, &none_input),
41            WarmUp::Seconds(seconds) => ((*seconds * sample_rate) as usize, &none_input),
42            WarmUp::SamplesWithInput { samples, input } => (*samples, input),
43        };
44
45        input.borrow_mut().make_data(num_inputs, num_samples)
46    }
47
48    pub(crate) fn num_samples(&self, sample_rate: f64) -> usize {
49        match self {
50            WarmUp::None => 0,
51            WarmUp::Samples(samples) => *samples,
52            WarmUp::Seconds(seconds) => (*seconds * sample_rate) as usize,
53            WarmUp::SamplesWithInput { samples, .. } => *samples,
54        }
55    }
56}