1
0
Fork 0
tetris-go/engine/audio/manager.go

103 lines
1.7 KiB
Go

package audio
import (
"slices"
rl "github.com/gen2brain/raylib-go/raylib"
)
type audio struct {
id SoundID
snd rl.Sound
}
type Manager struct {
library *Library
active []audio
paused bool
}
func (sm *Manager) Load(library *Library) {
sm.library = library
}
func (sm Manager) SetVolume(value float32) {
rl.SetMasterVolume(value)
}
func (sm Manager) Volume() float32 {
return rl.GetMasterVolume()
}
func (sm *Manager) play(id SoundID, looping bool) {
snd := sm.library.Get(id)
alias := rl.LoadSoundAlias(*snd)
alias.Stream.Buffer.Looping = looping
sm.active = append(sm.active, audio{
id: id,
snd: alias,
})
rl.PlaySound(alias)
}
func (sm *Manager) Play(id SoundID) {
sm.play(id, false)
}
func (sm *Manager) PlayLooped(id SoundID) {
sm.play(id, true)
}
func (sm *Manager) Stop(id SoundID) {
sm.active = slices.DeleteFunc(sm.active, func(a audio) bool {
if a.id == id {
rl.StopSound(a.snd)
rl.UnloadSoundAlias(a.snd)
return true
}
return false
})
}
func (sm Manager) IsPlaying(id SoundID) bool {
return slices.ContainsFunc(sm.active, func(e audio) bool {
return e.id == id
})
}
// Pause all active sounds
func (sm *Manager) Pause() {
sm.paused = true
for _, audio := range sm.active {
rl.PauseSound(audio.snd)
}
}
// Resume all active sounds.
func (sm *Manager) Resume() {
for _, audio := range sm.active {
rl.ResumeSound(audio.snd)
}
sm.paused = false
}
func (sm *Manager) Update() {
if sm.paused {
return
}
active := sm.active[:0]
for _, audio := range sm.active {
if !rl.IsSoundPlaying(audio.snd) {
rl.UnloadSoundAlias(audio.snd)
continue
}
active = append(active, audio)
}
sm.active = active
}