use super::types::*;
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use std::time::{Instant, SystemTime};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TelepresenceAudioSettings {
pub input_device: AudioDeviceConfig,
pub output_device: AudioDeviceConfig,
pub voice_processing: VoiceProcessingSettings,
pub quality_preferences: AudioQualityPreferences,
pub codec_preferences: CodecPreferences,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AudioDeviceConfig {
pub device_id: Option<String>,
pub sample_rate: u32,
pub buffer_size: usize,
pub channels: u8,
pub bit_depth: u8,
pub device_settings: HashMap<String, String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct VoiceProcessingSettings {
pub agc_enabled: bool,
pub noise_suppression: NoiseSuppressionSettings,
pub echo_cancellation: EchoCancellationSettings,
pub vad_settings: VadSettings,
pub enhancement: AudioEnhancementSettings,
pub spatialization: VoiceSpatializationSettings,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct NoiseSuppressionSettings {
pub enabled: bool,
pub strength: f32,
pub algorithm: NoiseSuppressionAlgorithm,
pub adaptive: bool,
pub stationary_suppression: f32,
pub non_stationary_suppression: f32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EchoCancellationSettings {
pub enabled: bool,
pub strength: f32,
pub algorithm: EchoCancellationAlgorithm,
pub tail_length: usize,
pub adaptation_rate: f32,
pub non_linear_processing: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct VadSettings {
pub enabled: bool,
pub sensitivity: f32,
pub algorithm: VadAlgorithm,
pub min_voice_duration: f32,
pub min_silence_duration: f32,
pub hangover_time: f32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AudioEnhancementSettings {
pub enabled: bool,
pub dynamic_range_compression: CompressionSettings,
pub equalization: EqualizationSettings,
pub bandwidth_extension: BandwidthExtensionSettings,
pub comfort_noise: ComfortNoiseSettings,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CompressionSettings {
pub enabled: bool,
pub ratio: f32,
pub threshold: f32,
pub attack_time: f32,
pub release_time: f32,
pub makeup_gain: f32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EqualizationSettings {
pub enabled: bool,
pub bands: Vec<EqBand>,
pub eq_type: EqualizationType,
pub adaptive: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EqBand {
pub frequency: f32,
pub gain: f32,
pub q_factor: f32,
pub band_type: EqBandType,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BandwidthExtensionSettings {
pub enabled: bool,
pub target_bandwidth: f32,
pub algorithm: BandwidthExtensionAlgorithm,
pub strength: f32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ComfortNoiseSettings {
pub enabled: bool,
pub level: f32,
pub color: NoiseColor,
pub adaptive_level: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct VoiceSpatializationSettings {
pub enabled: bool,
pub hrtf_personalization: HrtfPersonalizationSettings,
pub room_simulation: super::room::RoomSimulationSettings,
pub distance_modeling: super::room::DistanceModelingSettings,
pub doppler_effects: super::room::DopplerEffectsSettings,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct HrtfPersonalizationSettings {
pub enabled: bool,
pub measurements: Option<UserMeasurements>,
pub method: PersonalizationMethod,
pub adaptation_strength: f32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UserMeasurements {
pub head_circumference: f32,
pub pinna_length: f32,
pub pinna_width: f32,
pub torso_width: f32,
pub custom_measurements: HashMap<String, f32>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AudioQualityPreferences {
pub quality_level: QualityLevel,
pub adaptive_quality: bool,
pub latency_priority: LatencyPriority,
pub bandwidth_constraints: BandwidthConstraints,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BandwidthConstraints {
pub max_bandwidth: u32,
pub min_bandwidth: u32,
pub adaptive: bool,
pub measurement_interval: u32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CodecPreferences {
pub preferred_codecs: Vec<AudioCodec>,
pub codec_settings: HashMap<AudioCodec, CodecSettings>,
pub fallback_behavior: CodecFallbackBehavior,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CodecSettings {
pub bitrate: u32,
pub complexity: u8,
pub variable_bitrate: bool,
pub fec: bool,
pub parameters: HashMap<String, String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FrequencyFilterSettings {
pub highpass_cutoff: f32,
pub lowpass_cutoff: f32,
pub notch_filters: Vec<NotchFilter>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct NotchFilter {
pub frequency: f32,
pub q_factor: f32,
pub attenuation: f32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FrequencyResponseAdjustment {
pub low_freq_adjustment: f32,
pub mid_freq_adjustment: f32,
pub high_freq_adjustment: f32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AudioFormat {
pub codec: AudioCodec,
pub sample_rate: u32,
pub channels: u8,
pub bitrate: u32,
pub frame_size: usize,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AudioMetadata {
pub timestamp: SystemTime,
pub sequence: u64,
pub format: AudioFormat,
pub spatial_info: super::spatial::SpatialAudioInfo,
pub quality_info: super::quality::QualityInfo,
}
#[derive(Debug, Clone)]
pub struct ReceivedAudio {
pub user_id: String,
pub samples: Vec<f32>,
pub metadata: AudioMetadata,
pub received_at: Instant,
pub processing_status: ProcessingStatus,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AudioQualitySettings {
pub sample_rate: u32,
pub bit_depth: u8,
pub channels: ChannelConfiguration,
pub dynamic_range: f32,
pub thd_n: f32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AudioQualityStats {
pub avg_quality: f32,
pub min_quality: f32,
pub max_quality: f32,
pub adaptations: u32,
pub dropouts: u32,
pub compression_ratio: f32,
}
impl Default for TelepresenceAudioSettings {
fn default() -> Self {
Self {
input_device: AudioDeviceConfig::default(),
output_device: AudioDeviceConfig::default(),
voice_processing: VoiceProcessingSettings::default(),
quality_preferences: AudioQualityPreferences::default(),
codec_preferences: CodecPreferences::default(),
}
}
}
impl Default for AudioDeviceConfig {
fn default() -> Self {
Self {
device_id: None,
sample_rate: 48000,
buffer_size: 1024,
channels: 2,
bit_depth: 16,
device_settings: HashMap::new(),
}
}
}
impl Default for VoiceProcessingSettings {
fn default() -> Self {
Self {
agc_enabled: true,
noise_suppression: NoiseSuppressionSettings::default(),
echo_cancellation: EchoCancellationSettings::default(),
vad_settings: VadSettings::default(),
enhancement: AudioEnhancementSettings::default(),
spatialization: VoiceSpatializationSettings::default(),
}
}
}
impl Default for NoiseSuppressionSettings {
fn default() -> Self {
Self {
enabled: true,
strength: 0.7,
algorithm: NoiseSuppressionAlgorithm::Hybrid,
adaptive: true,
stationary_suppression: 0.8,
non_stationary_suppression: 0.6,
}
}
}
impl Default for EchoCancellationSettings {
fn default() -> Self {
Self {
enabled: true,
strength: 0.8,
algorithm: EchoCancellationAlgorithm::NLMS,
tail_length: 1024,
adaptation_rate: 0.01,
non_linear_processing: true,
}
}
}
impl Default for VadSettings {
fn default() -> Self {
Self {
enabled: true,
sensitivity: 0.7,
algorithm: VadAlgorithm::Hybrid,
min_voice_duration: 100.0,
min_silence_duration: 200.0,
hangover_time: 150.0,
}
}
}
impl Default for AudioEnhancementSettings {
fn default() -> Self {
Self {
enabled: true,
dynamic_range_compression: CompressionSettings::default(),
equalization: EqualizationSettings::default(),
bandwidth_extension: BandwidthExtensionSettings::default(),
comfort_noise: ComfortNoiseSettings::default(),
}
}
}
impl Default for CompressionSettings {
fn default() -> Self {
Self {
enabled: true,
ratio: 3.0,
threshold: -18.0,
attack_time: 5.0,
release_time: 50.0,
makeup_gain: 2.0,
}
}
}
impl Default for EqualizationSettings {
fn default() -> Self {
Self {
enabled: false,
bands: vec![],
eq_type: EqualizationType::Parametric,
adaptive: false,
}
}
}
impl Default for BandwidthExtensionSettings {
fn default() -> Self {
Self {
enabled: true,
target_bandwidth: 20000.0,
algorithm: BandwidthExtensionAlgorithm::SpectralReplication,
strength: 0.5,
}
}
}
impl Default for ComfortNoiseSettings {
fn default() -> Self {
Self {
enabled: true,
level: -40.0,
color: NoiseColor::Pink,
adaptive_level: true,
}
}
}
impl Default for VoiceSpatializationSettings {
fn default() -> Self {
Self {
enabled: true,
hrtf_personalization: HrtfPersonalizationSettings::default(),
room_simulation: super::room::RoomSimulationSettings::default(),
distance_modeling: super::room::DistanceModelingSettings::default(),
doppler_effects: super::room::DopplerEffectsSettings::default(),
}
}
}
impl Default for HrtfPersonalizationSettings {
fn default() -> Self {
Self {
enabled: false,
measurements: None,
method: PersonalizationMethod::Anthropometric,
adaptation_strength: 0.5,
}
}
}
impl Default for AudioQualityPreferences {
fn default() -> Self {
Self {
quality_level: QualityLevel::High,
adaptive_quality: true,
latency_priority: LatencyPriority::Medium,
bandwidth_constraints: BandwidthConstraints::default(),
}
}
}
impl Default for BandwidthConstraints {
fn default() -> Self {
Self {
max_bandwidth: 320, min_bandwidth: 32, adaptive: true,
measurement_interval: 1000, }
}
}
impl Default for CodecPreferences {
fn default() -> Self {
let mut codec_settings = HashMap::new();
codec_settings.insert(
AudioCodec::Opus,
CodecSettings {
bitrate: 128,
complexity: 8,
variable_bitrate: true,
fec: true,
parameters: HashMap::new(),
},
);
Self {
preferred_codecs: vec![AudioCodec::Opus, AudioCodec::AAC, AudioCodec::G722],
codec_settings,
fallback_behavior: CodecFallbackBehavior::NextPreferred,
}
}
}
impl Default for FrequencyFilterSettings {
fn default() -> Self {
Self {
highpass_cutoff: 100.0, lowpass_cutoff: 8000.0, notch_filters: vec![],
}
}
}
impl Default for FrequencyResponseAdjustment {
fn default() -> Self {
Self {
low_freq_adjustment: 0.0,
mid_freq_adjustment: 1.0, high_freq_adjustment: -1.0, }
}
}
impl Default for AudioQualitySettings {
fn default() -> Self {
Self {
sample_rate: 48000,
bit_depth: 16,
channels: ChannelConfiguration::Binaural,
dynamic_range: 96.0, thd_n: 0.01, }
}
}