/
resize_audio.go
62 lines (49 loc) · 1.64 KB
/
resize_audio.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
package broadcast
import ()
type ResizeAudio struct {
Output AudioHandler
SampleCount int
ChannelCount int
pendingAudio *Audio
pendingSampleCount int
}
func (resize *ResizeAudio) newPendingAudio() {
resize.pendingAudio = NewAudio(resize.SampleCount, resize.ChannelCount)
for channel := 0; channel < resize.ChannelCount; channel++ {
resize.pendingAudio.SetSamples(channel, make([]float32, resize.SampleCount))
}
resize.pendingSampleCount = 0
}
func (resize *ResizeAudio) pendingCapacity() int {
return resize.SampleCount - resize.pendingSampleCount
}
func (resize *ResizeAudio) maxSampleCount(sampleCount int) int {
if sampleCount <= resize.pendingCapacity() {
return sampleCount
} else {
return resize.pendingCapacity()
}
}
func (resize *ResizeAudio) AudioOut(audio *Audio) {
if resize.ChannelCount == 0 {
Log.Debugf("Default channelcount: %d", audio.ChannelCount())
resize.ChannelCount = audio.ChannelCount()
}
if resize.pendingAudio == nil {
resize.newPendingAudio()
}
for consumedSampleCount := 0; consumedSampleCount < audio.SampleCount(); {
firstSampleSlice := consumedSampleCount
sampleCount := resize.maxSampleCount(audio.SampleCount() - consumedSampleCount)
lastSampleSlice := firstSampleSlice + sampleCount
for channel := 0; channel < resize.ChannelCount; channel++ {
copy(resize.pendingAudio.Samples(channel)[resize.pendingSampleCount:], audio.Samples(channel)[firstSampleSlice:lastSampleSlice])
}
resize.pendingSampleCount += sampleCount
consumedSampleCount += sampleCount
if resize.pendingCapacity() == 0 {
resize.Output.AudioOut(resize.pendingAudio)
resize.newPendingAudio()
}
}
}