/
adjust_audio_buffer.go
104 lines (83 loc) · 2.79 KB
/
adjust_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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
package broadcast
import (
metrics "github.com/tryphon/go-metrics"
"math"
"math/rand"
)
type AdjustAudioBuffer struct {
Buffer AudioBuffer
ChannelCount int
LimitSampleCount uint32
ThresholdSampleCount uint32
}
func (pseudoBuffer *AdjustAudioBuffer) fillRate() float64 {
sampleCount := pseudoBuffer.SampleCount()
if pseudoBuffer.LimitSampleCount == 0 && pseudoBuffer.ThresholdSampleCount == 0 {
return 0
}
rawRate := (float64(sampleCount) - float64(pseudoBuffer.ThresholdSampleCount)) / (float64(pseudoBuffer.LimitSampleCount) - float64(pseudoBuffer.ThresholdSampleCount))
// Log.Debugf("SampleCount : %d, ThresholdSampleCount: %d, LimitSampleCount: %d, RawRate: %f", sampleCount, pseudoBuffer.ThresholdSampleCount, pseudoBuffer.LimitSampleCount, rawRate)
return math.Min(1, math.Max(0, rawRate))
}
func (pseudoBuffer *AdjustAudioBuffer) adjustmentFactor() int {
delta := int(pseudoBuffer.LimitSampleCount) - int(pseudoBuffer.ThresholdSampleCount)
if delta > 0 {
return -1
}
if delta < 0 {
return +1
}
return 0
}
func (pseudoBuffer *AdjustAudioBuffer) addAudio() bool {
return pseudoBuffer.LimitSampleCount < pseudoBuffer.ThresholdSampleCount
}
func (pseudoBuffer *AdjustAudioBuffer) removeAudio() bool {
return !pseudoBuffer.addAudio()
}
func (pseudoBuffer *AdjustAudioBuffer) AudioOut(audio *Audio) {
if pseudoBuffer.ChannelCount == 0 {
pseudoBuffer.ChannelCount = audio.ChannelCount()
}
pseudoBuffer.Buffer.AudioOut(audio)
pseudoBuffer.adjustmentCounter()
if pseudoBuffer.removeAudio() && pseudoBuffer.adjust() {
pseudoBuffer.logAdjustment(pseudoBuffer.Buffer.Read())
}
}
func (pseudoBuffer *AdjustAudioBuffer) adjust() bool {
probability := rand.Float64()
value := -math.Log(1-pseudoBuffer.fillRate()) / 5
result := value > probability
// if result {
// Log.Debugf("Fill Rate : %f, Value: %f, Probability: %f", pseudoBuffer.fillRate(), value, probability)
// }
return result
}
func (pseudoBuffer *AdjustAudioBuffer) metricName() string {
if pseudoBuffer.adjustmentFactor() > 0 {
return "buffer.LowAdjustement"
} else {
return "buffer.HighAdjustement"
}
}
func (pseudoBuffer *AdjustAudioBuffer) adjustmentCounter() metrics.Counter {
return metrics.GetOrRegisterCounter(pseudoBuffer.metricName(), nil)
}
func (pseudoBuffer *AdjustAudioBuffer) logAdjustment(audio *Audio) *Audio {
if audio != nil {
pseudoBuffer.adjustmentCounter().Inc(int64(audio.SampleCount()))
}
return audio
}
func (pseudoBuffer *AdjustAudioBuffer) Read() (audio *Audio) {
pseudoBuffer.adjustmentCounter()
if pseudoBuffer.addAudio() && pseudoBuffer.adjust() {
return pseudoBuffer.logAdjustment(NewAudio(1024, pseudoBuffer.ChannelCount))
} else {
return pseudoBuffer.Buffer.Read()
}
}
func (pseudoBuffer *AdjustAudioBuffer) SampleCount() uint32 {
return pseudoBuffer.Buffer.SampleCount()
}