Add a fast-forward command
This commit is contained in:
+19
-3
@@ -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(())
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user