Protect dvdread with a critical section, should fix crashes when running ikaruga from a compressed iso. Some coding standard stuff.

git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@672 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
hrydgard
2008-09-24 20:47:11 +00:00
parent 3883ce6ee9
commit 08e81eddb9
6 changed files with 116 additions and 165 deletions

View File

@ -67,7 +67,6 @@ typedef void* (*ThreadFunc)(void* arg);
class Thread class Thread
{ {
public: public:
Thread(ThreadFunc entry, void* arg); Thread(ThreadFunc entry, void* arg);
~Thread(); ~Thread();

View File

@ -24,6 +24,7 @@
#include "../PowerPC/PowerPC.h" #include "../PowerPC/PowerPC.h"
#include "PeripheralInterface.h" #include "PeripheralInterface.h"
#include "Memmap.h" #include "Memmap.h"
#include "Thread.h"
#include "../VolumeHandler.h" #include "../VolumeHandler.h"
@ -178,6 +179,8 @@ DVDMemStruct dvdMem;
u32 g_ErrorCode = 0x00; u32 g_ErrorCode = 0x00;
bool g_bDiscInside = true; bool g_bDiscInside = true;
Common::CriticalSection dvdread_section;
void DoState(PointerWrap &p) void DoState(PointerWrap &p)
{ {
p.Do(dvdMem); p.Do(dvdMem);
@ -238,7 +241,11 @@ bool IsLidOpen()
bool DVDRead(u32 _iDVDOffset, u32 _iRamAddress, u32 _iLength) bool DVDRead(u32 _iDVDOffset, u32 _iRamAddress, u32 _iLength)
{ {
return VolumeHandler::ReadToPtr(Memory::GetPointer(_iRamAddress), _iDVDOffset, _iLength); // We won't need the crit sec when DTK streaming has been rewritten correctly.
dvdread_section.Enter();
bool retval = VolumeHandler::ReadToPtr(Memory::GetPointer(_iRamAddress), _iDVDOffset, _iLength);
dvdread_section.Leave();
return retval;
} }
bool DVDReadADPCM(u8* _pDestBuffer, u32 _iNumSamples) bool DVDReadADPCM(u8* _pDestBuffer, u32 _iNumSamples)
@ -456,11 +463,11 @@ void ExecuteCommand(UDIDMAControlRegister& _DMAControlReg)
{ {
u32 iDVDOffset = dvdMem.Command[1] << 2; u32 iDVDOffset = dvdMem.Command[1] << 2;
u32 iSrcLength = dvdMem.Command[2]; u32 iSrcLength = dvdMem.Command[2];
if (false) { iSrcLength++; } // avoid warning if (false) { iSrcLength++; } // avoid warning << wtf is this?
LOG(DVDINTERFACE, "DVD: Read ISO: DVDOffset=%08x, DMABuffer=%08x, SrcLength=%08x, DMALength=%08x",iDVDOffset,dvdMem.DMAAddress.Address,iSrcLength,dvdMem.DMALength.Length); LOG(DVDINTERFACE, "DVD: Read ISO: DVDOffset=%08x, DMABuffer=%08x, SrcLength=%08x, DMALength=%08x",iDVDOffset,dvdMem.DMAAddress.Address,iSrcLength,dvdMem.DMALength.Length);
_dbg_assert_(DVDINTERFACE, iSrcLength == dvdMem.DMALength.Length); _dbg_assert_(DVDINTERFACE, iSrcLength == dvdMem.DMALength.Length);
if (VolumeHandler::ReadToPtr(Memory::GetPointer(dvdMem.DMAAddress.Address), iDVDOffset, dvdMem.DMALength.Length) != true) if (DVDRead(iDVDOffset, dvdMem.DMAAddress.Address, dvdMem.DMALength.Length) != true)
{ {
PanicAlert("Cant read from DVD_Plugin - DVD-Interface: Fatal Error"); PanicAlert("Cant read from DVD_Plugin - DVD-Interface: Fatal Error");
} }

View File

@ -26,55 +26,37 @@ CVolumeGC::CVolumeGC(IBlobReader* _pReader)
: m_pReader(_pReader) : m_pReader(_pReader)
{} {}
CVolumeGC::~CVolumeGC() CVolumeGC::~CVolumeGC()
{ {
delete m_pReader; delete m_pReader;
} }
bool CVolumeGC::Read(u64 _Offset, u64 _Length, u8* _pBuffer) const
bool
CVolumeGC::Read(u64 _Offset, u64 _Length, u8* _pBuffer) const
{ {
if (m_pReader == NULL) if (m_pReader == NULL)
{ return false;
return(false); return m_pReader->Read(_Offset, _Length, _pBuffer);
} }
return(m_pReader->Read(_Offset, _Length, _pBuffer)); std::string CVolumeGC::GetName() const
}
std::string
CVolumeGC::GetName() const
{ {
if (m_pReader == NULL) if (m_pReader == NULL)
{ return false;
return(false);
}
char Name[128]; char Name[128];
if (!Read(0x20, 0x60, (u8*)&Name)) if (!Read(0x20, 0x60, (u8*)&Name))
{ return false;
return(false);
return Name;
} }
return(Name); std::string CVolumeGC::GetUniqueID() const
}
std::string
CVolumeGC::GetUniqueID() const
{ {
static const std::string NO_UID("NO_UID"); static const std::string NO_UID("NO_UID");
if (m_pReader == NULL) if (m_pReader == NULL)
{
return NO_UID; return NO_UID;
}
char id[6]; char id[6];
if (!Read(0, sizeof(id), reinterpret_cast<u8*>(id))) if (!Read(0, sizeof(id), reinterpret_cast<u8*>(id)))
{ {
PanicAlert("Failed to read unique ID from disc image"); PanicAlert("Failed to read unique ID from disc image");
@ -84,14 +66,10 @@ CVolumeGC::GetUniqueID() const
return std::string(id, sizeof(id)); return std::string(id, sizeof(id));
} }
IVolume::ECountry CVolumeGC::GetCountry() const
IVolume::ECountry
CVolumeGC::GetCountry() const
{ {
if (!m_pReader) if (!m_pReader)
{ return COUNTRY_UNKNOWN;
return(COUNTRY_UNKNOWN);
}
u8 CountryCode; u8 CountryCode;
m_pReader->Read(3, 1, &CountryCode); m_pReader->Read(3, 1, &CountryCode);
@ -141,17 +119,12 @@ CVolumeGC::GetCountry() const
return(country); return(country);
} }
u64 CVolumeGC::GetSize() const
u64
CVolumeGC::GetSize() const
{ {
if (m_pReader) if (m_pReader)
{ return (size_t)m_pReader->GetDataSize();
return((size_t)m_pReader->GetDataSize());
}
else else
{ return 0;
return(0);
}
} }
} // namespace } // namespace

View File

@ -20,35 +20,23 @@
#include "Volume.h" #include "Volume.h"
#include "Blob.h" #include "Blob.h"
// // --- this volume type is used for GC disc images ---
// --- this volume type is used for GC and for decrypted Wii images ---
//
namespace DiscIO namespace DiscIO
{ {
class CVolumeGC class CVolumeGC : public IVolume
: public IVolume
{ {
public: public:
CVolumeGC(IBlobReader* _pReader); CVolumeGC(IBlobReader* _pReader);
~CVolumeGC(); ~CVolumeGC();
bool Read(u64 _Offset, u64 _Length, u8* _pBuffer) const; bool Read(u64 _Offset, u64 _Length, u8* _pBuffer) const;
std::string GetName() const; std::string GetName() const;
std::string GetUniqueID() const; std::string GetUniqueID() const;
ECountry GetCountry() const; ECountry GetCountry() const;
u64 GetSize() const; u64 GetSize() const;
private: private:
IBlobReader* m_pReader; IBlobReader* m_pReader;
}; };
} // namespace
} // namespace

View File

@ -22,33 +22,22 @@
#include "Blob.h" #include "Blob.h"
#include "AES/aes.h" #include "AES/aes.h"
//
// --- this volume type is used for encrypted Wii images --- // --- this volume type is used for encrypted Wii images ---
//
namespace DiscIO namespace DiscIO
{ {
class CVolumeWiiCrypted class CVolumeWiiCrypted : public IVolume
: public IVolume
{ {
public: public:
CVolumeWiiCrypted(IBlobReader* _pReader, u64 _VolumeOffset, const unsigned char* _pVolumeKey); CVolumeWiiCrypted(IBlobReader* _pReader, u64 _VolumeOffset, const unsigned char* _pVolumeKey);
~CVolumeWiiCrypted(); ~CVolumeWiiCrypted();
bool Read(u64 _Offset, u64 _Length, u8* _pBuffer) const; bool Read(u64 _Offset, u64 _Length, u8* _pBuffer) const;
std::string GetName() const; std::string GetName() const;
std::string GetUniqueID() const; std::string GetUniqueID() const;
ECountry GetCountry() const; ECountry GetCountry() const;
u64 GetSize() const; u64 GetSize() const;
private: private:
IBlobReader* m_pReader; IBlobReader* m_pReader;
u8* m_pBuffer; u8* m_pBuffer;
@ -59,6 +48,7 @@ class CVolumeWiiCrypted
mutable u64 m_LastDecryptedBlockOffset; mutable u64 m_LastDecryptedBlockOffset;
mutable unsigned char m_LastDecryptedBlock[0x8000]; mutable unsigned char m_LastDecryptedBlock[0x8000];
}; };
} // namespace } // namespace
#endif #endif

View File

@ -24,6 +24,7 @@
namespace DSound namespace DSound
{ {
#define BUFSIZE 32768 #define BUFSIZE 32768
#define MAXWAIT 70 //ms #define MAXWAIT 70 //ms
@ -33,31 +34,33 @@ HANDLE hThread;
StreamCallback callback; StreamCallback callback;
//lite mojs
IDirectSound8* ds; IDirectSound8* ds;
IDirectSoundBuffer* dsBuffer; IDirectSoundBuffer* dsBuffer;
//tja.. beh<65>vs
int bufferSize; //i bytes int bufferSize; //i bytes
int totalRenderedBytes; int totalRenderedBytes;
int sampleRate; int sampleRate;
//med den h<>r synkar vi st<73>ngning.. // playback position
//0=vi spelar ov<6F>sen, 1=st<73>ng tr<74>den NU! int currentPos;
int lastPos;
short realtimeBuffer[1024 * 1024];
// We set this to shut down the sound thread.
// 0=keep playing, 1=stop playing NOW.
volatile int threadData; volatile int threadData;
inline int FIX128(int x) inline int FIX128(int x)
{ {
return(x & (~127)); return(x & (~127));
} }
int DSound_GetSampleRate() int DSound_GetSampleRate()
{ {
return(sampleRate); return(sampleRate);
} }
bool CreateBuffer() bool CreateBuffer()
{ {
PCMWAVEFORMAT pcmwf; PCMWAVEFORMAT pcmwf;
@ -92,7 +95,6 @@ bool CreateBuffer()
} }
} }
bool WriteDataToBuffer(DWORD dwOffset, // Our own write cursor. bool WriteDataToBuffer(DWORD dwOffset, // Our own write cursor.
char* soundData, // Start of our data. char* soundData, // Start of our data.
DWORD dwSoundBytes) // Size of block to copy. DWORD dwSoundBytes) // Size of block to copy.
@ -126,18 +128,12 @@ bool WriteDataToBuffer(DWORD dwOffset, // Our own write cursor.
return(false); return(false);
} }
inline int ModBufferSize(int x) inline int ModBufferSize(int x)
{ {
return((x + bufferSize) % bufferSize); return((x + bufferSize) % bufferSize);
} }
// The audio thread.
int currentPos;
int lastPos;
short realtimeBuffer[1024 * 1024];
//Sj<53>lva tr<74>den
DWORD WINAPI soundThread(void*) DWORD WINAPI soundThread(void*)
{ {
currentPos = 0; currentPos = 0;
@ -157,6 +153,8 @@ DWORD WINAPI soundThread(void*)
if (numBytesToRender >= 256) if (numBytesToRender >= 256)
{ {
if (numBytesToRender > sizeof(realtimeBuffer))
MessageBox(0,"soundThread: too big render call",0,0);
(*callback)(realtimeBuffer, numBytesToRender >> 2, 16, sampleRate, 2); (*callback)(realtimeBuffer, numBytesToRender >> 2, 16, sampleRate, 2);
WriteDataToBuffer(lastPos, (char*)realtimeBuffer, numBytesToRender); WriteDataToBuffer(lastPos, (char*)realtimeBuffer, numBytesToRender);
@ -174,7 +172,6 @@ DWORD WINAPI soundThread(void*)
return(0); //hurra! return(0); //hurra!
} }
bool DSound_StartSound(HWND window, int _sampleRate, StreamCallback _callback) bool DSound_StartSound(HWND window, int _sampleRate, StreamCallback _callback)
{ {
callback = _callback; callback = _callback;
@ -189,15 +186,13 @@ bool DSound_StartSound(HWND window, int _sampleRate, StreamCallback _callback)
//vi vill ha access till DSOUND s<>... //vi vill ha access till DSOUND s<>...
if (FAILED(DirectSoundCreate8(0, &ds, 0))) if (FAILED(DirectSoundCreate8(0, &ds, 0)))
{ return false;
return(false);
}
ds->SetCooperativeLevel(window, DSSCL_NORMAL); ds->SetCooperativeLevel(window, DSSCL_NORMAL);
if (!CreateBuffer()) if (!CreateBuffer())
{ {
return(false); return false;
} }
DWORD num1; DWORD num1;
@ -209,16 +204,14 @@ bool DSound_StartSound(HWND window, int _sampleRate, StreamCallback _callback)
DWORD h; DWORD h;
hThread = CreateThread(0, 0, soundThread, 0, 0, &h); hThread = CreateThread(0, 0, soundThread, 0, 0, &h);
SetThreadPriority(hThread, THREAD_PRIORITY_ABOVE_NORMAL); SetThreadPriority(hThread, THREAD_PRIORITY_ABOVE_NORMAL);
return(true); return true;
} }
void DSound_UpdateSound() void DSound_UpdateSound()
{ {
SetEvent(soundSyncEvent); SetEvent(soundSyncEvent);
} }
void DSound_StopSound() void DSound_StopSound()
{ {
EnterCriticalSection(&soundCriticalSection); EnterCriticalSection(&soundCriticalSection);
@ -233,9 +226,10 @@ void DSound_StopSound()
ds->Release(); ds->Release();
CloseHandle(soundSyncEvent); CloseHandle(soundSyncEvent);
soundSyncEvent = INVALID_HANDLE_VALUE;
hThread = INVALID_HANDLE_VALUE;
} }
int DSound_GetCurSample() int DSound_GetCurSample()
{ {
EnterCriticalSection(&soundCriticalSection); EnterCriticalSection(&soundCriticalSection);
@ -246,9 +240,9 @@ int DSound_GetCurSample()
return(playCursor); return(playCursor);
} }
float DSound_GetTimer() float DSound_GetTimer()
{ {
return((float)DSound_GetCurSample() * (1.0f / (4.0f * sampleRate))); return((float)DSound_GetCurSample() * (1.0f / (4.0f * sampleRate)));
} }
}
} // namespace