uplink/main.go

120 lines
2.7 KiB
Go
Raw Normal View History

2018-04-10 11:48:51 +00:00
package main
import (
"io"
"log"
"net/http"
"strconv"
"time"
2018-04-10 14:34:30 +00:00
"git.icedream.tech/icedream/uplink/app/sources"
"git.icedream.tech/icedream/uplink/app/streams"
2018-04-10 11:48:51 +00:00
humanize "github.com/dustin/go-humanize"
"github.com/gorilla/mux"
"github.com/viert/lame"
)
func main() {
2018-04-10 14:34:30 +00:00
stream := streams.NewStream(128 * 1024)
2018-04-10 11:48:51 +00:00
wr := lame.NewWriter(stream)
wr.Encoder.SetBitrate(192)
wr.Encoder.SetQuality(1)
wr.Encoder.SetInSamplerate(44100)
wr.Encoder.SetNumChannels(2)
wr.Encoder.InitParams()
go func() {
log.Println("Sine stream goroutine started")
sine := new(sources.SineStream)
sine.Samplerate = 44100
sine.Frequency = 990
sine.Beep = true
sine.Timestamp = time.Now()
log.Println("Will now broadcast sine stream")
n, err := io.Copy(wr, sine)
if err != nil {
log.Fatal("Sine stream copy failed:", err)
}
log.Println("Sine stream finished, written", humanize.Bytes(uint64(n)), "bytes")
}()
server := new(http.Server)
mux := mux.NewRouter()
mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
log.Println("Got a listener")
w.Header().Set("content-type", "audio/mpeg")
w.Header().Set("server", "Uplink/0.0.0")
if r.Header.Get("icy-metadata") == "1" {
w.Header().Set("icy-metadata", "1")
w.Header().Set("icy-metaint", strconv.Itoa(2*1024))
}
w.WriteHeader(200)
cancel := w.(http.CloseNotifier).CloseNotify()
2018-04-10 14:34:30 +00:00
sr := streams.NewStreamReader(stream)
2018-04-10 11:48:51 +00:00
var n int64
var err error
if r.Header.Get("icy-metadata") == "1" {
2018-04-10 14:34:30 +00:00
mstream := streams.NewMetadataInjector(sr, 2*1024)
2018-04-10 11:48:51 +00:00
mstream.Metadata = map[string]string{
"StreamTitle": "beep",
}
go func() {
for {
select {
case <-cancel:
return
case <-time.After(time.Second):
mstream.Metadata["StreamTitle"] = "beep - time: " + time.Now().String()
}
}
}()
mstream.Metadata = map[string]string{
"StreamTitle": "DreamNetwork - Testing",
}
n, err = io.Copy(w, mstream)
} else {
n, err = io.Copy(w, sr)
}
log.Println("Transmitted", humanize.Bytes(uint64(n)))
if err != nil {
log.Println("Client transmission error:", err)
}
/*notify := w.(http.CloseNotifier).CloseNotify()
data := make([]byte, 4096)
log.Println("Start client tx loop")
for {
select {
case <-notify:
log.Println("Stop client tx loop")
sr.Close()
return
default:
n, err := sr.Read(data)
if err != nil {
log.Println("Read from stream failed:", err)
return
}
n, err = w.Write(data[0:n])
if err != nil {
log.Println("Write to client failed:", err)
log.Println("Stop client tx loop")
sr.Close()
return
}
}
}*/
})
server.Handler = mux
server.Addr = ":8080"
server.ListenAndServe()
}