Files
Phoenix/src/config.rs
T

160 lines
6.0 KiB
Rust

use std::path::PathBuf;
use crate::model::{InputSource, PhoenixGlobalConfig, PhoenixRtaConfig};
#[derive(Clone, Debug)]
pub struct PhoenixConfig {
pub listen_addr: String,
pub alsa_card_index: u8,
pub alsa_device_name: Option<String>,
#[cfg_attr(not(target_os = "linux"), allow(dead_code))]
pub sample_rate: u32,
#[cfg_attr(not(target_os = "linux"), allow(dead_code))]
pub period_size: u32,
#[cfg_attr(not(target_os = "linux"), allow(dead_code))]
pub buffer_size: u32,
pub global_config_path: PathBuf,
pub frontend_presets_path: PathBuf,
pub frontend_layouts_path: PathBuf,
pub recordings_dir_analyzer: PathBuf,
pub recordings_dir_volumio: PathBuf,
pub max_recording_upload_bytes: u64,
pub lr_fractional_delay_enabled: bool,
pub lr_fractional_delay_samples: f32,
}
impl PhoenixConfig {
pub fn from_env() -> Self {
Self {
listen_addr: std::env::var("PHOENIX_LISTEN")
.unwrap_or_else(|_| "127.0.0.1:8789".to_string()),
alsa_card_index: std::env::var("PHOENIX_ALSA_CARD")
.ok()
.and_then(|v| v.parse::<u8>().ok())
.unwrap_or(2),
alsa_device_name: std::env::var("PHOENIX_ALSA_DEVICE")
.ok()
.map(|v| v.trim().to_string())
.filter(|v| !v.is_empty()),
sample_rate: std::env::var("PHOENIX_SAMPLE_RATE")
.ok()
.and_then(|v| v.parse::<u32>().ok())
.unwrap_or(48_000),
period_size: std::env::var("PHOENIX_PERIOD_SIZE")
.ok()
.and_then(|v| v.parse::<u32>().ok())
.unwrap_or(128),
buffer_size: std::env::var("PHOENIX_BUFFER_SIZE")
.ok()
.and_then(|v| v.parse::<u32>().ok())
.unwrap_or(512),
global_config_path: std::env::var("PHOENIX_GLOBAL_CONFIG_PATH")
.ok()
.map(|v| PathBuf::from(v.trim()))
.filter(|v| !v.as_os_str().is_empty())
.unwrap_or_else(default_global_config_path),
frontend_presets_path: std::env::var("PHOENIX_FRONTEND_PRESETS_PATH")
.ok()
.map(|v| PathBuf::from(v.trim()))
.filter(|v| !v.as_os_str().is_empty())
.unwrap_or_else(default_frontend_presets_path),
frontend_layouts_path: std::env::var("PHOENIX_FRONTEND_LAYOUTS_PATH")
.ok()
.map(|v| PathBuf::from(v.trim()))
.filter(|v| !v.as_os_str().is_empty())
.unwrap_or_else(default_frontend_layouts_path),
recordings_dir_analyzer: std::env::var("PHOENIX_RECORDINGS_DIR_ANALYZER")
.ok()
.map(|v| PathBuf::from(v.trim()))
.filter(|v| !v.as_os_str().is_empty())
.unwrap_or_else(default_recordings_dir_analyzer),
recordings_dir_volumio: std::env::var("PHOENIX_RECORDINGS_DIR_VOLUMIO")
.ok()
.map(|v| PathBuf::from(v.trim()))
.filter(|v| !v.as_os_str().is_empty())
.unwrap_or_else(default_recordings_dir_volumio),
max_recording_upload_bytes: std::env::var("PHOENIX_MAX_RECORDING_UPLOAD_BYTES")
.ok()
.and_then(|v| v.trim().parse::<u64>().ok())
.filter(|v| *v > 0)
.unwrap_or(2 * 1024 * 1024 * 1024),
lr_fractional_delay_enabled: std::env::var("PHOENIX_LR_FRAC_DELAY_ENABLED")
.ok()
.map(|v| {
matches!(
v.trim().to_ascii_lowercase().as_str(),
"1" | "true" | "yes" | "on"
)
})
.unwrap_or(true),
lr_fractional_delay_samples: std::env::var("PHOENIX_LR_FRAC_DELAY_SAMPLES")
.ok()
.and_then(|v| v.parse::<f32>().ok())
.unwrap_or(0.996),
}
}
pub fn alsa_device(&self) -> String {
if let Some(device) = &self.alsa_device_name {
return device.clone();
}
format!("hw:{},0", self.alsa_card_index)
}
pub fn default_rta_config(&self) -> PhoenixRtaConfig {
let mut config = PhoenixRtaConfig::default();
config.lr_fractional_delay_enabled = self.lr_fractional_delay_enabled;
config.lr_fractional_delay_samples = self.lr_fractional_delay_samples;
config
}
pub fn default_global_config(&self) -> PhoenixGlobalConfig {
let mut config = PhoenixGlobalConfig::default();
config.input_source = InputSource::Line;
config.lr_fractional_delay_enabled = self.lr_fractional_delay_enabled;
config.lr_fractional_delay_samples = self.lr_fractional_delay_samples;
config
}
}
fn default_global_config_path() -> PathBuf {
if let Some(home) = std::env::var_os("HOME") {
let mut path = PathBuf::from(home);
path.push(".config");
path.push("phoenix");
path.push("global-config.json");
return path;
}
PathBuf::from("phoenix-global-config.json")
}
fn default_frontend_presets_path() -> PathBuf {
if let Some(home) = std::env::var_os("HOME") {
let mut path = PathBuf::from(home);
path.push(".config");
path.push("phoenix");
path.push("frontend-presets.json");
return path;
}
PathBuf::from("phoenix-frontend-presets.json")
}
fn default_frontend_layouts_path() -> PathBuf {
if let Some(home) = std::env::var_os("HOME") {
let mut path = PathBuf::from(home);
path.push(".config");
path.push("phoenix");
path.push("frontend-layouts.json");
return path;
}
PathBuf::from("phoenix-frontend-layouts.json")
}
fn default_recordings_dir_analyzer() -> PathBuf {
PathBuf::from("/home/analyzer/Aufnahmen")
}
fn default_recordings_dir_volumio() -> PathBuf {
PathBuf::from("/home/volumio/Aufnahmen")
}