use crate::prelude::*;
use std::path;
#[derive(Block)]
pub struct WavSink<T, I = DefaultCpuReader<T>>
where
T: Send + 'static + hound::Sample + Copy,
I: CpuBufferReader<Item = T>,
{
#[input]
input: I,
writer: hound::WavWriter<std::io::BufWriter<std::fs::File>>,
}
impl<T, I> WavSink<T, I>
where
T: Send + 'static + hound::Sample + Copy,
I: CpuBufferReader<Item = T>,
{
pub fn new<P: AsRef<path::Path> + std::marker::Send + Copy>(
file_name: P,
spec: hound::WavSpec,
) -> Self {
let writer = hound::WavWriter::create(file_name, spec).unwrap();
Self {
input: I::default(),
writer,
}
}
}
#[doc(hidden)]
impl<T, I> Kernel for WavSink<T, I>
where
T: Send + 'static + hound::Sample + Copy,
I: CpuBufferReader<Item = T>,
{
async fn work(
&mut self,
io: &mut WorkIo,
_mio: &mut MessageOutputs,
_meta: &mut BlockMeta,
) -> Result<()> {
let i = self.input.slice();
let items = i.len();
if items > 0 {
for t in i {
self.writer.write_sample(*t).unwrap();
}
}
if self.input.finished() {
io.finished = true;
}
self.input.consume(items);
Ok(())
}
}