/
interleaved_audio_coder.go
54 lines (43 loc) · 1.35 KB
/
interleaved_audio_coder.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
package broadcast
import (
"bytes"
)
type InterleavedAudioCoder struct {
SampleFormat SampleFormat
ChannelCount int
}
func (encoder *InterleavedAudioCoder) Encode(audio *Audio) ([]byte, error) {
buffer := &bytes.Buffer{}
channelCount := encoder.ChannelCount
if channelCount == 0 {
channelCount = audio.ChannelCount()
}
for samplePosition := 0; samplePosition < audio.sampleCount; samplePosition++ {
for channel := 0; channel < channelCount; channel++ {
sample := audio.Sample(channel, samplePosition)
encoder.SampleFormat.Write(buffer, sample)
}
}
return buffer.Bytes(), nil
}
func (encoder *InterleavedAudioCoder) FrameSize() int {
return encoder.SampleFormat.SampleSize() * encoder.ChannelCount
}
func (encoder *InterleavedAudioCoder) Decode(data []byte) (*Audio, error) {
buffer := bytes.NewBuffer(data)
sampleCount := len(data) / encoder.FrameSize()
audio := NewAudio(sampleCount, encoder.ChannelCount)
for channel := 0; channel < encoder.ChannelCount; channel++ {
audio.SetSamples(channel, make([]float32, sampleCount))
}
for samplePosition := 0; samplePosition < sampleCount; samplePosition++ {
for channel := 0; channel < encoder.ChannelCount; channel++ {
sample, err := encoder.SampleFormat.Read(buffer)
if err != nil {
return nil, err
}
audio.Samples(channel)[samplePosition] = sample
}
}
return audio, nil
}