@@ -19,7 +19,7 @@ type PbReader struct {
19
19
sync.RWMutex
20
20
enabled bool
21
21
name string
22
- codecs map [string ]audiocodec.Decoder
22
+ decoders map [string ]audiocodec.Decoder
23
23
decoder audiocodec.Decoder
24
24
callback audio.OnDataCb
25
25
lastUser string
@@ -30,7 +30,7 @@ func NewPbReader() (*PbReader, error) {
30
30
31
31
pbr := & PbReader {
32
32
name : "ProtoBufReader" ,
33
- codecs : make (map [string ]audiocodec.Decoder ),
33
+ decoders : make (map [string ]audiocodec.Decoder ),
34
34
lastUser : "" ,
35
35
}
36
36
@@ -121,15 +121,15 @@ func (pbr *PbReader) Enqueue(data []byte) error {
121
121
// users arrive at the same time. This ends up in a very distorted
122
122
// audio. Therefore we create a new decoder on demand for each txUser
123
123
if pbr .lastUser != txUser {
124
- codec , ok := pbr .codecs [txUser ]
124
+ codec , ok := pbr .decoders [txUser ]
125
125
if ! ok {
126
126
switch codecName {
127
127
case "opus" :
128
128
newCodec , err := newOpusDecoder (channels )
129
129
if err != nil {
130
130
return (err )
131
131
}
132
- pbr .codecs [txUser ] = newCodec
132
+ pbr .decoders [txUser ] = newCodec
133
133
pbr .decoder = newCodec
134
134
case "pcm" :
135
135
// in case of PCM we might have to resample the audio
@@ -143,6 +143,11 @@ func (pbr *PbReader) Enqueue(data []byte) error {
143
143
144
144
num , err := pbr .decoder .Decode (msg .Data , buf )
145
145
if err != nil {
146
+ // in case the txUser has switched from stereo to mono
147
+ // the samples won't fit into buf anymore. Therefore we
148
+ // simple ignore the sample and delete the decoder for that user
149
+ delete (pbr .decoders , txUser )
150
+ pbr .lastUser = ""
146
151
return err
147
152
}
148
153
0 commit comments