use crate::raw_ring::RawProducer;
use crate::types::Result;
pub struct RawSink {
producer: RawProducer,
native_rate: u32,
native_channels: u16,
}
impl RawSink {
pub fn new(producer: RawProducer, native_rate: u32, native_channels: u16) -> Self {
Self {
producer,
native_rate,
native_channels,
}
}
pub fn push(&mut self, interleaved: &[f32], pts_ns: i64) -> usize {
let _ = pts_ns;
self.producer.push_slice(interleaved)
}
pub fn native_rate(&self) -> u32 {
self.native_rate
}
pub fn native_channels(&self) -> u16 {
self.native_channels
}
pub fn overflow_count(&self) -> u64 {
self.producer.overflow_count()
}
}
pub trait CaptureBackend: Send {
fn native_format(&self) -> (u32, u16);
fn start(&mut self, sink: RawSink) -> Result<()>;
fn stop(&mut self);
}
#[cfg(test)]
mod tests {
use super::*;
use crate::raw_ring::raw_ring;
struct DummyBackend {
sink: Option<RawSink>,
}
impl CaptureBackend for DummyBackend {
fn native_format(&self) -> (u32, u16) {
(44_100, 2)
}
fn start(&mut self, mut sink: RawSink) -> Result<()> {
assert_eq!(sink.native_rate(), 44_100);
assert_eq!(sink.native_channels(), 2);
sink.push(&[0.1, 0.2, 0.3, 0.4], 0);
self.sink = Some(sink);
Ok(())
}
fn stop(&mut self) {
self.sink = None;
}
}
#[test]
fn backend_pushes_into_raw_ring() {
let (prod, mut cons) = raw_ring(16);
let sink = RawSink::new(prod, 44_100, 2);
let mut be = DummyBackend { sink: None };
assert_eq!(be.native_format(), (44_100, 2));
be.start(sink).unwrap();
let mut out = [0.0f32; 4];
let got = cons.pop_slice(&mut out);
assert_eq!(got, 4);
assert_eq!(out, [0.1, 0.2, 0.3, 0.4]);
be.stop();
}
}