remote-i3wm-go/audio_controller.go
2023-08-27 21:34:02 +02:00

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
}