+struct SwitchSpace {
+ write_zone: Arc<Mutex<Vec<Complex<f32>>>>,
+ read_zone: Arc<Mutex<Vec<Complex<f32>>>>,
+ storage: [i16; WINDOW_SIZE*2],
+ inverse_transform: Radix4::<f32>,
+ scratch: Vec<Complex<f32>>,
+ counter: Arc<Mutex<usize>>,
+ tx: Sender<bool>
+}
+
+impl SwitchSpace {
+ fn new (write_zone: Arc<Mutex<Vec<Complex<f32>>>>, tx: Sender<bool>) -> Self {
+ Self {
+ write_zone,
+ read_zone: Arc::new(Mutex::new(vec![Complex{re: 0f32, im: 0f32}; SPECTOGRAM_AREA])),
+ storage: [0i16; WINDOW_SIZE*2],
+
+ inverse_transform: Radix4::<f32>::new(WINDOW_SIZE, FftDirection::Inverse),
+
+ scratch: vec![
+ Complex{re: 0f32, im: 0f32};
+ Radix4::<f32>::new(
+ WINDOW_SIZE,
+ FftDirection::Inverse
+ ).get_inplace_scratch_len()
+ ],
+
+ counter: Arc::new(Mutex::new(0usize)),
+ tx
+ }
+ }
+
+ fn get_data(&mut self, data: &mut [i16], _: &cpal::OutputCallbackInfo) {
+ let mut counter = self.counter.lock().unwrap();
+
+ {
+ let mut read_chunk = self.read_zone.lock().unwrap();
+
+ self.inverse_transform.process_with_scratch(&mut read_chunk[*counter..*counter+WINDOW_SIZE], &mut self.scratch);
+
+ println!("Writing {} data points...", data.len());
+ for (i, x) in data.chunks_mut(2).enumerate() {
+ let value = read_chunk[*counter + i].re as i16;
+ for sample in x.iter_mut() {
+ *sample = value;
+ }
+ }
+ }
+
+ if *counter == CHUNK_SIZE {
+ println!("Read space empty... Running switch...");
+ let origional_write = self.write_zone.clone();
+ self.write_zone = self.read_zone.clone();
+ self.read_zone = origional_write.clone();
+
+ *counter = 0;
+ let _ = self.tx.send(true);
+ } else {
+ *counter += 1;
+ }
+ }
+}
+