Initial commit, lots of cleanup and stuff to do, it may not work.
This commit is contained in:
92
gumble/opus/opus.go
Normal file
92
gumble/opus/opus.go
Normal file
@ -0,0 +1,92 @@
|
||||
package opus
|
||||
|
||||
import (
|
||||
"git.2mb.codes/~cmb/barnard/gumble/gumble"
|
||||
"github.com/hraban/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()
|
||||
}
|
Reference in New Issue
Block a user