use crate::{
Decibels, Frame, Parameter, Value, backend::resources::ResourceStorage,
command::command_writer_and_reader, effect::EffectBuilder,
};
use super::{Effect, MainTrack, MainTrackHandle};
pub struct MainTrackBuilder {
pub(crate) volume: Value<Decibels>,
pub(crate) effects: Vec<Box<dyn Effect>>,
pub(crate) sound_capacity: usize,
}
impl MainTrackBuilder {
#[must_use]
pub fn new() -> Self {
Self {
volume: Value::Fixed(Decibels::IDENTITY),
effects: vec![],
sound_capacity: 128,
}
}
#[must_use = "This method consumes self and returns a modified MainTrackBuilder, so the return value should be used"]
pub fn volume(self, volume: impl Into<Value<Decibels>>) -> Self {
Self {
volume: volume.into(),
..self
}
}
#[must_use = "This method consumes self and returns a modified MainTrackBuilder, so the return value should be used"]
pub fn sound_capacity(self, capacity: usize) -> Self {
Self {
sound_capacity: capacity,
..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 MainTrackBuilder, 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 MainTrackBuilder, 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, internal_buffer_size: usize) -> (MainTrack, MainTrackHandle) {
let (set_volume_command_writer, set_volume_command_reader) = command_writer_and_reader();
let (sounds, sound_controller) = ResourceStorage::new(self.sound_capacity);
let track = MainTrack {
volume: Parameter::new(self.volume, Decibels::IDENTITY),
set_volume_command_reader,
sounds,
effects: self.effects,
temp_buffer: vec![Frame::ZERO; internal_buffer_size],
internal_buffer_size,
};
let handle = MainTrackHandle {
set_volume_command_writer,
sound_controller,
};
(track, handle)
}
}
impl Default for MainTrackBuilder {
fn default() -> Self {
Self::new()
}
}