45 lines
1.1 KiB
Go
45 lines
1.1 KiB
Go
package main
|
|
|
|
import (
|
|
"encoding/binary"
|
|
"github.com/gordonklaus/portaudio"
|
|
"github.com/labstack/echo/v4"
|
|
"net/http"
|
|
)
|
|
|
|
func chk(err error) {
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
}
|
|
|
|
func audioController(c echo.Context) error {
|
|
if audioIsInitialized == false {
|
|
portaudio.Initialize()
|
|
defer portaudio.Terminate()
|
|
audioBuffer = make([]float32, audioSampleRate*audioSeconds)
|
|
stream, err := portaudio.OpenDefaultStream(1, 0, audioSampleRate, len(audioBuffer), func(in []float32) {
|
|
for i := range audioBuffer {
|
|
audioBuffer[i] = in[i]
|
|
}
|
|
})
|
|
chk(err)
|
|
chk(stream.Start())
|
|
defer stream.Close()
|
|
}
|
|
|
|
flusher, _ := c.Response().Writer.(http.Flusher)
|
|
|
|
c.Response().Header().Set("Connection", "Keep-Alive")
|
|
c.Response().Header().Set("Access-Control-Allow-Origin", "*")
|
|
c.Response().Header().Set("X-Content-Type-Options", "nosniff")
|
|
c.Response().Header().Set("Transfer-Encoding", "chunked")
|
|
c.Response().Header().Set("Content-Type", "audio/wave")
|
|
|
|
for true {
|
|
binary.Write(c.Response().Writer, binary.BigEndian, &audioBuffer)
|
|
flusher.Flush() // Trigger "chunked" encoding and send a chunk...
|
|
}
|
|
|
|
return nil
|
|
}
|