use std::sync::Arc;
use crate::transport::TransportParams;
use super::codec::Denoiser48k;
pub type DenoiserFactory = Arc<dyn Fn() -> Box<dyn Denoiser48k> + Send + Sync>;
#[derive(Clone)]
pub struct TurnServer {
pub urls: Vec<String>,
pub username: String,
pub credential: String,
}
pub async fn build_shared_udp_mux(
bind_addr: &str,
) -> std::io::Result<Arc<dyn webrtc::ice::udp_mux::UDPMux + Send + Sync>> {
let socket = tokio::net::UdpSocket::bind(bind_addr).await?;
Ok(webrtc::ice::udp_mux::UDPMuxDefault::new(
webrtc::ice::udp_mux::UDPMuxParams::new(socket),
))
}
#[derive(Clone)]
pub struct VaniWebRTCParams {
pub transport: TransportParams,
pub ice_servers: Vec<String>,
pub turn_servers: Vec<TurnServer>,
pub nat_1to1_ips: Vec<String>,
pub udp_mux: Option<Arc<dyn webrtc::ice::udp_mux::UDPMux + Send + Sync>>,
pub opus_max_avg_bitrate: u32,
pub opus_fullband: bool,
pub opus_dtx: bool,
pub denoiser_factory: Option<DenoiserFactory>,
}
impl Default for VaniWebRTCParams {
fn default() -> Self {
Self {
transport: TransportParams {
audio_in_enabled: true,
audio_in_sample_rate: Some(16_000),
audio_in_channels: 1,
audio_in_passthrough: true,
audio_in_stream_on_start: true,
audio_out_enabled: true,
..TransportParams::default()
},
ice_servers: vec!["stun:stun.l.google.com:19302".to_string()],
turn_servers: vec![],
nat_1to1_ips: vec![],
udp_mux: None,
opus_max_avg_bitrate: 510_000,
opus_fullband: true,
opus_dtx: false,
denoiser_factory: None,
}
}
}