69 lines
2.1 KiB
Rust
69 lines
2.1 KiB
Rust
// Server contract for future Opus upstream audio handoff.
|
|
//
|
|
// Scope: inspect the UAC voice sink and shared audio transport helpers.
|
|
// Targets: `server/src/audio/voice_input.rs` and `common/src/audio_transport.rs`.
|
|
// Why: compressed Opus payloads must be decoded to PCM before UAC. If decode is
|
|
// unavailable or fails, the packet should be rejected safely and visibly.
|
|
|
|
use lesavka_common::audio_transport::{
|
|
AudioTransportProfile, packet_audio_profile, packet_is_raw_pcm_s16le,
|
|
};
|
|
use lesavka_common::lesavka::{AudioEncoding, AudioPacket};
|
|
|
|
const VOICE_INPUT: &str = include_str!(concat!(
|
|
env!("CARGO_MANIFEST_DIR"),
|
|
"/server/src/audio/voice_input.rs"
|
|
));
|
|
const OPUS_DECODE: &str = include_str!(concat!(
|
|
env!("CARGO_MANIFEST_DIR"),
|
|
"/server/src/audio/opus_decode.rs"
|
|
));
|
|
|
|
#[test]
|
|
fn uac_sink_remains_raw_pcm_and_guards_compressed_packets() {
|
|
for expected in [
|
|
"audio/x-raw",
|
|
"S16LE",
|
|
"packet_is_raw_pcm_s16le",
|
|
"AudioEncoding::Opus",
|
|
"decode_packet(pkt)",
|
|
"dropping Opus microphone packet because opusdec is unavailable",
|
|
"dropping Opus microphone packet after decode failure",
|
|
] {
|
|
assert!(
|
|
VOICE_INPUT.contains(expected),
|
|
"UAC sink should preserve compressed-audio safety marker {expected}"
|
|
);
|
|
}
|
|
for expected in [
|
|
"OpusPacketDecoder",
|
|
"opusdec",
|
|
"audio/x-opus",
|
|
"audio/x-raw",
|
|
] {
|
|
assert!(
|
|
OPUS_DECODE.contains(expected),
|
|
"Opus decoder should preserve decode-to-PCM marker {expected}"
|
|
);
|
|
}
|
|
}
|
|
|
|
#[test]
|
|
fn opus_packets_are_detected_as_compressed_before_uac_handoff() {
|
|
let opus_packet = AudioPacket {
|
|
encoding: AudioEncoding::Opus as i32,
|
|
sample_rate: 48_000,
|
|
channels: 2,
|
|
frame_duration_us: 20_000,
|
|
data: vec![0x55; 160],
|
|
..AudioPacket::default()
|
|
};
|
|
|
|
assert_eq!(
|
|
packet_audio_profile(&opus_packet),
|
|
AudioTransportProfile::opus_voice()
|
|
);
|
|
assert!(!packet_is_raw_pcm_s16le(&opus_packet));
|
|
assert!(packet_is_raw_pcm_s16le(&AudioPacket::default()));
|
|
}
|