use super::{sampler_event::*, sampler_processor::*};
use crate::{commands::Id, effects::Channel, graph::DspParameters, prelude::*};
pub struct Sampler {
pub node: GraphNode,
event_transmitter: EventTransmitter,
}
static EVENT_CHANNEL_CAPACITY: usize = 32;
impl Sampler {
pub fn new_with_event_capacity(
context: &dyn Context,
sample: OwnedAudioBuffer,
capacity: usize,
) -> Self {
let id = Id::generate();
let (event_transmitter, event_receiver) = Channel::bounded(capacity);
let input_count = 0;
let output_count = sample.channel_count();
let sample_rate = sample.sample_rate();
let processor = Box::new(SamplerDspProcess::new(sample_rate, sample, event_receiver));
Self {
node: GraphNode::new(
id,
context,
input_count,
output_count,
processor,
DspParameters::empty(),
),
event_transmitter,
}
}
pub fn new(context: &dyn Context, sample: OwnedAudioBuffer) -> Self {
Self::new_with_event_capacity(context, sample, EVENT_CHANNEL_CAPACITY)
}
pub fn start_now(&mut self) {
self.send_event(SamplerEvent::start_now());
}
pub fn stop_now(&mut self) {
self.send_event(SamplerEvent::stop_now());
}
pub fn start_from_position_at_time(
&mut self,
start_time: Timestamp,
position_in_sample: Timestamp,
) {
self.send_event(SamplerEvent::start(start_time, position_in_sample));
}
pub fn stop_at_time(&mut self, stop_time: Timestamp) {
self.send_event(SamplerEvent::stop(stop_time));
}
pub fn enable_loop(&mut self, loop_start: Timestamp, loop_end: Timestamp) {
self.send_event(SamplerEvent::enable_loop(loop_start, loop_end));
}
pub fn cancel_loop(&mut self) {
self.send_event(SamplerEvent::cancel_loop());
}
pub fn cancel_all(&mut self) {
self.send_event(SamplerEvent::cancel_all());
}
pub fn enable_loop_at_time(
&mut self,
enable_at_time: Timestamp,
loop_start: Timestamp,
loop_end: Timestamp,
) {
self.send_event(SamplerEvent::enable_loop_at_time(
enable_at_time,
loop_start,
loop_end,
));
}
pub fn cancel_loop_at_time(&mut self, cancel_time: Timestamp) {
self.send_event(SamplerEvent::cancel_loop_at_time(cancel_time));
}
fn send_event(&mut self, event: SamplerEvent) {
debug_assert!(!self.event_transmitter.is_full());
let _ = self.event_transmitter.send(event);
}
}