use super::*;
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
pub enum ReverbAlgorithm {
Live1,
Hall,
Plate,
Club,
ConcertHall,
Cathedral,
Church,
Room,
SmallRoom,
Box,
Ambient,
Live2,
Live3,
Spring,
}
impl Default for ReverbAlgorithm {
fn default() -> Self {
Self::Live1
}
}
const REVERB_ALGORITHMS: &[ReverbAlgorithm] = &[
ReverbAlgorithm::Live1,
ReverbAlgorithm::Hall,
ReverbAlgorithm::Plate,
ReverbAlgorithm::Club,
ReverbAlgorithm::ConcertHall,
ReverbAlgorithm::Cathedral,
ReverbAlgorithm::Church,
ReverbAlgorithm::Room,
ReverbAlgorithm::SmallRoom,
ReverbAlgorithm::Box,
ReverbAlgorithm::Ambient,
ReverbAlgorithm::Live2,
ReverbAlgorithm::Live3,
ReverbAlgorithm::Spring,
];
const REVERB_ALGORITHM_LABEL: &str = "reverb algorithm";
fn serialize_algorithm(algo: &ReverbAlgorithm, raw: &mut [u8]) -> Result<(), String> {
serialize_position(REVERB_ALGORITHMS, algo, raw, REVERB_ALGORITHM_LABEL)
}
fn deserialize_algorithm(algo: &mut ReverbAlgorithm, raw: &[u8]) -> Result<(), String> {
deserialize_position(REVERB_ALGORITHMS, algo, raw, REVERB_ALGORITHM_LABEL)
}
#[derive(Default, Debug, Copy, Clone, PartialEq, Eq)]
pub struct ReverbState {
pub input_level: i32,
pub bypass: bool,
pub kill_wet: bool,
pub kill_dry: bool,
pub output_level: i32,
pub time_decay: i32,
pub time_pre_decay: i32,
pub color_low: i32,
pub color_high: i32,
pub color_high_factor: i32,
pub mod_rate: i32,
pub mod_depth: i32,
pub level_early: i32,
pub level_reverb: i32,
pub level_dry: i32,
pub algorithm: ReverbAlgorithm,
}
impl ReverbState {
pub(crate) const SIZE: usize = 68;
}
pub(crate) fn serialize_reverb_state(state: &ReverbState, raw: &mut [u8]) -> Result<(), String> {
assert!(raw.len() >= ReverbState::SIZE);
serialize_i32(&state.input_level, &mut raw[..4]);
serialize_bool(&state.bypass, &mut raw[4..8]);
serialize_bool(&state.kill_wet, &mut raw[8..12]);
serialize_bool(&state.kill_dry, &mut raw[12..16]);
serialize_i32(&state.output_level, &mut raw[16..20]);
serialize_i32(&state.time_decay, &mut raw[20..24]);
serialize_i32(&state.time_pre_decay, &mut raw[24..28]);
serialize_i32(&state.color_low, &mut raw[32..36]);
serialize_i32(&state.color_high, &mut raw[36..40]);
serialize_i32(&state.color_high_factor, &mut raw[40..44]);
serialize_i32(&state.mod_rate, &mut raw[44..48]);
serialize_i32(&state.mod_depth, &mut raw[48..52]);
serialize_i32(&state.level_early, &mut raw[52..56]);
serialize_i32(&state.level_dry, &mut raw[60..64]);
serialize_algorithm(&state.algorithm, &mut raw[64..])?;
Ok(())
}
pub(crate) fn deserialize_reverb_state(state: &mut ReverbState, raw: &[u8]) -> Result<(), String> {
assert!(raw.len() >= ReverbState::SIZE);
deserialize_i32(&mut state.input_level, &raw[..4]);
deserialize_bool(&mut state.bypass, &raw[4..8]);
deserialize_bool(&mut state.kill_wet, &raw[8..12]);
deserialize_bool(&mut state.kill_dry, &raw[12..16]);
deserialize_i32(&mut state.output_level, &raw[16..20]);
deserialize_i32(&mut state.time_decay, &raw[20..24]);
deserialize_i32(&mut state.time_pre_decay, &raw[24..28]);
deserialize_i32(&mut state.color_low, &raw[32..36]);
deserialize_i32(&mut state.color_high, &raw[36..40]);
deserialize_i32(&mut state.color_high_factor, &raw[40..44]);
deserialize_i32(&mut state.mod_rate, &raw[44..48]);
deserialize_i32(&mut state.mod_depth, &raw[48..52]);
deserialize_i32(&mut state.level_early, &raw[52..56]);
deserialize_i32(&mut state.level_dry, &raw[60..64]);
deserialize_algorithm(&mut state.algorithm, &raw[64..])?;
Ok(())
}
#[derive(Default, Debug, Copy, Clone, PartialEq, Eq)]
pub struct ReverbMeter {
pub outputs: [i32; 2],
pub inputs: [i32; 2],
}
impl ReverbMeter {
pub(crate) const SIZE: usize = 24;
}
pub(crate) fn serialize_reverb_meter(meter: &ReverbMeter, raw: &mut [u8]) -> Result<(), String> {
assert!(raw.len() >= ReverbMeter::SIZE);
serialize_i32(&meter.outputs[0], &mut raw[..4]);
serialize_i32(&meter.outputs[1], &mut raw[4..8]);
serialize_i32(&meter.inputs[0], &mut raw[8..12]);
serialize_i32(&meter.inputs[1], &mut raw[12..16]);
Ok(())
}
pub(crate) fn deserialize_reverb_meter(meter: &mut ReverbMeter, raw: &[u8]) -> Result<(), String> {
assert!(raw.len() >= ReverbMeter::SIZE);
deserialize_i32(&mut meter.outputs[0], &raw[..4]);
deserialize_i32(&mut meter.outputs[1], &raw[4..8]);
deserialize_i32(&mut meter.inputs[0], &raw[8..12]);
deserialize_i32(&mut meter.inputs[1], &raw[12..16]);
Ok(())
}