comfort-noise/player/player.go

79 lines
1.1 KiB
Go

package player
import (
"net/http"
"time"
"github.com/faiface/beep"
"github.com/faiface/beep/mp3"
"github.com/faiface/beep/speaker"
)
type Station struct {
Name string
URL string
}
type Player struct {
oldStreamer beep.StreamCloser
oldCtrl *beep.Ctrl
mixer *beep.Mixer
}
func NewPlayer() *Player {
return &Player{
mixer: &beep.Mixer{},
}
}
func (p *Player) Init() error {
sr := beep.SampleRate(48000)
if err := speaker.Init(sr, sr.N(time.Second/10)); err != nil {
return err
}
speaker.Play(p.mixer)
return nil
}
func (p *Player) Select(station Station) error {
res, err := http.Get(station.URL)
if err != nil {
return err
}
streamer, _, err := mp3.Decode(res.Body)
if err != nil {
return err
}
p.PlayStream(streamer)
return nil
}
func (p *Player) PlayStream(streamer beep.StreamCloser) {
ctrl := &beep.Ctrl{
Streamer: streamer,
}
p.mixer.Add(ctrl)
speaker.Lock()
if p.oldCtrl != nil {
p.oldCtrl.Paused = true
p.oldCtrl.Streamer = nil
p.oldStreamer.Close()
}
ctrl.Paused = true
ctrl.Streamer = streamer
ctrl.Paused = false
speaker.Unlock()
p.oldCtrl = ctrl
p.oldStreamer = streamer
}