pub mod mt {
pub const HANDSHAKE: u8 = 0;
pub const AUDIO: u8 = 1;
pub const TEXT: u8 = 2;
pub const CONTROL: u8 = 3;
pub const ERROR: u8 = 5;
}
pub mod ctrl {
pub const END_TURN: u8 = 1;
pub const PAUSE: u8 = 2;
pub const RESTART: u8 = 3;
}
pub const OGG_SERIAL: u32 = 42;
pub const MOSHI_SAMPLE_RATE: u32 = 24_000;
pub const OPUS_FRAME_SAMPLES: usize = 960;
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn message_type_constants_are_distinct() {
let all = [mt::HANDSHAKE, mt::AUDIO, mt::TEXT, mt::CONTROL, mt::ERROR];
let unique: std::collections::HashSet<u8> = all.iter().copied().collect();
assert_eq!(unique.len(), all.len(), "MT constants must be unique");
}
#[test]
fn control_constants_are_distinct() {
let all = [ctrl::END_TURN, ctrl::PAUSE, ctrl::RESTART];
let unique: std::collections::HashSet<u8> = all.iter().copied().collect();
assert_eq!(unique.len(), all.len(), "ctrl constants must be unique");
}
#[test]
fn moshi_sample_rate_is_24k() {
assert_eq!(MOSHI_SAMPLE_RATE, 24_000);
}
#[test]
fn opus_frame_samples_is_40ms_at_24k() {
assert_eq!(
OPUS_FRAME_SAMPLES,
(MOSHI_SAMPLE_RATE as usize) * 40 / 1_000
);
}
}