Add PlayFile function to wyoming server

This commit is contained in:
Alex X
2025-04-24 21:23:16 +03:00
parent 890fd78a6a
commit c50e894a42
8 changed files with 226 additions and 162 deletions
+2 -46
View File
@@ -2,7 +2,6 @@ package wav
import (
"bufio"
"encoding/binary"
"errors"
"io"
@@ -17,39 +16,11 @@ func Open(r io.Reader) (*Producer, error) {
// https://www.mmsp.ece.mcgill.ca/Documents/AudioFormats/WAVE/WAVE.html
rd := bufio.NewReaderSize(r, core.BufferSize)
// skip Master RIFF chunk
if _, err := rd.Discard(12); err != nil {
codec, err := ReadHeader(r)
if err != nil {
return nil, err
}
codec := &core.Codec{}
for {
chunkID, data, err := readChunk(rd)
if err != nil {
return nil, err
}
if chunkID == "data" {
break
}
if chunkID == "fmt " {
// https://audiocoding.cc/articles/2008-05-22-wav-file-structure/wav_formats.txt
switch data[0] {
case 1:
codec.Name = core.CodecPCML
case 6:
codec.Name = core.CodecPCMA
case 7:
codec.Name = core.CodecPCMU
}
codec.Channels = data[2]
codec.ClockRate = binary.LittleEndian.Uint32(data[4:])
}
}
if codec.Name == "" {
return nil, errors.New("waw: unsupported codec")
}
@@ -110,18 +81,3 @@ func (c *Producer) Start() error {
ts += PacketSize
}
}
func readChunk(r io.Reader) (chunkID string, data []byte, err error) {
b := make([]byte, 8)
if _, err = io.ReadFull(r, b); err != nil {
return
}
if chunkID = string(b[:4]); chunkID != "data" {
size := binary.LittleEndian.Uint32(b[4:])
data = make([]byte, size)
_, err = io.ReadFull(r, data)
}
return
}
+53
View File
@@ -2,6 +2,7 @@ package wav
import (
"encoding/binary"
"io"
"github.com/AlexxIT/go2rtc/pkg/core"
)
@@ -48,3 +49,55 @@ func Header(codec *core.Codec) []byte {
return b
}
func ReadHeader(r io.Reader) (*core.Codec, error) {
// skip Master RIFF chunk
if _, err := io.ReadFull(r, make([]byte, 12)); err != nil {
return nil, err
}
var codec core.Codec
for {
chunkID, data, err := readChunk(r)
if err != nil {
return nil, err
}
if chunkID == "data" {
break
}
if chunkID == "fmt " {
// https://audiocoding.cc/articles/2008-05-22-wav-file-structure/wav_formats.txt
switch data[0] {
case 1:
codec.Name = core.CodecPCML
case 6:
codec.Name = core.CodecPCMA
case 7:
codec.Name = core.CodecPCMU
}
codec.Channels = data[2]
codec.ClockRate = binary.LittleEndian.Uint32(data[4:])
}
}
return &codec, nil
}
func readChunk(r io.Reader) (chunkID string, data []byte, err error) {
b := make([]byte, 8)
if _, err = io.ReadFull(r, b); err != nil {
return
}
if chunkID = string(b[:4]); chunkID != "data" {
size := binary.LittleEndian.Uint32(b[4:])
data = make([]byte, size)
_, err = io.ReadFull(r, data)
}
return
}