Skip to content

Commit 7fe23c7

Browse files
committed
Add wav backchannel (not used yet)
1 parent d0c3cb0 commit 7fe23c7

File tree

2 files changed

+117
-0
lines changed

2 files changed

+117
-0
lines changed

pkg/wav/backchannel.go

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
package wav
2+
3+
import (
4+
"github.com/AlexxIT/go2rtc/pkg/core"
5+
"github.com/AlexxIT/go2rtc/pkg/shell"
6+
"github.com/pion/rtp"
7+
)
8+
9+
type Backchannel struct {
10+
core.Connection
11+
cmd *shell.Command
12+
}
13+
14+
func NewBackchannel(cmd *shell.Command) (core.Producer, error) {
15+
medias := []*core.Media{
16+
{
17+
Kind: core.KindAudio,
18+
Direction: core.DirectionSendonly,
19+
Codecs: []*core.Codec{
20+
//{Name: core.CodecPCML},
21+
{Name: core.CodecPCMA},
22+
{Name: core.CodecPCMU},
23+
},
24+
},
25+
}
26+
27+
return &Backchannel{
28+
Connection: core.Connection{
29+
ID: core.NewID(),
30+
FormatName: "wav",
31+
Protocol: "pipe",
32+
Medias: medias,
33+
Transport: cmd,
34+
},
35+
cmd: cmd,
36+
}, nil
37+
}
38+
39+
func (c *Backchannel) GetTrack(media *core.Media, codec *core.Codec) (*core.Receiver, error) {
40+
return nil, core.ErrCantGetTrack
41+
}
42+
43+
func (c *Backchannel) AddTrack(media *core.Media, codec *core.Codec, track *core.Receiver) error {
44+
wr, err := c.cmd.StdinPipe()
45+
if err != nil {
46+
return err
47+
}
48+
49+
b := Header(track.Codec)
50+
if _, err = wr.Write(b); err != nil {
51+
return err
52+
}
53+
54+
sender := core.NewSender(media, track.Codec)
55+
sender.Handler = func(packet *rtp.Packet) {
56+
if n, err := wr.Write(packet.Payload); err != nil {
57+
c.Send += n
58+
}
59+
}
60+
sender.HandleRTP(track)
61+
c.Senders = append(c.Senders, sender)
62+
return nil
63+
}
64+
65+
func (c *Backchannel) Start() error {
66+
return c.cmd.Run()
67+
}

pkg/wav/wav.go

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package wav
2+
3+
import (
4+
"encoding/binary"
5+
6+
"github.com/AlexxIT/go2rtc/pkg/core"
7+
)
8+
9+
func Header(codec *core.Codec) []byte {
10+
var fmt, size, extra byte
11+
12+
switch codec.Name {
13+
case core.CodecPCML:
14+
fmt = 1
15+
size = 2
16+
case core.CodecPCMA:
17+
fmt = 6
18+
size = 1
19+
extra = 2
20+
case core.CodecPCMU:
21+
fmt = 7
22+
size = 1
23+
extra = 2
24+
default:
25+
return nil
26+
}
27+
28+
channels := byte(codec.Channels)
29+
if channels == 0 {
30+
channels = 1
31+
}
32+
33+
b := make([]byte, 0, 46) // cap with extra
34+
b = append(b, "RIFF\xFF\xFF\xFF\xFFWAVEfmt "...)
35+
36+
b = append(b, 0x10+extra, 0, 0, 0)
37+
b = append(b, fmt, 0)
38+
b = append(b, channels, 0)
39+
b = binary.LittleEndian.AppendUint32(b, codec.ClockRate)
40+
b = binary.LittleEndian.AppendUint32(b, uint32(size*channels)*codec.ClockRate)
41+
b = append(b, size*channels, 0)
42+
b = append(b, size*8, 0)
43+
if extra > 0 {
44+
b = append(b, 0, 0) // ExtraParamSize (if PCM, then doesn't exist)
45+
}
46+
47+
b = append(b, "data\xFF\xFF\xFF\xFF"...)
48+
49+
return b
50+
}

0 commit comments

Comments
 (0)