#include "global.h" /* ----------------------------------------------------------------------------- Class: MemoryCardManager Desc: See Header. Copyright (c) 2001-2003 by the person(s) listed below. All rights reserved. Chris Danford Chris Gomez ----------------------------------------------------------------------------- */ #include "MemoryCardManager.h" #include "arch/MemoryCard/MemoryCardDriver.h" // for UsbStorageDevice #include "arch/arch.h" #include "ScreenManager.h" #include "ThemeManager.h" #include "PrefsManager.h" #include "RageLog.h" MemoryCardManager* MEMCARDMAN = NULL; // global and accessable from anywhere in our program MemoryCardManager::MemoryCardManager() { m_pDriver = MakeMemoryCardDriver(); m_bCardsLocked = false; for( int p=0; pGetStorageDevices( m_vStorageDevices ); m_soundReady.Load( THEME->GetPathToS("MemoryCardManager ready") ); m_soundError.Load( THEME->GetPathToS("MemoryCardManager error") ); m_soundTooLate.Load( THEME->GetPathToS("MemoryCardManager too late") ); m_soundDisconnect.Load( THEME->GetPathToS("MemoryCardManager disconnect") ); AssignUnassignedCards(); } MemoryCardManager::~MemoryCardManager() { } void MemoryCardManager::Update( float fDelta ) { if( m_pDriver->StorageDevicesChanged() ) { vector vOld = m_vStorageDevices; // copy m_pDriver->GetStorageDevices( m_vStorageDevices ); vector &vNew = m_vStorageDevices; vector vConnects; // fill these in below vector vDisconnects; // fill these in below unsigned i; // check for disconnects for( i=0; iTrace( ssprintf("Disconnected bus %d port %d device %d path %s", old.iBus, old.iPortOnHub, old.iDeviceOnBus, old.sOsMountDir.c_str()) ); vDisconnects.push_back( old ); } } // check for connects for( i=0; iTrace( ssprintf("Connected bus %d port %d device %d path %s", newd.iBus, newd.iPortOnHub, newd.iDeviceOnBus, newd.sOsMountDir.c_str()) ); vConnects.push_back( newd ); } } // unassign cards that were disconnected for( int p=0; p vUnassignedDevices = m_vStorageDevices; // copy // remove cards that are already assigned { for( int p=0; p::iterator it = find(vUnassignedDevices.begin(),vUnassignedDevices.end(),m_Device[p]); ASSERT( it != vUnassignedDevices.end() ) // the assigned card better be connected! vUnassignedDevices.erase( it ); } } // try to assign each device to a player { for( int p=0; pm_sMemoryCardOsMountPoint[p].empty() ) { for( i=0; im_sMemoryCardOsMountPoint[p]) == 0 ) // match goto match; } } // search for USB bus match for( i=0; im_iMemoryCardUsbBus[p] != -1 && PREFSMAN->m_iMemoryCardUsbBus[p] != usd.iBus ) continue; // not a match if( PREFSMAN->m_iMemoryCardUsbPort[p] != -1 && PREFSMAN->m_iMemoryCardUsbPort[p] != usd.iPortOnHub ) continue; // not a match goto match; } LOG->Trace( "Player %d memory card: none", p+1 ); continue; // no matches match: m_Device[p] = vUnassignedDevices[i]; // save a copy LOG->Trace( "Player %d memory card: '%s'", p+1, m_Device[p].sOsMountDir.c_str() ); vUnassignedDevices.erase( vUnassignedDevices.begin()+i ); // remove the device so we don't match it for another player m_bTooLate[p] = m_bCardsLocked; m_bWriteError[p] = false; if( !m_bCardsLocked ) if( !m_pDriver->MountAndTestWrite(&m_Device[p]) ) m_bWriteError[p] = true; // play sound if( m_bWriteError[p] ) m_soundError.Play(); else if( m_bTooLate[p] ) m_soundTooLate.Play(); else m_soundReady.Play(); } } } void MemoryCardManager::FlushAllDisks() { for( int p=0; pFlush(&m_Device[p]); } }