🎉 live server seems to be working now
This commit is contained in:
52
third_party/sendspin-go/pkg/audio/decode/pcm.go
vendored
Normal file
52
third_party/sendspin-go/pkg/audio/decode/pcm.go
vendored
Normal file
@@ -0,0 +1,52 @@
|
||||
// ABOUTME: PCM audio decoder
|
||||
// ABOUTME: Decodes 16-bit and 24-bit PCM audio to int32 samples
|
||||
package decode
|
||||
|
||||
import (
|
||||
"encoding/binary"
|
||||
"fmt"
|
||||
|
||||
"github.com/Sendspin/sendspin-go/pkg/audio"
|
||||
)
|
||||
|
||||
type PCMDecoder struct {
|
||||
bitDepth int
|
||||
}
|
||||
|
||||
func NewPCM(format audio.Format) (Decoder, error) {
|
||||
if format.Codec != "pcm" {
|
||||
return nil, fmt.Errorf("invalid codec for PCM decoder: %s", format.Codec)
|
||||
}
|
||||
|
||||
if format.BitDepth != 16 && format.BitDepth != 24 {
|
||||
return nil, fmt.Errorf("unsupported bit depth: %d (supported: 16, 24)", format.BitDepth)
|
||||
}
|
||||
|
||||
return &PCMDecoder{
|
||||
bitDepth: format.BitDepth,
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (d *PCMDecoder) Decode(data []byte) ([]int32, error) {
|
||||
if d.bitDepth == 24 {
|
||||
numSamples := len(data) / 3
|
||||
samples := make([]int32, numSamples)
|
||||
for i := 0; i < numSamples; i++ {
|
||||
b := [3]byte{data[i*3], data[i*3+1], data[i*3+2]}
|
||||
samples[i] = audio.SampleFrom24Bit(b)
|
||||
}
|
||||
return samples, nil
|
||||
} else {
|
||||
numSamples := len(data) / 2
|
||||
samples := make([]int32, numSamples)
|
||||
for i := 0; i < numSamples; i++ {
|
||||
sample16 := int16(binary.LittleEndian.Uint16(data[i*2:]))
|
||||
samples[i] = audio.SampleFromInt16(sample16)
|
||||
}
|
||||
return samples, nil
|
||||
}
|
||||
}
|
||||
|
||||
func (d *PCMDecoder) Close() error {
|
||||
return nil
|
||||
}
|
||||
Reference in New Issue
Block a user