1use std::{cell::RefCell, rc::Rc};
2
3use crate::input::InputSource;
4
5#[derive(Default, Clone)]
6pub enum WarmUp {
7 #[default]
9 None,
10 Samples(usize),
12 Seconds(f64),
14 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}