From 6df1e68a5fac7be6f1dd91f22cd7a20ac43afa5b Mon Sep 17 00:00:00 2001 From: Alex X Date: Tue, 22 Apr 2025 10:26:00 +0300 Subject: [PATCH] Update wyoming producer and backchannel --- pkg/pcm/pcm.go | 1 + pkg/wyoming/backchannel.go | 23 ++++++++++++++++++++++- pkg/wyoming/producer.go | 22 ++++++++++++++++++++++ pkg/wyoming/wyoming.go | 20 ++------------------ 4 files changed, 47 insertions(+), 19 deletions(-) diff --git a/pkg/pcm/pcm.go b/pkg/pcm/pcm.go index bf54a6cf..13405ad4 100644 --- a/pkg/pcm/pcm.go +++ b/pkg/pcm/pcm.go @@ -203,5 +203,6 @@ func ProducerCodecs() []*core.Codec { {Name: core.CodecPCM, ClockRate: 8000}, {Name: core.CodecPCMA, ClockRate: 8000}, {Name: core.CodecPCMU, ClockRate: 8000}, + {Name: core.CodecPCML, ClockRate: 22050}, // wyoming-snd-external } } diff --git a/pkg/wyoming/backchannel.go b/pkg/wyoming/backchannel.go index 8760789e..b4167ff1 100644 --- a/pkg/wyoming/backchannel.go +++ b/pkg/wyoming/backchannel.go @@ -2,6 +2,7 @@ package wyoming import ( "fmt" + "net" "time" "github.com/AlexxIT/go2rtc/pkg/core" @@ -13,6 +14,26 @@ type Backchannel struct { api *API } +func newBackchannel(conn net.Conn) *Backchannel { + return &Backchannel{ + core.Connection{ + ID: core.NewID(), + FormatName: "wyoming", + Medias: []*core.Media{ + { + Kind: core.KindAudio, + Direction: core.DirectionSendonly, + Codecs: []*core.Codec{ + {Name: core.CodecPCML, ClockRate: 22050}, + }, + }, + }, + Transport: conn, + }, + NewAPI(conn), + } +} + func (b *Backchannel) GetTrack(media *core.Media, codec *core.Codec) (*core.Receiver, error) { return nil, core.ErrCantGetTrack } @@ -23,7 +44,7 @@ func (b *Backchannel) AddTrack(media *core.Media, codec *core.Codec, track *core ts := time.Now().Nanosecond() evt := &Event{ Type: "audio-chunk", - Data: []byte(fmt.Sprintf(`{"rate":16000,"width":2,"channels":1,"timestamp":%d}`, ts)), + Data: []byte(fmt.Sprintf(`{"rate":22050,"width":2,"channels":1,"timestamp":%d}`, ts)), Payload: pkt.Payload, } _ = b.api.WriteEvent(evt) diff --git a/pkg/wyoming/producer.go b/pkg/wyoming/producer.go index 9cd6abb6..09451333 100644 --- a/pkg/wyoming/producer.go +++ b/pkg/wyoming/producer.go @@ -1,6 +1,8 @@ package wyoming import ( + "net" + "github.com/AlexxIT/go2rtc/pkg/core" "github.com/pion/rtp" ) @@ -10,6 +12,26 @@ type Producer struct { api *API } +func newProducer(conn net.Conn) *Producer { + return &Producer{ + core.Connection{ + ID: core.NewID(), + FormatName: "wyoming", + Medias: []*core.Media{ + { + Kind: core.KindAudio, + Direction: core.DirectionRecvonly, + Codecs: []*core.Codec{ + {Name: core.CodecPCML, ClockRate: 16000}, + }, + }, + }, + Transport: conn, + }, + NewAPI(conn), + } +} + func (p *Producer) Start() error { var seq uint16 var ts uint32 diff --git a/pkg/wyoming/wyoming.go b/pkg/wyoming/wyoming.go index 96d1dc5e..0c8eebae 100644 --- a/pkg/wyoming/wyoming.go +++ b/pkg/wyoming/wyoming.go @@ -18,25 +18,9 @@ func Dial(rawURL string) (core.Producer, error) { return nil, err } - cc := core.Connection{ - ID: core.NewID(), - FormatName: "wyoming", - Medias: []*core.Media{ - { - Kind: core.KindAudio, - Codecs: []*core.Codec{ - {Name: core.CodecPCML, ClockRate: 16000}, - }, - }, - }, - Transport: conn, - } - if u.Query().Get("backchannel") != "1" { - cc.Medias[0].Direction = core.DirectionRecvonly - return &Producer{cc, NewAPI(conn)}, nil + return newProducer(conn), nil } else { - cc.Medias[0].Direction = core.DirectionSendonly - return &Backchannel{cc, NewAPI(conn)}, nil + return newBackchannel(conn), nil } }