DVDInterface: Simplify calling ChangeDisc from CPU thread

When Movie was calling ChangeDisc, it was moving execution to
the host thread just to then make the host thread the CPU thread.
We can simply run the code directly on the CPU thread instead.
This commit is contained in:
JosJuice 2016-07-05 18:20:24 +02:00
parent 69bf05b302
commit 1da866d7de
6 changed files with 19 additions and 16 deletions

View File

@ -472,10 +472,20 @@ static void InsertDiscCallback(u64 userdata, s64 cyclesLate)
delete _FileName; delete _FileName;
} }
void ChangeDisc(const std::string& newFileName) // Can only be called by the host thread
void ChangeDiscAsHost(const std::string& newFileName)
{ {
// WARNING: Can only run on Host Thread
bool was_unpaused = Core::PauseAndLock(true); bool was_unpaused = Core::PauseAndLock(true);
// The host thread is now temporarily the CPU thread
ChangeDiscAsCPU(newFileName);
Core::PauseAndLock(false, was_unpaused);
}
// Can only be called by the CPU thread
void ChangeDiscAsCPU(const std::string& newFileName)
{
std::string* _FileName = new std::string(newFileName); std::string* _FileName = new std::string(newFileName);
CoreTiming::ScheduleEvent(0, s_eject_disc); CoreTiming::ScheduleEvent(0, s_eject_disc);
CoreTiming::ScheduleEvent(500000000, s_insert_disc, (u64)_FileName); CoreTiming::ScheduleEvent(500000000, s_insert_disc, (u64)_FileName);
@ -492,7 +502,6 @@ void ChangeDisc(const std::string& newFileName)
} }
Movie::g_discChange = fileName.substr(sizeofpath); Movie::g_discChange = fileName.substr(sizeofpath);
} }
Core::PauseAndLock(false, was_unpaused);
} }
void SetLidOpen(bool open) void SetLidOpen(bool open)

View File

@ -108,7 +108,8 @@ bool VolumeIsValid();
// Disc detection and swapping // Disc detection and swapping
void SetDiscInside(bool _DiscInside); void SetDiscInside(bool _DiscInside);
bool IsDiscInside(); bool IsDiscInside();
void ChangeDisc(const std::string& fileName); // [NOT THREADSAFE] Host only void ChangeDiscAsHost(const std::string& path); // Can only be called by the host thread
void ChangeDiscAsCPU(const std::string& path); // Can only be called by the CPU thread
// DVD Access Functions // DVD Access Functions
bool ChangePartition(u64 offset); bool ChangePartition(u64 offset);

View File

@ -1215,7 +1215,6 @@ void PlayController(GCPadStatus* PadStatus, int controllerID)
// that will cause // that will cause
// it to load the last disc every time. As far as i know though, there are no 3+ disc games, so // it to load the last disc every time. As far as i know though, there are no 3+ disc games, so
// this should be fine. // this should be fine.
CPU::Break();
bool found = false; bool found = false;
std::string path; std::string path;
for (size_t i = 0; i < SConfig::GetInstance().m_ISOFolder.size(); ++i) for (size_t i = 0; i < SConfig::GetInstance().m_ISOFolder.size(); ++i)
@ -1230,17 +1229,11 @@ void PlayController(GCPadStatus* PadStatus, int controllerID)
if (found) if (found)
{ {
path += '/' + g_discChange; path += '/' + g_discChange;
DVDInterface::ChangeDiscAsCPU(path);
Core::QueueHostJob([=] {
if (!Movie::IsPlayingInput())
return;
DVDInterface::ChangeDisc(path);
CPU::EnableStepping(false);
});
} }
else else
{ {
CPU::Break();
PanicAlertT("Change the disc to %s", g_discChange.c_str()); PanicAlertT("Change the disc to %s", g_discChange.c_str());
} }
} }

View File

@ -124,7 +124,7 @@ void CRenderFrame::OnDropFiles(wxDropFilesEvent& event)
} }
else else
{ {
DVDInterface::ChangeDisc(filepath); DVDInterface::ChangeDiscAsHost(filepath);
} }
} }

View File

@ -691,7 +691,7 @@ void CFrame::DoOpen(bool Boot)
} }
else else
{ {
DVDInterface::ChangeDisc(WxStrToStr(path)); DVDInterface::ChangeDiscAsHost(WxStrToStr(path));
} }
} }

View File

@ -1331,7 +1331,7 @@ void CGameListCtrl::OnChangeDisc(wxCommandEvent& WXUNUSED(event))
const GameListItem* iso = GetSelectedISO(); const GameListItem* iso = GetSelectedISO();
if (!iso || !Core::IsRunning()) if (!iso || !Core::IsRunning())
return; return;
DVDInterface::ChangeDisc(WxStrToStr(iso->GetFileName())); DVDInterface::ChangeDiscAsHost(WxStrToStr(iso->GetFileName()));
} }
void CGameListCtrl::OnSize(wxSizeEvent& event) void CGameListCtrl::OnSize(wxSizeEvent& event)