fix(proxy-engine): use negotiated SDP payload types when wiring SIP legs and enable default nnnoiseless features for telephony denoising
This commit is contained in:
@@ -10,7 +10,7 @@ path = "src/main.rs"
|
||||
[dependencies]
|
||||
codec-lib = { path = "../codec-lib" }
|
||||
sip-proto = { path = "../sip-proto" }
|
||||
nnnoiseless = { version = "0.5", default-features = false }
|
||||
nnnoiseless = "0.5"
|
||||
tokio = { version = "1", features = ["full"] }
|
||||
serde = { version = "1", features = ["derive"] }
|
||||
serde_json = "1"
|
||||
|
||||
@@ -196,7 +196,17 @@ impl CallManager {
|
||||
};
|
||||
// Mutable borrow on call/leg is now released.
|
||||
|
||||
let sip_pt = codecs.first().copied().unwrap_or(9);
|
||||
let mut sip_pt = codecs.first().copied().unwrap_or(9);
|
||||
|
||||
// If the message has SDP (e.g., 200 OK answer), use the negotiated codec
|
||||
// instead of the offered one.
|
||||
if msg.has_sdp_body() {
|
||||
if let Some(ep) = parse_sdp_endpoint(&msg.body) {
|
||||
if let Some(pt) = ep.codec_pt {
|
||||
sip_pt = pt;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
match action {
|
||||
SipLegAction::None => {}
|
||||
@@ -301,12 +311,20 @@ impl CallManager {
|
||||
);
|
||||
|
||||
// Wire device leg to mixer.
|
||||
// Use the device's preferred codec from its INVITE SDP,
|
||||
// not the provider's negotiated codec.
|
||||
let dev_pt = device_invite
|
||||
.has_sdp_body()
|
||||
.then(|| parse_sdp_endpoint(&device_invite.body))
|
||||
.flatten()
|
||||
.and_then(|ep| ep.codec_pt)
|
||||
.unwrap_or(sip_pt);
|
||||
if let Some(dev_remote_addr) = dev_remote {
|
||||
let dev_channels = create_leg_channels();
|
||||
spawn_sip_inbound(dev_rtp_socket.clone(), dev_channels.inbound_tx);
|
||||
spawn_sip_outbound(dev_rtp_socket, dev_remote_addr, dev_channels.outbound_rx);
|
||||
if let Some(call) = self.calls.get(call_id) {
|
||||
call.add_leg_to_mixer(&dev_leg_id, sip_pt, dev_channels.inbound_rx, dev_channels.outbound_tx)
|
||||
call.add_leg_to_mixer(&dev_leg_id, dev_pt, dev_channels.inbound_rx, dev_channels.outbound_tx)
|
||||
.await;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -368,8 +368,8 @@ async fn mixer_loop(
|
||||
.unwrap_or_else(|_| vec![0.0f32; MIX_FRAME_SIZE])
|
||||
};
|
||||
// Per-leg inbound denoising at 48kHz.
|
||||
// Skip for Opus/WebRTC legs — browsers already apply
|
||||
// their own noise suppression via getUserMedia.
|
||||
// Only for SIP telephony legs — WebRTC browsers
|
||||
// already apply noise suppression via getUserMedia.
|
||||
let processed = if slot.codec_pt != codec_lib::PT_OPUS {
|
||||
TranscodeState::denoise_f32(&mut slot.denoiser, &pcm_48k)
|
||||
} else {
|
||||
|
||||
Reference in New Issue
Block a user