From 5860aa69d6cea02e321d6de768adfddc39cc3b52 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sun, 21 Sep 2025 11:07:51 +0200 Subject: [PATCH] feat: engine audio code --- engine/audio/default_manger.go | 35 +++++++++++++ engine/audio/init.go | 11 ++++ engine/audio/library.go | 16 ++++++ engine/audio/load.go | 11 ++++ engine/audio/manager.go | 93 ++++++++++++++++++++++++++++++++++ engine/audio/sound_id.go | 4 ++ 6 files changed, 170 insertions(+) create mode 100644 engine/audio/default_manger.go create mode 100644 engine/audio/init.go create mode 100644 engine/audio/library.go create mode 100644 engine/audio/load.go create mode 100644 engine/audio/manager.go create mode 100644 engine/audio/sound_id.go diff --git a/engine/audio/default_manger.go b/engine/audio/default_manger.go new file mode 100644 index 0000000..21a3921 --- /dev/null +++ b/engine/audio/default_manger.go @@ -0,0 +1,35 @@ +package audio + +var defaultManager = Manager{} + +func LoadLibrary(library *Library) { + defaultManager.Load(library) +} + +func Play(id SoundID) { + defaultManager.Play(id) +} + +func PlayLooped(id SoundID) { + defaultManager.PlayLooped(id) +} + +func Stop(id SoundID) { + defaultManager.Stop(id) +} + +func IsPlaying(id SoundID) bool { + return defaultManager.IsPlaying(id) +} + +func Pause() { + defaultManager.Pause() +} + +func Resume() { + defaultManager.Resume() +} + +func Update() { + defaultManager.Update() +} diff --git a/engine/audio/init.go b/engine/audio/init.go new file mode 100644 index 0000000..fa3f4be --- /dev/null +++ b/engine/audio/init.go @@ -0,0 +1,11 @@ +package audio + +import rl "github.com/gen2brain/raylib-go/raylib" + +func Init() { + rl.InitAudioDevice() +} + +func Exit() { + rl.CloseAudioDevice() +} diff --git a/engine/audio/library.go b/engine/audio/library.go new file mode 100644 index 0000000..0ed3759 --- /dev/null +++ b/engine/audio/library.go @@ -0,0 +1,16 @@ +package audio + +import rl "github.com/gen2brain/raylib-go/raylib" + +// Library is a map of SoundID's and sound data. +type Library []rl.Sound + +func (l Library) Unload() { + for _, stream := range l { + rl.UnloadSound(stream) + } +} + +func (l Library) Get(id SoundID) *rl.Sound { + return &l[id] +} diff --git a/engine/audio/load.go b/engine/audio/load.go new file mode 100644 index 0000000..97a56b4 --- /dev/null +++ b/engine/audio/load.go @@ -0,0 +1,11 @@ +package audio + +import ( + rl "github.com/gen2brain/raylib-go/raylib" +) + +func LoadFromMemory(typ string, data []byte) rl.Sound { + wave := rl.LoadWaveFromMemory(typ, data, int32(len(data))) + defer rl.UnloadWave(wave) + return rl.LoadSoundFromWave(wave) +} diff --git a/engine/audio/manager.go b/engine/audio/manager.go new file mode 100644 index 0000000..11041f7 --- /dev/null +++ b/engine/audio/manager.go @@ -0,0 +1,93 @@ +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) 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 rl.IsSoundPlaying(*sm.library.Get(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 +} diff --git a/engine/audio/sound_id.go b/engine/audio/sound_id.go new file mode 100644 index 0000000..a852919 --- /dev/null +++ b/engine/audio/sound_id.go @@ -0,0 +1,4 @@ +package audio + +type SoundID byte +