barnard/gumble/opus/opus.go

94 lines
1.8 KiB
Go
Raw Normal View History

package opus
import (
"git.stormux.org/storm/barnard/gumble/gumble"
"git.stormux.org/storm/barnard/gumble/go-opus"
)
var Codec gumble.AudioCodec
const (
ID = 4
VoiceChannels = 1 // Force mono for voice transmission
)
func init() {
Codec = &generator{}
gumble.RegisterAudioCodec(4, Codec)
}
// generator
type generator struct {
}
func (*generator) ID() int {
return ID
}
func (*generator) NewEncoder() gumble.AudioEncoder {
// Force mono for voice transmission
e, _ := opus.NewEncoder(gumble.AudioSampleRate, VoiceChannels, opus.AppVoIP)
e.SetBitrateToMax()
return &Encoder{
e,
}
}
func (*generator) NewDecoder() gumble.AudioDecoder {
// Create decoder with stereo support
d, _ := opus.NewDecoder(gumble.AudioSampleRate, gumble.AudioChannels)
return &Decoder{
d,
}
}
// encoder
type Encoder struct {
*opus.Encoder
}
func (*Encoder) ID() int {
return ID
}
func (e *Encoder) Encode(pcm []int16, _, maxDataBytes int) ([]byte, error) {
buf := make([]byte, maxDataBytes)
n, err := e.Encoder.Encode(pcm, buf)
if err != nil {
return []byte{}, err
}
return buf[:n], nil
}
func (e *Encoder) Reset() {
e.Encoder.Reset()
}
// decoder
type Decoder struct {
*opus.Decoder
}
func (*Decoder) ID() int {
return ID
}
func (d *Decoder) Decode(data []byte, frameSize int) ([]int16, error) {
// Allocate buffer for stereo - frameSize is per channel
pcm := make([]int16, frameSize * gumble.AudioChannels)
// Decode the data
n, err := d.Decoder.Decode(data, pcm)
if err != nil {
return []int16{}, err
}
// Return the exact number of samples decoded
return pcm[:n * gumble.AudioChannels], nil
}
func (d *Decoder) Reset() {
d.Decoder.Reset()
}