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;
}
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);
// 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);
CoreTiming::ScheduleEvent(0, s_eject_disc);
CoreTiming::ScheduleEvent(500000000, s_insert_disc, (u64)_FileName);
@ -492,7 +502,6 @@ void ChangeDisc(const std::string& newFileName)
}
Movie::g_discChange = fileName.substr(sizeofpath);
}
Core::PauseAndLock(false, was_unpaused);
}
void SetLidOpen(bool open)

View File

@ -108,7 +108,8 @@ bool VolumeIsValid();
// Disc detection and swapping
void SetDiscInside(bool _DiscInside);
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
bool ChangePartition(u64 offset);

View File

@ -1215,7 +1215,6 @@ void PlayController(GCPadStatus* PadStatus, int controllerID)
// that will cause
// 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.
CPU::Break();
bool found = false;
std::string path;
for (size_t i = 0; i < SConfig::GetInstance().m_ISOFolder.size(); ++i)
@ -1230,17 +1229,11 @@ void PlayController(GCPadStatus* PadStatus, int controllerID)
if (found)
{
path += '/' + g_discChange;
Core::QueueHostJob([=] {
if (!Movie::IsPlayingInput())
return;
DVDInterface::ChangeDisc(path);
CPU::EnableStepping(false);
});
DVDInterface::ChangeDiscAsCPU(path);
}
else
{
CPU::Break();
PanicAlertT("Change the disc to %s", g_discChange.c_str());
}
}

View File

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

View File

@ -691,7 +691,7 @@ void CFrame::DoOpen(bool Boot)
}
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();
if (!iso || !Core::IsRunning())
return;
DVDInterface::ChangeDisc(WxStrToStr(iso->GetFileName()));
DVDInterface::ChangeDiscAsHost(WxStrToStr(iso->GetFileName()));
}
void CGameListCtrl::OnSize(wxSizeEvent& event)