pub mod analysis;
pub mod buffering;
pub mod chunks;
pub mod filters;
pub mod io;
pub mod modulation;
pub mod morse;
pub mod resampling;
pub mod transform;
pub mod prelude {
pub use super::analysis::Fourier;
pub use super::buffering::Buffer;
pub use super::chunks::{Overlapper, Rechunker};
pub use super::filters::Filter;
pub use super::io::{Blackhole, Silence};
pub use super::resampling::{Downsampler, Upsampler};
pub use super::transform::{FreqShifter, GainControl, MapSample};
}
pub use self::prelude::*;
use crate::flow::*;
use crate::signal::*;
use tokio::task::spawn;
#[macro_export]
macro_rules! impl_block_trait {
{ $(<$t:ident>)? Consumer<$signal:path> for $type:path } => {
impl$(<$t>)? $crate::flow::Consumer<$signal> for $type {
fn receiver_connector(&self) -> &$crate::flow::ReceiverConnector<$signal> {
&self.receiver_connector
}
}
};
{ $(<$t:ident>)? Producer<$signal:path> for $type:path } => {
impl$(<$t>)? $crate::flow::Producer<$signal> for $type {
fn sender_connector(&self) -> &$crate::flow::SenderConnector<$signal> {
&self.sender_connector
}
}
};
{ $(<$t:ident>)? EventHandling for $type:path } => {
impl$(<$t>)? $crate::signal::EventHandling for $type {
fn on_event<F>(&self, func: F) -> $crate::signal::EventHandlerGuard
where
F:
::std::ops::FnMut(&::std::sync::Arc<
dyn $crate::signal::Event
>) + ::std::marker::Send + 'static
{
$crate::signal::EventHandlers::register(&self.event_handlers, func)
}
}
};
{ $(<$t:ident>)? all<$signal:path> for $type:path } => {
impl_block_trait! { $(<$t>)? Consumer<$signal> for $type }
impl_block_trait! { $(<$t>)? Producer<$signal> for $type }
impl_block_trait! { $(<$t>)? EventHandling for $type }
};
}
pub struct Nop<T> {
receiver_connector: ReceiverConnector<T>,
sender_connector: SenderConnector<T>,
}
impl_block_trait! { <T> Consumer<T> for Nop<T> }
impl_block_trait! { <T> Producer<T> for Nop<T> }
impl<T> Nop<T>
where
T: Message + Send + 'static,
{
pub fn new() -> Self {
let (mut receiver, receiver_connector) = new_receiver::<T>();
let (sender, sender_connector) = new_sender::<T>();
spawn(async move {
loop {
let Ok(msg) = receiver.recv().await else { return; };
let Ok(()) = sender.send(msg).await else { return; };
}
});
Self {
receiver_connector,
sender_connector,
}
}
}
pub struct NopSignal<T> {
receiver_connector: ReceiverConnector<Signal<T>>,
sender_connector: SenderConnector<Signal<T>>,
event_handlers: EventHandlers,
}
impl_block_trait! { <T> all<Signal<T>> for NopSignal<T> }
impl<T> NopSignal<T>
where
T: Clone + Send + Sync + 'static,
{
pub fn new() -> Self {
let (mut receiver, receiver_connector) = new_receiver::<Signal<T>>();
let (sender, sender_connector) = new_sender::<Signal<T>>();
let event_handlers = EventHandlers::new();
let evhdl_clone = event_handlers.clone();
spawn(async move {
loop {
let Ok(signal) = receiver.recv().await else { return; };
match signal {
Signal::Samples {
sample_rate,
chunk: input_chunk,
} => {
let output_chunk = input_chunk; let Ok(()) = sender
.send(Signal::Samples { sample_rate, chunk: output_chunk })
.await
else { return; };
}
Signal::Event(event) => {
evhdl_clone.invoke(&event);
let Ok(()) = sender.send(Signal::Event(event)).await
else { return; };
}
}
}
});
Self {
receiver_connector,
sender_connector,
event_handlers,
}
}
}
#[cfg(test)]
mod tests {}