#[cfg(feature = "burn")]
pub mod burn;
pub mod circuit;
#[cfg(not(target_arch = "wasm32"))]
pub mod circular;
pub mod slab;
#[cfg(feature = "vulkan")]
pub mod vulkan;
#[cfg(feature = "wgpu")]
pub mod wgpu;
#[cfg(all(feature = "zynq", target_os = "linux"))]
pub mod zynq;
use std::any::Any;
use std::future::Future;
use futuresdr::channel::mpsc::Sender;
use futuresdr::runtime::BlockId;
use futuresdr::runtime::BlockMessage;
use futuresdr::runtime::Error;
use futuresdr::runtime::ItemTag;
use futuresdr::runtime::PortId;
use futuresdr::runtime::Tag;
#[async_trait]
pub trait BufferReader: Any {
fn as_any_mut(&mut self) -> &mut dyn Any;
fn init(&mut self, block_id: BlockId, port_id: PortId, inbox: Sender<BlockMessage>);
fn validate(&self) -> Result<(), Error>;
async fn notify_finished(&mut self);
fn finish(&mut self);
fn finished(&self) -> bool;
fn block_id(&self) -> BlockId;
fn port_id(&self) -> PortId;
}
pub trait BufferWriter {
type Reader: BufferReader;
fn init(&mut self, block_id: BlockId, port_id: PortId, inbox: Sender<BlockMessage>);
fn validate(&self) -> Result<(), Error>;
fn connect(&mut self, dest: &mut Self::Reader);
fn connect_dyn(&mut self, dest: &mut dyn BufferReader) -> Result<(), Error> {
if let Some(concrete) = dest.as_any_mut().downcast_mut::<Self::Reader>() {
self.connect(concrete);
Ok(())
} else {
Err(Error::ValidationError(
"dyn BufferReader has wrong type".to_string(),
))
}
}
fn notify_finished(&mut self) -> impl Future<Output = ()> + Send;
fn block_id(&self) -> BlockId;
fn port_id(&self) -> PortId;
}
pub trait CpuSample: Default + Clone + std::fmt::Debug + Send + Sync + 'static {}
impl<T> CpuSample for T where T: Default + Clone + std::fmt::Debug + Send + Sync + 'static {}
pub trait CpuBufferReader: BufferReader + Default + Send {
type Item: CpuSample;
fn slice(&mut self) -> &[Self::Item] {
self.slice_with_tags().0
}
fn slice_with_tags(&mut self) -> (&[Self::Item], &Vec<ItemTag>);
fn consume(&mut self, n: usize);
fn set_min_items(&mut self, n: usize);
fn set_min_buffer_size_in_items(&mut self, n: usize);
fn max_items(&self) -> usize;
}
pub trait CpuBufferWriter: BufferWriter + Default + Send {
type Item: CpuSample;
fn slice(&mut self) -> &mut [Self::Item] {
self.slice_with_tags().0
}
fn slice_with_tags(&mut self) -> (&mut [Self::Item], Tags<'_>);
fn produce(&mut self, n: usize);
fn set_min_items(&mut self, n: usize);
fn set_min_buffer_size_in_items(&mut self, n: usize);
fn max_items(&self) -> usize;
}
pub trait InplaceBuffer {
type Item: CpuSample;
fn set_valid(&mut self, valid: usize);
fn slice(&mut self) -> &mut [Self::Item];
fn slice_with_tags(&mut self) -> (&mut [Self::Item], &mut Vec<ItemTag>);
}
pub trait InplaceReader: BufferReader + Default + Send {
type Item: CpuSample;
type Buffer: InplaceBuffer<Item = Self::Item>;
fn get_full_buffer(&mut self) -> Option<Self::Buffer>;
fn has_more_buffers(&mut self) -> bool;
fn put_empty_buffer(&mut self, buffer: Self::Buffer);
fn notify_consumed_buffer(&mut self);
}
pub trait InplaceWriter: BufferWriter + Default + Send {
type Item: CpuSample;
type Buffer: InplaceBuffer<Item = Self::Item>;
fn put_full_buffer(&mut self, buffer: Self::Buffer);
fn get_empty_buffer(&mut self) -> Option<Self::Buffer>;
fn has_more_buffers(&mut self) -> bool;
fn inject_buffers(&mut self, n_buffers: usize) {
let n_items =
futuresdr::runtime::config::config().buffer_size / std::mem::size_of::<Self::Item>();
self.inject_buffers_with_items(n_buffers, n_items);
}
fn inject_buffers_with_items(&mut self, n_buffers: usize, n_items: usize);
}
#[cfg(not(target_arch = "wasm32"))]
pub type DefaultCpuReader<D> = circular::Reader<D>;
#[cfg(not(target_arch = "wasm32"))]
pub type DefaultCpuWriter<D> = circular::Writer<D>;
#[cfg(target_arch = "wasm32")]
pub type DefaultCpuReader<D> = slab::Reader<D>;
#[cfg(target_arch = "wasm32")]
pub type DefaultCpuWriter<D> = slab::Writer<D>;
pub struct Tags<'a> {
tags: &'a mut Vec<ItemTag>,
offset: usize,
}
impl<'a> Tags<'a> {
pub fn new(tags: &'a mut Vec<ItemTag>, offset: usize) -> Self {
Self { tags, offset }
}
pub fn add_tag(&mut self, index: usize, tag: Tag) {
self.tags.push(ItemTag {
index: index + self.offset,
tag,
});
}
}