Add a fast-forward command

This commit is contained in:
2025-03-24 23:22:47 -04:00
parent 4a3385f04c
commit caf3a9426e
8 changed files with 325 additions and 145 deletions
+19 -3
View File
@@ -3,18 +3,20 @@ use std::time::Duration;
use anyhow::{Result, bail};
use cpal::traits::{DeviceTrait, HostTrait, StreamTrait};
use itertools::Itertools;
use rubato::{FftFixedInOut, Resampler};
use rubato::{FastFixedOut, Resampler};
use tracing::error;
pub struct Audio {
#[allow(unused)]
stream: cpal::Stream,
sampler: FftFixedInOut<f32>,
sampler: FastFixedOut<f32>,
input_buffer: Vec<Vec<f32>>,
output_buffer: Vec<Vec<f32>>,
sample_sink: rtrb::Producer<f32>,
}
const VB_FREQUENCY: usize = 41700;
impl Audio {
pub fn init() -> Result<Self> {
let host = cpal::default_host();
@@ -28,7 +30,15 @@ impl Audio {
bail!("No suitable output config available");
};
let mut config = config.with_max_sample_rate().config();
let sampler = FftFixedInOut::new(41700, config.sample_rate.0 as usize, 834, 2)?;
let resample_ratio = config.sample_rate.0 as f64 / VB_FREQUENCY as f64;
let chunk_size = (834.0 * resample_ratio) as usize;
let sampler = FastFixedOut::new(
resample_ratio,
64.0,
rubato::PolynomialDegree::Cubic,
chunk_size,
2,
)?;
config.buffer_size = cpal::BufferSize::Fixed(sampler.output_frames_max() as u32);
let input_buffer = sampler.input_buffer_allocate(true);
@@ -101,4 +111,10 @@ impl Audio {
std::thread::sleep(Duration::from_micros(500));
}
}
pub fn set_speed(&mut self, speed: f64) -> Result<()> {
self.sampler
.set_resample_ratio_relative(1.0 / speed, false)?;
Ok(())
}
}