133 lines
2.2 KiB
Go
133 lines
2.2 KiB
Go
package jukebox
|
|
|
|
import (
|
|
"github.com/dweymouth/supersonic/backend/mediaprovider"
|
|
"github.com/dweymouth/supersonic/backend/player"
|
|
)
|
|
|
|
const (
|
|
stopped = 0
|
|
playing = 1
|
|
paused = 2
|
|
)
|
|
|
|
type JukeboxPlayer struct {
|
|
provider mediaprovider.JukeboxProvider
|
|
|
|
state int // stopped, playing, paused
|
|
volume int
|
|
seeking bool
|
|
numTracks int
|
|
|
|
curTrack int
|
|
curTrackDuration float64
|
|
startTrackTime float64
|
|
startedAtUnixSecs float64
|
|
}
|
|
|
|
func (j *JukeboxPlayer) SetVolume(vol int) error {
|
|
go func() {
|
|
if err := j.provider.JukeboxSetVolume(vol); err == nil {
|
|
j.volume = vol
|
|
}
|
|
}()
|
|
return nil
|
|
}
|
|
|
|
func (j *JukeboxPlayer) GetVolume() int {
|
|
return j.volume
|
|
}
|
|
|
|
func (j *JukeboxPlayer) PlayTrackAt(idx int) error {
|
|
go func() {
|
|
if err := j.provider.JukeboxSeek(idx, 0); err == nil {
|
|
j.curTrack = idx
|
|
j.Continue()
|
|
}
|
|
}()
|
|
return nil
|
|
}
|
|
|
|
func (j *JukeboxPlayer) Continue() error {
|
|
if j.state == playing {
|
|
return nil
|
|
}
|
|
go func() {
|
|
if err := j.provider.JukeboxStart(); err != nil {
|
|
return
|
|
}
|
|
j.state = playing
|
|
}()
|
|
return nil
|
|
}
|
|
|
|
func (j *JukeboxPlayer) Pause() error {
|
|
if j.state != playing {
|
|
return nil
|
|
}
|
|
go func() {
|
|
if err := j.provider.JukeboxStop(); err != nil {
|
|
return
|
|
}
|
|
j.state = paused
|
|
}()
|
|
return nil
|
|
}
|
|
|
|
func (j *JukeboxPlayer) Stop() error {
|
|
if j.state == stopped {
|
|
return nil
|
|
}
|
|
go func() {
|
|
if err := j.provider.JukeboxStop(); err != nil {
|
|
return
|
|
}
|
|
j.state = stopped
|
|
}()
|
|
return nil
|
|
}
|
|
|
|
func (j *JukeboxPlayer) SeekPrevious() error {
|
|
track := j.curTrack
|
|
if track > 0 {
|
|
track = j.curTrack - 1
|
|
}
|
|
return j.PlayTrackAt(track)
|
|
}
|
|
|
|
func (j *JukeboxPlayer) SeekNext() error {
|
|
track := j.curTrack
|
|
if track >= j.numTracks {
|
|
return nil
|
|
}
|
|
return j.PlayTrackAt(track + 1)
|
|
}
|
|
|
|
func (j *JukeboxPlayer) SeekSeconds(secs float64) error {
|
|
j.seeking = true
|
|
go func() {
|
|
j.provider.JukeboxSeek(j.curTrack, int(secs))
|
|
j.seeking = false
|
|
}()
|
|
return nil
|
|
}
|
|
|
|
func (j *JukeboxPlayer) IsSeeking() bool {
|
|
return j.seeking
|
|
}
|
|
|
|
func (j *JukeboxPlayer) GetStatus() player.Status {
|
|
state := player.Stopped
|
|
if j.state == playing {
|
|
state = player.Playing
|
|
} else if j.state == paused {
|
|
state = player.Paused
|
|
}
|
|
|
|
// TODO - the rest
|
|
|
|
return player.Status{
|
|
State: state,
|
|
}
|
|
}
|