Fix backchannel audio for xiaomi isa.camera.hlc6

This commit is contained in:
Alex X
2025-12-14 17:17:52 +03:00
parent a4d4598a13
commit b0f46bc919
2 changed files with 23 additions and 7 deletions

View File

@@ -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:

View File

@@ -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
}