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()
|
|
|
|
}
|