use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
pub use crate::Curve;
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
pub struct CurveData {
pub freq: Vec<f64>,
pub spl: Vec<f64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub phase: Option<Vec<f64>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub norm_range: Option<(f64, f64)>,
}
impl From<Curve> for CurveData {
fn from(curve: Curve) -> Self {
CurveData {
freq: curve.freq.to_vec(),
spl: curve.spl.to_vec(),
phase: curve.phase.map(|p| p.to_vec()),
norm_range: None,
}
}
}
impl From<&Curve> for CurveData {
fn from(curve: &Curve) -> Self {
CurveData {
freq: curve.freq.to_vec(),
spl: curve.spl.to_vec(),
phase: curve.phase.as_ref().map(|p| p.to_vec()),
norm_range: None,
}
}
}
impl From<CurveData> for Curve {
fn from(data: CurveData) -> Self {
Curve {
freq: ndarray::Array1::from(data.freq),
spl: ndarray::Array1::from(data.spl),
phase: data.phase.map(ndarray::Array1::from),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
pub struct IrWaveform {
pub time_ms: Vec<f64>,
pub amplitude: Vec<f64>,
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
pub struct DspChainOutput {
#[serde(default = "crate::roomeq::types::default_config_version")]
pub version: String,
pub channels: HashMap<String, ChannelDspChain>,
#[serde(skip_serializing_if = "Option::is_none")]
pub metadata: Option<OptimizationMetadata>,
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
pub struct ChannelDspChain {
pub channel: String,
pub plugins: Vec<PluginConfigWrapper>,
#[serde(skip_serializing_if = "Option::is_none")]
pub drivers: Option<Vec<DriverDspChain>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub initial_curve: Option<CurveData>,
#[serde(skip_serializing_if = "Option::is_none")]
pub final_curve: Option<CurveData>,
#[serde(skip_serializing_if = "Option::is_none")]
pub eq_response: Option<CurveData>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub target_curve: Option<CurveData>,
#[serde(skip_serializing_if = "Option::is_none")]
pub pre_ir: Option<IrWaveform>,
#[serde(skip_serializing_if = "Option::is_none")]
pub post_ir: Option<IrWaveform>,
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
pub struct DriverDspChain {
pub name: String,
pub index: usize,
pub plugins: Vec<PluginConfigWrapper>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub initial_curve: Option<CurveData>,
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
pub struct PluginConfigWrapper {
pub plugin_type: String,
pub parameters: serde_json::Value,
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
pub struct OptimizationMetadata {
pub pre_score: f64,
pub post_score: f64,
pub algorithm: String,
pub iterations: usize,
pub timestamp: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub inter_channel_deviation: Option<crate::roomeq::types::InterChannelDeviation>,
}