mirror of https://github.com/PCSX2/pcsx2.git
MCD auto-eject (loadstate, mcd manager): Added maximum timeout.
- Before: The card was reinserted after it was accessed X times (X is 128). - After: We add another timeout limit: if card was accessed at least Y times and since then Z ms have elapsed, reinsert. - Previous limit still stays. Currently, X stays 128, Y is set to 2 times, and Z is set to 1800ms (if a game polls the card once a sec, it will see it reinserted on the 5th access = 4s after the initial access). Y and Z might need some fine tunning and testing with more games. git-svn-id: http://pcsx2.googlecode.com/svn/trunk@4435 96395faa-99c1-11dd-bbfe-3dabce05a288
This commit is contained in:
parent
8bc8c768f4
commit
2bc2464ca8
|
@ -30,12 +30,17 @@ static const mc_command_0x26_tag mc_sizeinfo_8mb= {'+', 512, 16, 0x4000, 0x52, 0
|
||||||
// Ejection timeout management belongs in the MemoryCardFile plugin, except the plugin
|
// Ejection timeout management belongs in the MemoryCardFile plugin, except the plugin
|
||||||
// interface is not yet complete.
|
// interface is not yet complete.
|
||||||
|
|
||||||
// FORCED_MCD_EJECTION_TIMEOUT is used internally when loading a savestate.
|
//Reinsert the card after auto-eject: after max tries or after min tries + XXX milliseconds, whichever comes first.
|
||||||
// FORCED_MCD_EJECTION_TIMEOUT_SHORT is used for SetForceMcdEjectTimeoutNow() which is called from outside (e.g., the mcd manager).
|
//E.g. if the game polls the card 100 times/sec and max tries=100, then after 1 second it will see the card as inserted (ms timeout not reached).
|
||||||
#define FORCED_MCD_EJECTION_TIMEOUT 128
|
//E.g. if the game polls the card 1 time/sec, then it will see the card ejected 4 times, and on the 5th it will see it as inserted (4 secs from the initial access).
|
||||||
#define FORCED_MCD_EJECTION_TIMEOUT_SHORT 64
|
//(A 'try' in this context is the game accessing SIO)
|
||||||
static int m_ForceEjectionTimeout[2];
|
static const int FORCED_MCD_EJECTION_MIN_TRIES =2;
|
||||||
static int m_debug_lastForceEjectionTimeout[2] ={0};
|
static const int FORCED_MCD_EJECTION_MAX_TRIES =128;
|
||||||
|
static const float FORCED_MCD_EJECTION_MAX_MS_AFTER_MIN_TRIES =2800;
|
||||||
|
|
||||||
|
static const int FORCED_MCD_EJECTION_NUM_SLOTS =2;
|
||||||
|
static int m_ForceEjectionTimeout[FORCED_MCD_EJECTION_NUM_SLOTS];
|
||||||
|
static wxDateTime m_ForceEjection_minTriesTimestamp[FORCED_MCD_EJECTION_NUM_SLOTS];
|
||||||
|
|
||||||
wxString GetTimeMsStr(){
|
wxString GetTimeMsStr(){
|
||||||
wxDateTime unow=wxDateTime::UNow();
|
wxDateTime unow=wxDateTime::UNow();
|
||||||
|
@ -54,7 +59,7 @@ void SetForceMcdEjectTimeoutNow()
|
||||||
const int slot=0;
|
const int slot=0;
|
||||||
int port=0;
|
int port=0;
|
||||||
for (port=0; port<2; port++)
|
for (port=0; port<2; port++)
|
||||||
_SetForceMcdEjectTimeoutNow(port, slot, FORCED_MCD_EJECTION_TIMEOUT_SHORT);
|
_SetForceMcdEjectTimeoutNow(port, slot, FORCED_MCD_EJECTION_MAX_TRIES);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -699,15 +704,30 @@ void InitializeSIO(u8 value)
|
||||||
bool forceEject = false;
|
bool forceEject = false;
|
||||||
if( slot == 0 && m_ForceEjectionTimeout[port]>0 )
|
if( slot == 0 && m_ForceEjectionTimeout[port]>0 )
|
||||||
{
|
{
|
||||||
if( m_debug_lastForceEjectionTimeout[port] == 0 && SysPlugins.McdIsPresent( port, slot ) )
|
if( m_ForceEjectionTimeout[port] == FORCED_MCD_EJECTION_MAX_TRIES && SysPlugins.McdIsPresent( port, slot ) )
|
||||||
Console.Warning( L"[%s] Auto-ejecting memcard [port:%d, slot:%d]", GetTimeMsStr().c_str(), port, slot );
|
Console.Warning( L"[%s] Auto-ejecting memcard [port:%d, slot:%d]", GetTimeMsStr().c_str(), port, slot );
|
||||||
|
|
||||||
--m_ForceEjectionTimeout[port];
|
--m_ForceEjectionTimeout[port];
|
||||||
forceEject = true;
|
forceEject = true;
|
||||||
|
|
||||||
|
int numTimesAccessed = FORCED_MCD_EJECTION_MAX_TRIES - m_ForceEjectionTimeout[port];
|
||||||
|
if ( numTimesAccessed == FORCED_MCD_EJECTION_MIN_TRIES )
|
||||||
|
{//minimum tries reached. start counting millisec timeout.
|
||||||
|
m_ForceEjection_minTriesTimestamp[port] = wxDateTime::UNow();
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( numTimesAccessed > FORCED_MCD_EJECTION_MIN_TRIES )
|
||||||
|
{
|
||||||
|
wxTimeSpan delta = wxDateTime::UNow().Subtract( m_ForceEjection_minTriesTimestamp[port] );
|
||||||
|
if ( delta.GetMilliseconds() >= FORCED_MCD_EJECTION_MAX_MS_AFTER_MIN_TRIES )
|
||||||
|
{
|
||||||
|
Console.Warning( L"[%s] Auto-eject: Timeout reached after mcd was accessed %d times [port:%d, slot:%d]", GetTimeMsStr().c_str(), numTimesAccessed, port, slot);
|
||||||
|
m_ForceEjectionTimeout[port] = 0; //Done. on next sio access the card will be seen as inserted.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if( m_ForceEjectionTimeout[port] == 0 && SysPlugins.McdIsPresent( port, slot ))
|
if( m_ForceEjectionTimeout[port] == 0 && SysPlugins.McdIsPresent( port, slot ))
|
||||||
Console.Warning( L"[%s] Re-inserting auto-ejected memcard [port:%d, slot:%d]", GetTimeMsStr().c_str(), port, slot);
|
Console.Warning( L"[%s] Re-inserting auto-ejected memcard [port:%d, slot:%d]", GetTimeMsStr().c_str(), port, slot);
|
||||||
m_debug_lastForceEjectionTimeout[port] = m_ForceEjectionTimeout[port];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if( !forceEject && SysPlugins.McdIsPresent( port, slot ) )
|
if( !forceEject && SysPlugins.McdIsPresent( port, slot ) )
|
||||||
|
@ -806,7 +826,7 @@ void SaveStateBase::sioFreeze()
|
||||||
{
|
{
|
||||||
//m_mcdCRCs[port][slot] = newCRC;
|
//m_mcdCRCs[port][slot] = newCRC;
|
||||||
//m_ForceEjectionTimeout[port] = 128;
|
//m_ForceEjectionTimeout[port] = 128;
|
||||||
_SetForceMcdEjectTimeoutNow(port, slot, FORCED_MCD_EJECTION_TIMEOUT);
|
_SetForceMcdEjectTimeoutNow(port, slot, FORCED_MCD_EJECTION_MAX_TRIES);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue