Skip to content

Commit fcf23bc

Browse files
committed
Protect encoder and decoder with a mutex.
1 parent 233f49e commit fcf23bc

File tree

1 file changed

+20
-7
lines changed

1 file changed

+20
-7
lines changed

pkg/media/opus/opus.go

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import (
1818
"errors"
1919
"fmt"
2020
"io"
21+
"sync"
2122
"time"
2223

2324
"gopkg.in/hraban/opus.v2"
@@ -89,11 +90,13 @@ func Encode(w Writer, channels int, log logger.Logger) (msdk.PCM16Writer, error)
8990
}
9091

9192
type decoder struct {
92-
w msdk.PCM16Writer
93+
log logger.Logger
9394
p params
95+
96+
mu sync.Mutex
97+
w msdk.PCM16Writer
9498
dec *opus.Decoder
9599
buf msdk.PCM16Sample
96-
log logger.Logger
97100

98101
successiveErrorCount int
99102
}
@@ -110,6 +113,8 @@ func (d *decoder) WriteSample(in Sample) error {
110113
if len(in) == 0 {
111114
return nil
112115
}
116+
d.mu.Lock()
117+
defer d.mu.Unlock()
113118
n, err := d.dec.Decode(in, d.buf)
114119
if err != nil {
115120
// Some workflows (concatenating opus files) can cause a suprious decoding error, so ignore small amount of corruption errors
@@ -126,17 +131,21 @@ func (d *decoder) WriteSample(in Sample) error {
126131
}
127132

128133
func (d *decoder) Close() error {
134+
d.mu.Lock()
135+
defer d.mu.Unlock()
129136
return d.w.Close()
130137
}
131138

132139
type encoder struct {
133-
w Writer
140+
log logger.Logger
134141
p params
135-
enc *opus.Encoder
136142
samples int
137-
inbuf msdk.PCM16Sample
138-
buf Sample
139-
log logger.Logger
143+
144+
mu sync.Mutex
145+
w Writer
146+
enc *opus.Encoder
147+
inbuf msdk.PCM16Sample
148+
buf Sample
140149

141150
successiveErrorCount int
142151
}
@@ -150,6 +159,8 @@ func (e *encoder) SampleRate() int {
150159
}
151160

152161
func (e *encoder) WriteSample(in msdk.PCM16Sample) error {
162+
e.mu.Lock()
163+
defer e.mu.Unlock()
153164
e.inbuf = append(e.inbuf, in...)
154165
for len(e.inbuf) >= e.samples {
155166
i := e.samples
@@ -185,6 +196,8 @@ func (e *encoder) flush() error {
185196
}
186197

187198
func (e *encoder) Close() error {
199+
e.mu.Lock()
200+
defer e.mu.Unlock()
188201
err1 := e.flush()
189202
err2 := e.w.Close()
190203
if err1 != nil {

0 commit comments

Comments
 (0)