diff --git a/crates/chanora_audio/src/audio_processing.rs b/crates/chanora_audio/src/audio_processing.rs index f166c3b..ce5750c 100644 --- a/crates/chanora_audio/src/audio_processing.rs +++ b/crates/chanora_audio/src/audio_processing.rs @@ -210,17 +210,6 @@ impl AudioProcessingConfig { Ok(()) } - /// Demote a failed VAD backend to the WebRTC fallback. - /// - /// Returns `true` when the config changed. - pub fn disable_failed_vad_backend(&mut self, failed_backend: VadBackend) -> bool { - if self.vad_backend == failed_backend && failed_backend != VadBackend::WebrtcVad { - self.vad_backend = VadBackend::WebrtcVad; - true - } else { - false - } - } } #[cfg(test)] @@ -251,18 +240,6 @@ mod tests { assert!(config.validate_for_ios().is_err()); } - - #[test] - fn disable_failed_vad_backend_demotes_to_webrtc() { - let mut config = AudioProcessingConfig { - vad_backend: VadBackend::SileroOnnx, - ..AudioProcessingConfig::default() - }; - - assert!(config.disable_failed_vad_backend(VadBackend::SileroOnnx)); - assert_eq!(config.vad_backend, VadBackend::WebrtcVad); - assert!(!config.disable_failed_vad_backend(VadBackend::SileroOnnx)); - } } /// Runtime audio processing stats exposed to bridge/UI diagnostics. diff --git a/crates/chanora_audio/src/frame.rs b/crates/chanora_audio/src/frame.rs index 2c68126..b2c8ca8 100644 --- a/crates/chanora_audio/src/frame.rs +++ b/crates/chanora_audio/src/frame.rs @@ -16,50 +16,6 @@ pub const FRAME_10MS_SAMPLES: usize = 480; /// Samples in one 20 ms mono frame at 48 kHz. pub const FRAME_20MS_SAMPLES: usize = 960; -/// 10 ms, 48 kHz, mono f32 processing frame. -#[derive(Debug, Clone, PartialEq)] -pub struct AudioFrame10ms { - /// Samples normalized to `[-1.0, 1.0]`. - pub samples: [f32; FRAME_10MS_SAMPLES], -} - -/// 20 ms, 48 kHz, mono f32 network-frame-sized buffer. -#[derive(Debug, Clone, PartialEq)] -pub struct AudioFrame20ms { - /// Samples normalized to `[-1.0, 1.0]`. - pub samples: [f32; FRAME_20MS_SAMPLES], -} - -impl AudioFrame20ms { - /// Convert one 20 ms frame into two 10 ms processing frames. - pub fn split(&self) -> (AudioFrame10ms, AudioFrame10ms) { - let mut first = [0.0; FRAME_10MS_SAMPLES]; - let mut second = [0.0; FRAME_10MS_SAMPLES]; - first.copy_from_slice(&self.samples[..FRAME_10MS_SAMPLES]); - second.copy_from_slice(&self.samples[FRAME_10MS_SAMPLES..]); - ( - AudioFrame10ms { samples: first }, - AudioFrame10ms { samples: second }, - ) - } -} - -impl AudioFrame10ms { - /// Merge two 10 ms processing frames back into the 20 ms network - /// cadence used by the existing Opus path. - pub fn merge(first: &Self, second: &Self) -> AudioFrame20ms { - let mut samples = [0.0; FRAME_20MS_SAMPLES]; - samples[..FRAME_10MS_SAMPLES].copy_from_slice(&first.samples); - samples[FRAME_10MS_SAMPLES..].copy_from_slice(&second.samples); - AudioFrame20ms { samples } - } - - /// Compute RMS dBFS for diagnostics and fallback VAD. - pub fn dbfs(&self) -> f32 { - dbfs(&self.samples) - } -} - /// Convert i16 PCM to normalized f32 PCM. pub fn i16_to_f32(sample: i16) -> f32 { sample as f32 / i16::MAX as f32 @@ -84,18 +40,4 @@ pub fn dbfs(samples: &[f32]) -> f32 { } } -#[cfg(test)] -mod tests { - use super::*; - #[test] - fn split_merge_preserves_samples() { - let mut samples = [0.0; FRAME_20MS_SAMPLES]; - for (i, s) in samples.iter_mut().enumerate() { - *s = i as f32 / FRAME_20MS_SAMPLES as f32; - } - let original = AudioFrame20ms { samples }; - let (a, b) = original.split(); - assert_eq!(AudioFrame10ms::merge(&a, &b), original); - } -} diff --git a/crates/chanora_state/src/lib.rs b/crates/chanora_state/src/lib.rs index 5a624ea..394933d 100644 --- a/crates/chanora_state/src/lib.rs +++ b/crates/chanora_state/src/lib.rs @@ -110,11 +110,6 @@ impl ServerState { } } - /// Replace state with a fresh snapshot (post-reconnect). Satisfies SRS-059. - pub fn replace_from_snapshot(&mut self, snapshot: ServerSnapshot) { - *self = Self::from_snapshot(snapshot); - } - /// Look up a channel by id. pub fn channel(&self, id: ChannelId) -> Option<&ChannelInfo> { self.channels.get(&id.0) @@ -144,16 +139,6 @@ impl ServerState { .filter_map(|id| self.clients.get(id)) } - /// Number of channels. - pub fn channel_count(&self) -> usize { - self.channels.len() - } - - /// Number of clients. - pub fn client_count(&self) -> usize { - self.clients.len() - } - /// The channel our own client is currently in. pub fn own_channel(&self) -> Option<&ChannelInfo> { self.client(ClientId(self.own_client_id)) @@ -463,8 +448,8 @@ mod tests { assert!(state.is_some()); let s = state.as_ref().unwrap(); assert_eq!(s.connection_state, ConnectionState::Ready); - assert_eq!(s.channel_count(), 2); - assert_eq!(s.client_count(), 1); + assert_eq!(s.channels().count(), 2); + assert_eq!(s.clients().count(), 1); assert_eq!(s.own_client_id, 10); assert_eq!( reduction.deltas, @@ -489,7 +474,7 @@ mod tests { }; let reduction = reduce(&mut state, StateEvent::ChannelChanged(ch.clone())); let s = state.as_ref().unwrap(); - assert_eq!(s.channel_count(), 3); + assert_eq!(s.channels().count(), 3); assert!(s.channel(ChannelId(3)).is_some()); assert!(matches!(&reduction.deltas[..], [Delta::ChannelUpserted(_)])); let updated = ChannelInfo { @@ -501,7 +486,7 @@ mod tests { state.as_ref().unwrap().channel(ChannelId(3)).unwrap().name, "renamed" ); - assert_eq!(state.as_ref().unwrap().channel_count(), 3); + assert_eq!(state.as_ref().unwrap().channels().count(), 3); } #[test] @@ -510,7 +495,7 @@ mod tests { reduce(&mut state, StateEvent::Snapshot(sample_snapshot())); let reduction = reduce(&mut state, StateEvent::ChannelDeleted(ChannelId(2))); let s = state.as_ref().unwrap(); - assert_eq!(s.channel_count(), 1); + assert_eq!(s.channels().count(), 1); assert!(s.channel(ChannelId(2)).is_none()); assert!(matches!(&reduction.deltas[..], [Delta::ChannelRemoved(_)])); } @@ -528,7 +513,7 @@ mod tests { assert!(s.channel(ChannelId(2)).is_none()); assert!(s.client(ClientId(20)).is_none()); assert!(s.client(ClientId(30)).is_none()); - assert_eq!(s.client_count(), 1); + assert_eq!(s.clients().count(), 1); assert_eq!(s.clients_in_channel(ChannelId(2)).count(), 0); assert_eq!( reduction.deltas, @@ -547,7 +532,7 @@ mod tests { let new_client = sample_client(20, 2); let reduction = reduce(&mut state, StateEvent::ClientChanged(new_client)); let s = state.as_ref().unwrap(); - assert_eq!(s.client_count(), 2); + assert_eq!(s.clients().count(), 2); assert!(matches!(&reduction.deltas[..], [Delta::ClientUpserted(_)])); let moved = ClientInfo { channel: ChannelId(2), @@ -570,7 +555,7 @@ mod tests { let mut state = None; reduce(&mut state, StateEvent::Snapshot(sample_snapshot())); let reduction = reduce(&mut state, StateEvent::ClientLeft(ClientId(10))); - assert_eq!(state.as_ref().unwrap().client_count(), 0); + assert_eq!(state.as_ref().unwrap().clients().count(), 0); assert!(matches!(&reduction.deltas[..], [Delta::ClientRemoved(_)])); } @@ -578,7 +563,7 @@ mod tests { fn reconnect_discards_stale_state() { let mut state = None; reduce(&mut state, StateEvent::Snapshot(sample_snapshot())); - assert_eq!(state.as_ref().unwrap().channel_count(), 2); + assert_eq!(state.as_ref().unwrap().channels().count(), 2); let reduction = reduce(&mut state, StateEvent::ReconnectStarted); assert!(state.is_none()); assert!(matches!( @@ -594,8 +579,8 @@ mod tests { reduce_reconnect_snapshot(&mut state, snap2); let s = state.as_ref().unwrap(); assert_eq!(s.server_name, "New Server"); - assert_eq!(s.channel_count(), 1); - assert_eq!(s.client_count(), 1); + assert_eq!(s.channels().count(), 1); + assert_eq!(s.clients().count(), 1); } #[test] @@ -685,9 +670,7 @@ mod tests { let reduction = reduce(&mut state, StateEvent::Snapshot(snapshot)); let s = state.as_ref().unwrap(); - assert_eq!(s.channel_count(), 2); assert_eq!(s.channels().count(), 2); - assert_eq!(s.client_count(), 1); assert_eq!(s.clients().count(), 1); assert_eq!(s.channel(ChannelId(1)).unwrap().name, "duplicate"); assert_eq!(s.client(ClientId(10)).unwrap().channel, ChannelId(2)); @@ -766,7 +749,7 @@ mod tests { reduce(&mut state, StateEvent::Snapshot(sample_snapshot())); let reduction = reduce(&mut state, StateEvent::ChannelDeleted(ChannelId(999))); assert!(reduction.deltas.is_empty()); - assert_eq!(state.as_ref().unwrap().channel_count(), 2); + assert_eq!(state.as_ref().unwrap().channels().count(), 2); } #[test] @@ -795,12 +778,12 @@ mod tests { deltas_b.extend(reduce(&mut b, e.clone()).deltas); } assert_eq!( - a.as_ref().unwrap().channel_count(), - b.as_ref().unwrap().channel_count() + a.as_ref().unwrap().channels().count(), + b.as_ref().unwrap().channels().count() ); assert_eq!( - a.as_ref().unwrap().client_count(), - b.as_ref().unwrap().client_count() + a.as_ref().unwrap().clients().count(), + b.as_ref().unwrap().clients().count() ); assert_eq!( a.as_ref().unwrap().own_client_id,