use crate::common::diagnostics::ModelInfo;
use crate::models::StaticModel;
use std::path::Path;
pub(crate) const DEFAULT_INPUT_LEVEL_DBU: f32 = 12.0;
pub(crate) const DEFAULT_LOUDNESS_DB: f32 = -18.0;
pub(crate) const DEFAULT_SAMPLE_RATE: f32 = 48000.0;
pub(crate) const MAX_MODEL_BYTES: u64 = 256 * 1024 * 1024;
pub struct LoadedModelPair {
pub model_l: Option<Box<StaticModel>>,
pub model_r: Option<Box<StaticModel>>,
pub input_mult_adj: f32,
pub output_mult_adj: f32,
pub sample_rate: u32,
pub architecture: String,
pub topology: String,
pub metadata: Option<crate::loader::nam_json::NamMetadata>,
pub weights_layout: String,
}
impl LoadedModelPair {
pub fn loudness(&self) -> Option<f32> {
self.metadata.as_ref().and_then(|m| m.loudness)
}
pub fn input_level_dbu(&self) -> Option<f32> {
self.metadata.as_ref().and_then(|m| m.input_level_dbu)
}
pub fn output_level_dbu(&self) -> Option<f32> {
self.metadata.as_ref().and_then(|m| m.output_level_dbu)
}
pub fn has_loudness(&self) -> bool {
self.loudness().is_some()
}
pub fn has_input_level_dbu(&self) -> bool {
self.input_level_dbu().is_some()
}
pub fn has_output_level_dbu(&self) -> bool {
self.output_level_dbu().is_some()
}
pub fn model_info(&self, path: &Path) -> ModelInfo {
ModelInfo {
arch_label: self.architecture.clone(),
topology: self.topology.clone(),
channels: self.model_l.as_ref().map(|m| m.channels()).unwrap_or(0),
receptive_field: self
.model_l
.as_ref()
.map(|m| m.receptive_field())
.unwrap_or(0),
model_sample_rate: self.sample_rate,
weights_layout: self.weights_layout.clone(),
path_basename: path.to_string_lossy().into_owned(),
}
}
}
impl std::fmt::Debug for LoadedModelPair {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("LoadedModelPair")
.field("model_l", &self.model_l.as_ref().map(|_| "StaticModel"))
.field("model_r", &self.model_r.as_ref().map(|_| "StaticModel"))
.field("input_mult_adj", &self.input_mult_adj)
.field("output_mult_adj", &self.output_mult_adj)
.field("sample_rate", &self.sample_rate)
.field("architecture", &self.architecture)
.field("topology", &self.topology)
.field("metadata", &self.metadata)
.field("weights_layout", &self.weights_layout)
.finish()
}
}