diff --git a/pkg/sip/media_port.go b/pkg/sip/media_port.go index 10875886..b2d2767e 100644 --- a/pkg/sip/media_port.go +++ b/pkg/sip/media_port.go @@ -405,8 +405,14 @@ type MediaPort interface { GetOutboundDTMFWriter() msdk.WriteCloser[*livekit.SipDTMF] // WriteInboundAudioTo tells port where to write inbound SIP audio. + // + // MediaPort.Close() will propagate to the argument writer. The caller is + // responsible for closing the returned media writer. WriteInboundAudioTo(w msdk.PCM16Writer) msdk.PCM16Writer + // WriteInboundDTMFTo tells port where to write inbound SIP DTMF. + // + // Has similar close semantics to WriteInboundAudioTo (see comment above). WriteInboundDTMFTo(w msdk.WriteCloser[*livekit.SipDTMF]) msdk.WriteCloser[*livekit.SipDTMF] // If there is no offer, this generates an offer. @@ -735,7 +741,6 @@ func (p *mediaPort) GetOutboundAudioWriter() msdk.PCM16Writer { return p.audioOut } -// WriteInboundAudioTo sets audio writer that will receive decoded PCM from incoming RTP packets. func (p *mediaPort) WriteInboundAudioTo(w msdk.PCM16Writer) msdk.PCM16Writer { return p.audioIn.Swap(w) } diff --git a/pkg/sip/outbound.go b/pkg/sip/outbound.go index 2cf4f36a..1ced80fc 100644 --- a/pkg/sip/outbound.go +++ b/pkg/sip/outbound.go @@ -560,6 +560,9 @@ func (c *outboundCall) connectMedia() { old.Close() c.log.Warnw("media port has unexpected inbound audio writer", nil) } + // WriteInboundAudioTo takes ownership of c.lkRoomIn, so nil it out to avoid + // double-closing later. + c.lkRoomIn = nil if old := c.media.WriteInboundDTMFTo(c.lkRoom.GetInboundDTMFWriter()); old != nil { old.Close()