/
sound.go
44 lines (38 loc) · 864 Bytes
/
sound.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
package ui
import (
"github.com/gordonklaus/portaudio"
)
func PortAudioInitialize() {
portaudio.Initialize()
}
func PortAudioTerminate() {
portaudio.Terminate()
}
func OpenAudioStream(sampleBuffer chan float32) (*portaudio.Stream, float64, error) {
host, err := portaudio.DefaultHostApi()
if err != nil {
return nil, -1, err
}
parameters := portaudio.HighLatencyParameters(nil, host.DefaultOutputDevice)
stream, err := portaudio.OpenStream(parameters, func(out []float32) {
var output float32
for i := range out {
if i%parameters.Output.Channels == 0 {
select {
case sample := <-sampleBuffer:
output = sample
default:
output = 0
}
}
out[i] = output
}
})
if err != nil {
return nil, -1, err
}
if err := stream.Start(); err != nil {
return nil, -1, err
}
return stream, parameters.SampleRate, nil
}