mirror of
https://github.com/pion/mediadevices.git
synced 2025-09-27 12:52:20 +08:00

To avoid buffering audio data multiple times, remove buffer from malgo audio driver and pass expected codec latency as a codec parameter.
73 lines
1.9 KiB
Go
73 lines
1.9 KiB
Go
package opus
|
|
|
|
import (
|
|
"time"
|
|
|
|
"github.com/pion/mediadevices/pkg/codec"
|
|
"github.com/pion/mediadevices/pkg/io/audio"
|
|
"github.com/pion/mediadevices/pkg/prop"
|
|
"github.com/pion/mediadevices/pkg/wave/mixer"
|
|
)
|
|
|
|
// Latency is a type of OPUS codec frame duration.
|
|
type Latency time.Duration
|
|
|
|
// Latency values available in OPUS codec.
|
|
const (
|
|
Latency2500us Latency = Latency(2500 * time.Microsecond)
|
|
Latency5ms Latency = Latency(5 * time.Millisecond)
|
|
Latency10ms Latency = Latency(10 * time.Millisecond)
|
|
Latency20ms Latency = Latency(20 * time.Millisecond)
|
|
Latency40ms Latency = Latency(40 * time.Millisecond)
|
|
Latency60ms Latency = Latency(60 * time.Millisecond)
|
|
)
|
|
|
|
// Validate that the Latency is allowed in OPUS.
|
|
func (l Latency) Validate() bool {
|
|
switch l {
|
|
case Latency2500us, Latency5ms, Latency10ms, Latency20ms, Latency40ms, Latency60ms:
|
|
return true
|
|
default:
|
|
return false
|
|
}
|
|
}
|
|
|
|
// Duration returns latency in time.Duration.
|
|
func (l Latency) Duration() time.Duration {
|
|
return time.Duration(l)
|
|
}
|
|
|
|
// samples returns number of samples for given sample rate.
|
|
func (l Latency) samples(sampleRate int) int {
|
|
return int(l.Duration() * time.Duration(sampleRate) / time.Second)
|
|
}
|
|
|
|
// Params stores opus specific encoding parameters.
|
|
type Params struct {
|
|
codec.BaseParams
|
|
// ChannelMixer is a mixer to be used if number of given and expected channels differ.
|
|
ChannelMixer mixer.ChannelMixer
|
|
|
|
// Expected latency of the codec.
|
|
Latency Latency
|
|
}
|
|
|
|
// NewParams returns default opus codec specific parameters.
|
|
func NewParams() (Params, error) {
|
|
return Params{
|
|
Latency: Latency20ms,
|
|
}, nil
|
|
}
|
|
|
|
// RTPCodec represents the codec metadata
|
|
func (p *Params) RTPCodec() *codec.RTPCodec {
|
|
c := codec.NewRTPOpusCodec(48000)
|
|
c.Latency = time.Duration(p.Latency)
|
|
return c
|
|
}
|
|
|
|
// BuildAudioEncoder builds opus encoder with given params
|
|
func (p *Params) BuildAudioEncoder(r audio.Reader, property prop.Media) (codec.ReadCloser, error) {
|
|
return newEncoder(r, property, *p)
|
|
}
|