diff --git a/UI/BackgroundAudio.cpp b/UI/BackgroundAudio.cpp index 667f30caf0..2dabf2e4ee 100644 --- a/UI/BackgroundAudio.cpp +++ b/UI/BackgroundAudio.cpp @@ -564,8 +564,32 @@ void SoundEffectMixer::LoadDefaultSample(UI::UISound sound) { samples_[(size_t)sound] = std::unique_ptr(sample); } -void SoundEffectMixer::LoadSamples() { +class SampleLoadTask : public Task { +public: + SampleLoadTask(SoundEffectMixer *mixer) : mixer_(mixer) {} + TaskType Type() const override { return TaskType::IO_BLOCKING; } + TaskPriority Priority() const override { + return TaskPriority::NORMAL; + } + virtual void Run() { + mixer_->LoadSamplesOnThread(); + } +private: + SoundEffectMixer *mixer_; +}; + +void SoundEffectMixer::Init() { samples_.resize((size_t)UI::UISound::COUNT); + UI::SetSoundCallback([](UI::UISound sound, float volume) { + g_BackgroundAudio.SFX().Play(sound, volume); + }); + + // Load samples in the background. + + g_threadManager.EnqueueTask(new SampleLoadTask(this)); +} + +void SoundEffectMixer::LoadSamplesOnThread() { LoadDefaultSample(UI::UISound::BACK); LoadDefaultSample(UI::UISound::SELECT); LoadDefaultSample(UI::UISound::CONFIRM); @@ -582,8 +606,4 @@ void SoundEffectMixer::LoadSamples() { } else { LoadDefaultSample(UI::UISound::LEADERBOARD_SUBMITTED); } - - UI::SetSoundCallback([](UI::UISound sound, float volume) { - g_BackgroundAudio.SFX().Play(sound, volume); - }); } diff --git a/UI/BackgroundAudio.h b/UI/BackgroundAudio.h index 4f2952fd73..1ad0e9eb8f 100644 --- a/UI/BackgroundAudio.h +++ b/UI/BackgroundAudio.h @@ -27,8 +27,7 @@ struct Sample { // Mixer for things played on top of everything. class SoundEffectMixer { public: - void LoadSamples(); - + void Init(); void Mix(int16_t *buffer, int sz, int sampleRateHz); void Play(UI::UISound sfx, float volume); @@ -44,7 +43,11 @@ public: bool done; }; + // This can be called on a thread. + void LoadSamplesOnThread(); private: + bool samplesLoaded_ = false; + std::mutex mutex_; std::vector queue_; std::vector plays_; diff --git a/UI/NativeApp.cpp b/UI/NativeApp.cpp index d1e67d3516..a693157d0a 100644 --- a/UI/NativeApp.cpp +++ b/UI/NativeApp.cpp @@ -729,8 +729,7 @@ void NativeInit(int argc, const char *argv[], const char *savegame_dir, const ch } #endif - // TODO: Load these in the background instead of synchronously. - g_BackgroundAudio.SFX().LoadSamples(); + g_BackgroundAudio.SFX().Init(); if (!boot_filename.empty() && stateToLoad.Valid()) { SaveState::Load(stateToLoad, -1, [](SaveState::Status status, std::string_view message, void *) {