use rtrb::{Consumer, Producer, RingBuffer};
use std::sync::Arc;
mod gc;
mod payload;
mod status;
pub use gc::*;
pub use payload::*;
pub use status::*;
pub const SPSC_CAPACITY: usize = 64;
pub struct SpscChannels {
pub param_producer: Producer<ParamPayload>,
pub param_consumer: Consumer<ParamPayload>,
pub gc_producer: Producer<GcItem>,
pub gc_consumer: Consumer<GcItem>,
pub gc_overflow: Arc<GcOverflowBuffer>,
pub resampler_producer: Producer<Box<crate::dsp::resampler::NamResampler>>,
pub resampler_consumer: Consumer<Box<crate::dsp::resampler::NamResampler>>,
#[cfg(any(feature = "standalone", feature = "clap-plugin", test))]
pub cabsim_producer: Producer<Option<Box<crate::dsp::cabsim::conv::ConvEngine>>>,
#[cfg(any(feature = "standalone", feature = "clap-plugin", test))]
pub cabsim_consumer: Consumer<Option<Box<crate::dsp::cabsim::conv::ConvEngine>>>,
pub slimmable_producer: Producer<Option<Box<crate::models::StaticModel>>>,
pub slimmable_consumer: Consumer<Option<Box<crate::models::StaticModel>>>,
pub os_producer: Producer<Box<crate::dsp::oversample::OsEnginePair>>,
pub os_consumer: Consumer<Box<crate::dsp::oversample::OsEnginePair>>,
pub rt_status: Arc<RtStatusFlags>,
}
pub fn setup_spsc(capacity: usize) -> SpscChannels {
let (param_prod, param_cons) = RingBuffer::new(capacity);
let (gc_prod, gc_cons) = RingBuffer::new(capacity * 4); let (rs_prod, rs_cons) = RingBuffer::new(4);
#[cfg(any(feature = "standalone", feature = "clap-plugin", test))]
let (cs_prod, cs_cons) = RingBuffer::new(4);
let (sl_prod, sl_cons) = RingBuffer::new(4);
let (os_prod, os_cons) = RingBuffer::new(4);
let rt_status = Arc::new(RtStatusFlags::new());
let gc_overflow = Arc::new(GcOverflowBuffer::new(capacity.max(64)));
SpscChannels {
param_producer: param_prod,
param_consumer: param_cons,
gc_producer: gc_prod,
gc_consumer: gc_cons,
gc_overflow,
resampler_producer: rs_prod,
resampler_consumer: rs_cons,
#[cfg(any(feature = "standalone", feature = "clap-plugin", test))]
cabsim_producer: cs_prod,
#[cfg(any(feature = "standalone", feature = "clap-plugin", test))]
cabsim_consumer: cs_cons,
slimmable_producer: sl_prod,
slimmable_consumer: sl_cons,
os_producer: os_prod,
os_consumer: os_cons,
rt_status,
}
}
#[cfg(test)]
#[path = "spsc_test.rs"]
mod spsc_test;