From b0f46bc919080ff2c358c056306451b4e8a7e76c Mon Sep 17 00:00:00 2001 From: Alex X Date: Sun, 14 Dec 2025 17:17:52 +0300 Subject: [PATCH] Fix backchannel audio for xiaomi isa.camera.hlc6 --- pkg/xiaomi/backchannel.go | 28 +++++++++++++++++++++------- pkg/xiaomi/producer.go | 2 ++ 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/pkg/xiaomi/backchannel.go b/pkg/xiaomi/backchannel.go index 3e1b0f4c..0c4cefc4 100644 --- a/pkg/xiaomi/backchannel.go +++ b/pkg/xiaomi/backchannel.go @@ -4,12 +4,11 @@ import ( "time" "github.com/AlexxIT/go2rtc/pkg/core" + "github.com/AlexxIT/go2rtc/pkg/pcm" "github.com/AlexxIT/go2rtc/pkg/xiaomi/miss" "github.com/pion/rtp" ) -const size8bit40ms = 8000 * 0.040 - func (p *Producer) AddTrack(media *core.Media, _ *core.Codec, track *core.Receiver) error { if err := p.client.SpeakerStart(); err != nil { return err @@ -23,11 +22,26 @@ func (p *Producer) AddTrack(media *core.Media, _ *core.Codec, track *core.Receiv case core.CodecPCMA: var buf []byte - sender.Handler = func(pkt *rtp.Packet) { - buf = append(buf, pkt.Payload...) - for len(buf) >= size8bit40ms { - _ = p.client.WriteAudio(miss.CodecPCMA, buf[:size8bit40ms]) - buf = buf[size8bit40ms:] + if p.model == "isa.camera.hlc6" { + dst := &core.Codec{Name: core.CodecPCML, ClockRate: 8000} + transcode := pcm.Transcode(dst, track.Codec) + + sender.Handler = func(pkt *rtp.Packet) { + buf = append(buf, transcode(pkt.Payload)...) + const size = 2 * 8000 * 0.040 // 16bit 40ms + for len(buf) >= size { + _ = p.client.WriteAudio(miss.CodecPCM, buf[:size]) + buf = buf[size:] + } + } + } else { + sender.Handler = func(pkt *rtp.Packet) { + buf = append(buf, pkt.Payload...) + const size = 8000 * 0.040 // 8bit 40 ms + for len(buf) >= size { + _ = p.client.WriteAudio(miss.CodecPCMA, buf[:size]) + buf = buf[size:] + } } } case core.CodecOpus: diff --git a/pkg/xiaomi/producer.go b/pkg/xiaomi/producer.go index 6a7537e4..f9164d0b 100644 --- a/pkg/xiaomi/producer.go +++ b/pkg/xiaomi/producer.go @@ -16,6 +16,7 @@ import ( type Producer struct { core.Connection client *miss.Client + model string } func Dial(rawURL string) (core.Producer, error) { @@ -60,6 +61,7 @@ func Dial(rawURL string) (core.Producer, error) { Transport: client, }, client: client, + model: query.Get("model"), }, nil }