use std::sync::Arc;
use crate::{
Decibels, Parameter, Value, command::command_writer_and_reader, effect::EffectBuilder,
frame::Frame,
};
use super::{Effect, SendTrack, SendTrackHandle, SendTrackId, TrackShared};
pub struct SendTrackBuilder {
pub(crate) volume: Value<Decibels>,
pub(crate) effects: Vec<Box<dyn Effect>>,
}
impl SendTrackBuilder {
#[must_use]
pub fn new() -> Self {
Self {
volume: Value::Fixed(Decibels::IDENTITY),
effects: vec![],
}
}
#[must_use = "This method consumes self and returns a modified SendTrackBuilder, so the return value should be used"]
pub fn volume(self, volume: impl Into<Value<Decibels>>) -> Self {
Self {
volume: volume.into(),
..self
}
}
pub fn add_effect<B: EffectBuilder>(&mut self, builder: B) -> B::Handle {
let (effect, handle) = builder.build();
self.effects.push(effect);
handle
}
#[must_use = "This method consumes self and returns a modified SendTrackBuilder, so the return value should be used"]
pub fn with_effect<B: EffectBuilder>(mut self, builder: B) -> Self {
self.add_effect(builder);
self
}
pub fn add_built_effect(&mut self, effect: Box<dyn Effect>) {
self.effects.push(effect);
}
#[must_use = "This method consumes self and returns a modified SendTrackBuilder, so the return value should be used"]
pub fn with_built_effect(mut self, effect: Box<dyn Effect>) -> Self {
self.add_built_effect(effect);
self
}
#[must_use]
pub(crate) fn build(
self,
id: SendTrackId,
internal_buffer_size: usize,
) -> (SendTrack, SendTrackHandle) {
let (set_volume_command_writer, set_volume_command_reader) = command_writer_and_reader();
let shared = Arc::new(TrackShared::new());
let track = SendTrack {
shared: shared.clone(),
volume: Parameter::new(self.volume, Decibels::IDENTITY),
set_volume_command_reader,
effects: self.effects,
input: vec![Frame::ZERO; internal_buffer_size],
internal_buffer_size,
};
let handle = SendTrackHandle {
id,
shared,
set_volume_command_writer,
};
(track, handle)
}
}
impl Default for SendTrackBuilder {
fn default() -> Self {
Self::new()
}
}