From 5b2483ee73fdc9b8c718dd3077c14c0206659196 Mon Sep 17 00:00:00 2001 From: The Dax Date: Wed, 14 Aug 2013 08:44:36 -0400 Subject: [PATCH] Fix a bug where sound would never be initialised if a game is started with it off, then later enabled. --- Core/System.cpp | 16 ++++++++++++++-- Core/System.h | 3 +++ UI/GameSettingsScreen.cpp | 13 ++++++++++++- UI/GameSettingsScreen.h | 1 + UI/MenuScreens.cpp | 4 ++++ 5 files changed, 34 insertions(+), 3 deletions(-) diff --git a/Core/System.cpp b/Core/System.cpp index 2355f62585..e7a4f547bb 100644 --- a/Core/System.cpp +++ b/Core/System.cpp @@ -74,6 +74,17 @@ volatile CoreState coreState = CORE_STEPPING; volatile bool coreStatePending = false; static volatile CPUThreadState cpuThreadState = CPU_THREAD_NOT_RUNNING; +bool IsAudioInitialised() { + return mixer != NULL; +} + +void Audio_Init() { + if(mixer == NULL) { + mixer = new PSPMixer(); + host->InitSound(mixer); + } +} + bool IsOnSeparateCPUThread() { if (cpuThread != NULL) { return cpuThread->get_id() == std::this_thread::get_id(); @@ -82,6 +93,8 @@ bool IsOnSeparateCPUThread() { } } + + bool CPU_NextState(CPUThreadState from, CPUThreadState to) { if (cpuThreadState == from) { cpuThreadState = to; @@ -148,8 +161,7 @@ void CPU_Init() { host->AttemptLoadSymbolMap(); if (coreParameter.enableSound) { - mixer = new PSPMixer(); - host->InitSound(mixer); + Audio_Init(); } if (coreParameter.disableG3Dlog) { diff --git a/Core/System.h b/Core/System.h index 3b3b0f7c29..2f03b20220 100644 --- a/Core/System.h +++ b/Core/System.h @@ -44,7 +44,10 @@ void PSP_Shutdown(); void PSP_RunLoopUntil(u64 globalticks); void PSP_RunLoopFor(int cycles); +void Audio_Init(); + bool IsOnSeparateCPUThread(); +bool IsAudioInitialised(); void GetSysDirectories(std::string &memstickpath, std::string &flash0path); diff --git a/UI/GameSettingsScreen.cpp b/UI/GameSettingsScreen.cpp index ee381cbcb9..9710d6c7bd 100644 --- a/UI/GameSettingsScreen.cpp +++ b/UI/GameSettingsScreen.cpp @@ -33,6 +33,7 @@ #include "base/timeutil.h" #include "math/curves.h" #include "Core/HW/atrac3plus.h" +#include "Core/System.h" #ifdef _WIN32 namespace MainWindow { @@ -189,7 +190,7 @@ void GameSettingsScreen::CreateViews() { root_->Add(leftColumn); leftColumn->Add(new Spacer(new LinearLayoutParams(1.0))); - leftColumn->Add(new Choice(g->T("Back"), "", false, new AnchorLayoutParams(150, WRAP_CONTENT, 10, NONE, NONE, 10)))->OnClick.Handle(this, &UIScreen::OnBack); + leftColumn->Add(new Choice(g->T("Back"), "", false, new AnchorLayoutParams(150, WRAP_CONTENT, 10, NONE, NONE, 10)))->OnClick.Handle(this, &GameSettingsScreen::OnBack); TabHolder *tabHolder = new TabHolder(ORIENT_VERTICAL, 200, new LinearLayoutParams(800, FILL_PARENT, actionMenuMargins)); @@ -327,6 +328,16 @@ void GameSettingsScreen::update(InputState &input) { g_Config.iForceMaxEmulatedFPS = cap60FPS_ ? 60 : 0; } +UI::EventReturn GameSettingsScreen::OnBack(UI::EventParams &e) { + screenManager()->finishDialog(this, DR_OK); + + if(PSP_IsInited() && !IsAudioInitialised()) { + Audio_Init(); + } + + return UI::EVENT_DONE; +} + void GlobalSettingsScreen::CreateViews() { using namespace UI; root_ = new ScrollView(ORIENT_VERTICAL); diff --git a/UI/GameSettingsScreen.h b/UI/GameSettingsScreen.h index 09b345ff62..d93ac6f751 100644 --- a/UI/GameSettingsScreen.h +++ b/UI/GameSettingsScreen.h @@ -42,6 +42,7 @@ private: // Event handlers UI::EventReturn OnDownloadPlugin(UI::EventParams &e); UI::EventReturn OnControlMapping(UI::EventParams &e); + UI::EventReturn OnBack(UI::EventParams &e); // Temporaries to convert bools to int settings bool cap60FPS_; diff --git a/UI/MenuScreens.cpp b/UI/MenuScreens.cpp index d2132f2a31..a4c4b812e1 100644 --- a/UI/MenuScreens.cpp +++ b/UI/MenuScreens.cpp @@ -865,6 +865,10 @@ void AudioScreen::render() { UICheckBox(GEN_ID, x, y += stride, a->T("Enable Atrac3+"), ALIGN_TOPLEFT, &g_Config.bEnableAtrac3plus); } + if(PSP_IsInited() && !IsAudioInitialised()) { + Audio_Init(); + } + // Show the download button even if not installed - might want to upgrade. VLinear vlinear(30, 400, 20); std::string atracString;