start of JukeboxPlayer backend

This commit is contained in:
Drew Weymouth
2023-12-19 17:31:10 -08:00
parent f8f8a3a5cb
commit 1e466e4cdf
7 changed files with 227 additions and 9 deletions
+132
View File
@@ -0,0 +1,132 @@
package jukebox
import (
"github.com/dweymouth/supersonic/backend/mediaprovider"
"github.com/dweymouth/supersonic/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,
}
}
+4 -4
View File
@@ -1,15 +1,15 @@
package player
import "github.com/dweymouth/supersonic/backend/mediaprovider"
type URLPlayer interface {
BasePlayer
AppendFile(url string) error
PlayFile(url string) error
}
type TrackIDPlayer interface {
type TrackPlayer interface {
BasePlayer
AppendTrack(trackID string) error
PlayTrack(trackID string) error
AppendTrack(track *mediaprovider.Track) error
}
type BasePlayer interface {