70 lines
1.2 KiB
Go
70 lines
1.2 KiB
Go
package gomus
|
|
|
|
import (
|
|
"time"
|
|
|
|
"github.com/faiface/beep"
|
|
"github.com/faiface/beep/effects"
|
|
"github.com/faiface/beep/speaker"
|
|
)
|
|
|
|
const (
|
|
base = 2
|
|
minVolume = -5
|
|
maxVolume = 1
|
|
startVolume = -2
|
|
)
|
|
|
|
type TrackPlayerEffects struct {
|
|
volume float64
|
|
}
|
|
|
|
func NewTrackPlayerEffects() TrackPlayerEffects {
|
|
return TrackPlayerEffects{volume: startVolume}
|
|
}
|
|
|
|
type TrackPlayer struct {
|
|
*beep.Ctrl
|
|
*effects.Volume
|
|
|
|
beep.SampleRate
|
|
}
|
|
|
|
func NewTrackPlayer() TrackPlayer {
|
|
sr := beep.SampleRate(44100)
|
|
speaker.Init(sr, sr.N(time.Second/10))
|
|
|
|
ctrl := &beep.Ctrl{Streamer: beep.Silence(1), Paused: false}
|
|
volume := &effects.Volume{Streamer: ctrl, Base: base, Volume: startVolume, Silent: false}
|
|
|
|
return TrackPlayer{
|
|
SampleRate: sr,
|
|
Ctrl: ctrl,
|
|
Volume: volume,
|
|
}
|
|
}
|
|
|
|
func (t *TrackPlayer) Play(streamer beep.Streamer) {
|
|
speaker.Clear()
|
|
|
|
speaker.Lock()
|
|
t.Ctrl.Streamer = streamer
|
|
speaker.Unlock()
|
|
|
|
speaker.Play(t.Volume)
|
|
}
|
|
|
|
func (t *TrackPlayer) TogglePause() bool {
|
|
speaker.Lock()
|
|
newState := !t.Ctrl.Paused
|
|
t.Ctrl.Paused = newState
|
|
speaker.Unlock()
|
|
return newState
|
|
}
|
|
|
|
func (t *TrackPlayer) SetVolume(volume float64) {
|
|
speaker.Lock()
|
|
t.Volume.Volume = volume
|
|
speaker.Unlock()
|
|
}
|