comfort-noise/main.go

108 lines
2.0 KiB
Go

package main
import (
"bufio"
"fmt"
"log"
"net/http"
"os"
"strconv"
"strings"
"time"
"github.com/faiface/beep"
"github.com/faiface/beep/mp3"
"github.com/faiface/beep/speaker"
)
type StreamURL struct {
Name string
URL string
}
var StreamURLs = []StreamURL{
{Name: "KEXP", URL: "https://kexp-mp3-128.streamguys1.com/kexp128.mp3"},
{Name: "StuBru", URL: "http://icecast.vrtcdn.be/stubru-high.mp3"},
{Name: "StuBru Bruut", URL: "http://icecast.vrtcdn.be/stubru_bruut-high.mp3"},
{Name: "StuBru Untz", URL: "http://icecast.vrtcdn.be/stubru_untz-high.mp3"},
{Name: "StuBru Hooray", URL: "http://icecast.vrtcdn.be/stubru_hiphophooray-high.mp3"},
}
func main() {
// setting sample rate
sr := beep.SampleRate(48000)
if err := speaker.Init(sr, sr.N(time.Second/10)); err != nil {
fmt.Println(err)
os.Exit(1)
}
fmt.Println("Stations:")
for i, stream := range StreamURLs {
fmt.Printf("%d: %s\n", i, stream.Name)
}
mix := &beep.Mixer{}
speaker.Play(mix)
var oldCtrl *beep.Ctrl
for {
fmt.Println("Press a number to change stations, 9 to quit")
number, err := getNext()
if err != nil {
fmt.Println(err)
os.Exit(1)
}
if number == 9 {
os.Exit(0)
}
stream := StreamURLs[number]
fmt.Printf("Playing %s\n", stream.Name)
res, err := http.Get(stream.URL)
if err != nil {
fmt.Println(err)
os.Exit(1)
}
streamer, _, err := mp3.Decode(res.Body)
if err != nil {
log.Fatal(err)
}
defer streamer.Close()
ctrl := &beep.Ctrl{Streamer: streamer, Paused: false}
mix.Add(ctrl)
speaker.Lock()
if oldCtrl != nil {
oldCtrl.Paused = true
oldCtrl.Streamer = nil
}
ctrl.Paused = true
ctrl.Streamer = streamer
ctrl.Paused = false
speaker.Unlock()
oldCtrl = ctrl
}
}
func getNext() (int, error) {
reader := bufio.NewReader(os.Stdin)
input, err := reader.ReadString('\n')
if err != nil {
return 9, err
}
number, err := strconv.Atoi(strings.TrimSpace(input))
if err != nil {
return 9, err
}
return number, nil
}