diff --git a/Source/Core/Core/BootManager.cpp b/Source/Core/Core/BootManager.cpp index 95346d5735..2578e5a22b 100644 --- a/Source/Core/Core/BootManager.cpp +++ b/Source/Core/Core/BootManager.cpp @@ -125,7 +125,6 @@ bool BootCore(const std::string& _rFilename) config_cache.strBackend = StartUp.m_strVideoBackend; config_cache.m_strGPUDeterminismMode = StartUp.m_strGPUDeterminismMode; config_cache.m_EnableJIT = SConfig::GetInstance().m_DSPEnableJIT; - config_cache.bDSPThread = StartUp.bDSPThread; config_cache.Volume = SConfig::GetInstance().m_Volume; config_cache.sBackend = SConfig::GetInstance().sBackend; config_cache.framelimit = SConfig::GetInstance().m_Framelimit; @@ -165,7 +164,6 @@ bool BootCore(const std::string& _rFilename) core_section->Get("FastDiscSpeed", &StartUp.bFastDiscSpeed, StartUp.bFastDiscSpeed); core_section->Get("BlockMerging", &StartUp.bMergeBlocks, StartUp.bMergeBlocks); core_section->Get("DSPHLE", &StartUp.bDSPHLE, StartUp.bDSPHLE); - core_section->Get("DSPThread", &StartUp.bDSPThread, StartUp.bDSPThread); core_section->Get("GFXBackend", &StartUp.m_strVideoBackend, StartUp.m_strVideoBackend); core_section->Get("CPUCore", &StartUp.iCPUCore, StartUp.iCPUCore); core_section->Get("HLE_BS2", &StartUp.bHLE_BS2, StartUp.bHLE_BS2); @@ -293,7 +291,6 @@ void Stop() StartUp.bFastDiscSpeed = config_cache.bFastDiscSpeed; StartUp.bMergeBlocks = config_cache.bMergeBlocks; StartUp.bDSPHLE = config_cache.bDSPHLE; - StartUp.bDSPThread = config_cache.bDSPThread; StartUp.m_strVideoBackend = config_cache.strBackend; StartUp.m_strGPUDeterminismMode = config_cache.m_strGPUDeterminismMode; VideoBackend::ActivateBackend(StartUp.m_strVideoBackend); diff --git a/Source/Core/Core/ConfigManager.cpp b/Source/Core/Core/ConfigManager.cpp index c1f0cf4288..0305746cf4 100644 --- a/Source/Core/Core/ConfigManager.cpp +++ b/Source/Core/Core/ConfigManager.cpp @@ -312,7 +312,6 @@ void SConfig::SaveCoreSettings(IniFile& ini) core->Set("CPUCore", m_LocalCoreStartupParameter.iCPUCore); core->Set("Fastmem", m_LocalCoreStartupParameter.bFastmem); core->Set("CPUThread", m_LocalCoreStartupParameter.bCPUThread); - core->Set("DSPThread", m_LocalCoreStartupParameter.bDSPThread); core->Set("DSPHLE", m_LocalCoreStartupParameter.bDSPHLE); core->Set("SkipIdle", m_LocalCoreStartupParameter.bSkipIdle); core->Set("DefaultISO", m_LocalCoreStartupParameter.m_strDefaultISO); @@ -537,7 +536,6 @@ void SConfig::LoadCoreSettings(IniFile& ini) core->Get("CPUCore", &m_LocalCoreStartupParameter.iCPUCore, SCoreStartupParameter::CORE_INTERPRETER); #endif core->Get("Fastmem", &m_LocalCoreStartupParameter.bFastmem, true); - core->Get("DSPThread", &m_LocalCoreStartupParameter.bDSPThread, false); core->Get("DSPHLE", &m_LocalCoreStartupParameter.bDSPHLE, true); core->Get("CPUThread", &m_LocalCoreStartupParameter.bCPUThread, true); core->Get("SkipIdle", &m_LocalCoreStartupParameter.bSkipIdle, true); diff --git a/Source/Core/Core/Core.cpp b/Source/Core/Core/Core.cpp index 396c5cc68a..119828c9aa 100644 --- a/Source/Core/Core/Core.cpp +++ b/Source/Core/Core/Core.cpp @@ -344,6 +344,11 @@ void EmuThread() OSD::AddMessage("Dolphin " + g_video_backend->GetName() + " Video Backend.", 5000); + if (cpu_info.HTT) + SConfig::GetInstance().m_LocalCoreStartupParameter.bDSPThread = cpu_info.num_cores > 4; + else + SConfig::GetInstance().m_LocalCoreStartupParameter.bDSPThread = cpu_info.num_cores > 2; + if (!DSP::GetDSPEmulator()->Initialize(core_parameter.bWii, core_parameter.bDSPThread)) { HW::Shutdown(); diff --git a/Source/Core/Core/CoreParameter.cpp b/Source/Core/Core/CoreParameter.cpp index 6907667b46..7df74bc335 100644 --- a/Source/Core/Core/CoreParameter.cpp +++ b/Source/Core/Core/CoreParameter.cpp @@ -71,7 +71,6 @@ void SCoreStartupParameter::LoadDefaults() bSkipIdle = false; bRunCompareServer = false; bDSPHLE = true; - bDSPThread = true; bFastmem = true; bFPRF = false; bBAT = false; diff --git a/Source/Core/Core/HW/DSPLLE/DSPLLE.cpp b/Source/Core/Core/HW/DSPLLE/DSPLLE.cpp index fdd1aefaf3..ee3e2bcb9b 100644 --- a/Source/Core/Core/HW/DSPLLE/DSPLLE.cpp +++ b/Source/Core/Core/HW/DSPLLE/DSPLLE.cpp @@ -17,6 +17,8 @@ #include "Core/ConfigManager.h" #include "Core/Core.h" #include "Core/Host.h" +#include "Core/Movie.h" +#include "Core/NetPlayProto.h" #include "Core/DSP/DSPCaptureLogger.h" #include "Core/DSP/DSPCore.h" #include "Core/DSP/DSPDisassembler.h" @@ -31,7 +33,6 @@ #include "Core/HW/DSPLLE/DSPLLEGlobals.h" #include "Core/HW/DSPLLE/DSPSymbols.h" - DSPLLE::DSPLLE() { m_bIsRunning = false; @@ -40,6 +41,7 @@ DSPLLE::DSPLLE() static Common::Event dspEvent; static Common::Event ppcEvent; +static bool requestDisableThread; void DSPLLE::DoState(PointerWrap &p) { @@ -160,7 +162,10 @@ static bool FillDSPInitOptions(DSPInitOptions* opts) bool DSPLLE::Initialize(bool bWii, bool bDSPThread) { m_bWii = bWii; - m_bDSPThread = bDSPThread; + m_bDSPThread = true; + if (NetPlay::IsNetPlayRunning() || Movie::IsMovieActive() || Core::g_want_determinism || !bDSPThread) + m_bDSPThread = false; + requestDisableThread = false; DSPInitOptions opts; if (!FillDSPInitOptions(&opts)) @@ -209,6 +214,13 @@ u16 DSPLLE::DSP_WriteControlRegister(u16 _uFlag) // and immediately process it, if it has. if (_uFlag & 2) { + if (m_bDSPThread) + { + // External interrupt pending: this is the zelda ucode. + // Disable the DSP thread because there is no performance gain. + requestDisableThread = true; + } + if (!m_bDSPThread) { DSPCore_CheckExternalInterrupt(); @@ -305,6 +317,17 @@ void DSPLLE::DSP_Update(int cycles) soundStream->Update(); } */ + if (m_bDSPThread) + { + if (requestDisableThread || NetPlay::IsNetPlayRunning() || Movie::IsMovieActive() || Core::g_want_determinism) + { + DSP_StopSoundStream(); + m_bDSPThread = false; + requestDisableThread = false; + SConfig::GetInstance().m_LocalCoreStartupParameter.bDSPThread = false; + } + } + // If we're not on a thread, run cycles here. if (!m_bDSPThread) { diff --git a/Source/Core/DolphinWX/ConfigMain.cpp b/Source/Core/DolphinWX/ConfigMain.cpp index d213a7cbda..003099a67b 100644 --- a/Source/Core/DolphinWX/ConfigMain.cpp +++ b/Source/Core/DolphinWX/ConfigMain.cpp @@ -137,7 +137,6 @@ EVT_CHECKBOX(ID_NTSCJ, CConfigMain::CoreSettingsChanged) EVT_RADIOBOX(ID_DSPENGINE, CConfigMain::AudioSettingsChanged) -EVT_CHECKBOX(ID_DSPTHREAD, CConfigMain::AudioSettingsChanged) EVT_CHECKBOX(ID_ENABLE_THROTTLE, CConfigMain::AudioSettingsChanged) EVT_CHECKBOX(ID_DPL2DECODER, CConfigMain::AudioSettingsChanged) EVT_CHOICE(ID_BACKEND, CConfigMain::AudioSettingsChanged) @@ -228,7 +227,6 @@ void CConfigMain::UpdateGUI() // Disable stuff on AudioPage DSPEngine->Disable(); - DSPThread->Disable(); DPL2Decoder->Disable(); Latency->Disable(); @@ -361,7 +359,6 @@ void CConfigMain::InitializeGUIValues() VolumeSlider->Enable(SupportsVolumeChanges(SConfig::GetInstance().sBackend)); VolumeSlider->SetValue(SConfig::GetInstance().m_Volume); VolumeText->SetLabel(wxString::Format("%d %%", SConfig::GetInstance().m_Volume)); - DSPThread->SetValue(startup_params.bDSPThread); DPL2Decoder->Enable(std::string(SConfig::GetInstance().sBackend) == BACKEND_OPENAL); DPL2Decoder->SetValue(startup_params.bDPL2Decoder); Latency->Enable(std::string(SConfig::GetInstance().sBackend) == BACKEND_OPENAL); @@ -471,7 +468,6 @@ void CConfigMain::InitializeGUITooltips() InterfaceLang->SetToolTip(_("Change the language of the user interface.\nRequires restart.")); // Audio tooltips - DSPThread->SetToolTip(_("Run DSP LLE on a dedicated thread (not recommended: might cause freezes).")); BackendSelection->SetToolTip(_("Changing this will have no effect while the emulator is running!")); // GameCube - Devices @@ -602,7 +598,6 @@ void CConfigMain::CreateGUIControls() // Audio page DSPEngine = new wxRadioBox(AudioPage, ID_DSPENGINE, _("DSP Emulator Engine"), wxDefaultPosition, wxDefaultSize, arrayStringFor_DSPEngine, 0, wxRA_SPECIFY_ROWS); - DSPThread = new wxCheckBox(AudioPage, ID_DSPTHREAD, _("DSPLLE on Separate Thread")); DPL2Decoder = new wxCheckBox(AudioPage, ID_DPL2DECODER, _("Dolby Pro Logic II decoder")); VolumeSlider = new wxSlider(AudioPage, ID_VOLUME, 0, 1, 100, wxDefaultPosition, wxDefaultSize, wxSL_VERTICAL|wxSL_INVERSE); VolumeText = new wxStaticText(AudioPage, wxID_ANY, ""); @@ -621,7 +616,6 @@ void CConfigMain::CreateGUIControls() // Create sizer and add items to dialog wxStaticBoxSizer *sbAudioSettings = new wxStaticBoxSizer(wxVERTICAL, AudioPage, _("Sound Settings")); sbAudioSettings->Add(DSPEngine, 0, wxALL | wxEXPAND, 5); - sbAudioSettings->Add(DSPThread, 0, wxALL, 5); sbAudioSettings->Add(DPL2Decoder, 0, wxALL, 5); wxStaticBoxSizer *sbVolume = new wxStaticBoxSizer(wxVERTICAL, AudioPage, _("Volume")); @@ -896,10 +890,6 @@ void CConfigMain::AudioSettingsChanged(wxCommandEvent& event) VolumeText->SetLabel(wxString::Format("%d %%", VolumeSlider->GetValue())); break; - case ID_DSPTHREAD: - SConfig::GetInstance().m_LocalCoreStartupParameter.bDSPThread = DSPThread->IsChecked(); - break; - case ID_DPL2DECODER: SConfig::GetInstance().m_LocalCoreStartupParameter.bDPL2Decoder = DPL2Decoder->IsChecked(); break; diff --git a/Source/Core/DolphinWX/ConfigMain.h b/Source/Core/DolphinWX/ConfigMain.h index a5ebbdf8f9..3997678e9c 100644 --- a/Source/Core/DolphinWX/ConfigMain.h +++ b/Source/Core/DolphinWX/ConfigMain.h @@ -80,7 +80,6 @@ private: ID_FRAMELIMIT, ID_CPUENGINE, - ID_DSPTHREAD, ID_NTSCJ, @@ -144,7 +143,6 @@ private: // Advanced wxRadioBox* CPUEngine; - wxCheckBox* DSPThread; wxCheckBox* _NTSCJ;