use crate::effects::alien::AlienConfig;
use crate::effects::punch::PunchConfig;
use crate::effects::reverb::ReverbConfig;
use crate::effects::warm::WarmConfig;
use crate::error::{check_range, ConfigProblem};
use crate::Error;
use crate::ResynthesisConfig;
use std::num::NonZeroUsize;
#[derive(Clone, Copy, Debug, Default, Eq, PartialEq)]
#[non_exhaustive]
pub enum SampleRate {
#[default]
Hz44100,
Hz48000,
}
impl SampleRate {
pub const fn as_u32(self) -> u32 {
match self {
Self::Hz44100 => 44_100,
Self::Hz48000 => 48_000,
}
}
pub fn hz(self) -> f32 {
self.as_u32() as f32
}
}
impl TryFrom<u32> for SampleRate {
type Error = Error;
fn try_from(hz: u32) -> Result<Self, Self::Error> {
match hz {
44_100 => Ok(Self::Hz44100),
48_000 => Ok(Self::Hz48000),
_ => Err(Error::UnsupportedSampleRate { hz }),
}
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
#[non_exhaustive]
pub struct PrepareConfig {
pub sample_rate: SampleRate,
pub max_block_frames: NonZeroUsize,
}
impl Default for PrepareConfig {
fn default() -> Self {
Self {
sample_rate: SampleRate::Hz44100,
max_block_frames: NonZeroUsize::new(1024).expect("1024 is nonzero"),
}
}
}
impl PrepareConfig {
pub fn new(sample_rate: SampleRate, max_block_frames: usize) -> Result<Self, Error> {
let max_block_frames = NonZeroUsize::new(max_block_frames).ok_or_else(|| {
Error::config(
"prepare.max_block_frames",
ConfigProblem::OutOfRange {
min: 1.0,
max: usize::MAX as f64,
},
)
})?;
Ok(Self {
sample_rate,
max_block_frames,
})
}
}
#[derive(Clone, Copy, Debug, PartialEq)]
#[non_exhaustive]
#[cfg_attr(
all(feature = "wasm", target_arch = "wasm32"),
derive(serde::Serialize, serde::Deserialize, tsify::Tsify),
serde(rename_all = "camelCase"),
tsify(large_number_types_as_bigints)
)]
pub struct ProcessorConfig {
pub punch: PunchConfig,
pub warm: WarmConfig,
pub resynthesis: ResynthesisConfig,
pub alien: AlienConfig,
pub reverb: ReverbConfig,
pub output_gain: f32,
}
impl Default for ProcessorConfig {
fn default() -> Self {
Self {
punch: PunchConfig::default(),
warm: WarmConfig::default(),
resynthesis: ResynthesisConfig::default(),
alien: AlienConfig::default(),
reverb: ReverbConfig::default(),
output_gain: 1.0,
}
}
}
impl ProcessorConfig {
pub fn validate(self) -> Result<(), Error> {
self.punch.validate()?;
self.warm.validate()?;
self.resynthesis.validate()?;
self.alien.validate()?;
self.reverb.validate()?;
validate_output_gain(self.output_gain)
}
}
pub(crate) fn validate_output_gain(gain: f32) -> Result<(), Error> {
check_range("output_gain", gain, 0.0, 64.0)
}