/
memory_audio_buffer.go
70 lines (52 loc) · 1.59 KB
/
memory_audio_buffer.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
package broadcast
import ()
const maxAudioBufferSize uint32 = 4096
type MemoryAudioBuffer struct {
audios [maxAudioBufferSize]*Audio
sampleCount uint32
nextFreeIndex uint32
readIndex uint32
full bool
Metrics *LocalMetrics
}
func (buffer *MemoryAudioBuffer) Empty() bool {
return !buffer.full && buffer.nextFreeIndex == buffer.readIndex
}
func (buffer *MemoryAudioBuffer) Full() bool {
return buffer.full
}
func (buffer *MemoryAudioBuffer) SampleCount() uint32 {
return buffer.sampleCount
}
func (buffer *MemoryAudioBuffer) metrics() *LocalMetrics {
if buffer.Metrics == nil {
buffer.Metrics = &LocalMetrics{}
}
return buffer.Metrics
}
func (buffer *MemoryAudioBuffer) changeSampleCount(delta int) {
buffer.sampleCount += uint32(delta)
buffer.metrics().Gauge("buffer.Size").Update(int64(buffer.sampleCount))
buffer.metrics().Histogram("buffer.SizeHistory").Update(int64(buffer.sampleCount))
}
func (buffer *MemoryAudioBuffer) AudioOut(audio *Audio) {
if buffer.Full() {
// Buffer is full, moving reader to read oldest audio
buffer.Read()
}
buffer.audios[buffer.nextFreeIndex] = audio
buffer.changeSampleCount(audio.SampleCount())
buffer.nextFreeIndex = (buffer.nextFreeIndex + 1) % maxAudioBufferSize
buffer.full = (buffer.nextFreeIndex == buffer.readIndex)
}
func (buffer *MemoryAudioBuffer) Read() (audio *Audio) {
if buffer.Empty() {
return nil
}
audio = buffer.audios[buffer.readIndex]
buffer.changeSampleCount(-audio.SampleCount())
buffer.audios[buffer.readIndex] = nil
buffer.readIndex = (buffer.readIndex + 1) % maxAudioBufferSize
buffer.full = false
return
}