forked from gordonklaus/portaudio
/
echo.go
48 lines (42 loc) · 910 Bytes
/
echo.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
package main
import (
"github.com/gordonklaus/portaudio"
"time"
)
func main() {
portaudio.Initialize()
defer portaudio.Terminate()
e := newEcho(time.Second / 3)
defer e.Close()
chk(e.Start())
time.Sleep(4 * time.Second)
chk(e.Stop())
}
type echo struct {
*portaudio.Stream
buffer []float32
i int
}
func newEcho(delay time.Duration) *echo {
h, err := portaudio.DefaultHostApi()
chk(err)
p := portaudio.LowLatencyParameters(h.DefaultInputDevice, h.DefaultOutputDevice)
p.Input.Channels = 1
p.Output.Channels = 1
e := &echo{buffer: make([]float32, int(p.SampleRate*delay.Seconds()))}
e.Stream, err = portaudio.OpenStream(p, e.processAudio)
chk(err)
return e
}
func (e *echo) processAudio(in, out []float32) {
for i := range out {
out[i] = .7 * e.buffer[e.i]
e.buffer[e.i] = in[i]
e.i = (e.i + 1) % len(e.buffer)
}
}
func chk(err error) {
if err != nil {
panic(err)
}
}