|
@@ -1,4 +1,4 @@ |
|
#include <Windows.h>
|
|
#include <windows.h>
|
|
#include "common.h"
|
|
#include "common.h"
|
|
#include "patcher.h"
|
|
#include "patcher.h"
|
|
#include "CdStream.h"
|
|
#include "CdStream.h"
|
|
|
@@ -53,9 +53,9 @@ CdStreamInitThread(void) |
|
{
|
|
{
|
|
for ( int32 i = 0; i < gNumChannels; i++ )
|
|
for ( int32 i = 0; i < gNumChannels; i++ )
|
|
{
|
|
{
|
|
gpReadInfo[i].hSemaphore = CreateSemaphore(NULL, 0, 2, NULL);
|
|
gpReadInfo[i].hSemaphore = CreateSemaphore(nil, 0, 2, nil);
|
|
|
|
|
|
if ( gpReadInfo[i].hSemaphore == NULL )
|
|
if ( gpReadInfo[i].hSemaphore == nil )
|
|
{
|
|
{
|
|
CDTRACE("failed to create sync semaphore");
|
|
CDTRACE("failed to create sync semaphore");
|
|
ASSERT(0);
|
|
ASSERT(0);
|
|
|
@@ -68,20 +68,20 @@ CdStreamInitThread(void) |
|
gChannelRequestQ.head = 0;
|
|
gChannelRequestQ.head = 0;
|
|
gChannelRequestQ.tail = 0;
|
|
gChannelRequestQ.tail = 0;
|
|
gChannelRequestQ.size = gNumChannels + 1;
|
|
gChannelRequestQ.size = gNumChannels + 1;
|
|
ASSERT(gChannelRequestQ.items != NULL );
|
|
ASSERT(gChannelRequestQ.items != nil );
|
|
|
|
|
|
gCdStreamSema = CreateSemaphore(NULL, 0, 5, "CdStream");
|
|
gCdStreamSema = CreateSemaphore(nil, 0, 5, "CdStream");
|
|
|
|
|
|
if ( gCdStreamSema == NULL )
|
|
if ( gCdStreamSema == nil )
|
|
{
|
|
{
|
|
CDTRACE("failed to create stream semaphore");
|
|
CDTRACE("failed to create stream semaphore");
|
|
ASSERT(0);
|
|
ASSERT(0);
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
_gCdStreamThread = CreateThread(NULL, 64*1024/*64KB*/, CdStreamThread, NULL, CREATE_SUSPENDED, &_gCdStreamThreadId);
|
|
_gCdStreamThread = CreateThread(nil, 64*1024/*64KB*/, CdStreamThread, nil, CREATE_SUSPENDED, &_gCdStreamThreadId);
|
|
|
|
|
|
if ( _gCdStreamThread == NULL )
|
|
if ( _gCdStreamThread == nil )
|
|
{
|
|
{
|
|
CDTRACE("failed to create streaming thread");
|
|
CDTRACE("failed to create streaming thread");
|
|
ASSERT(0);
|
|
ASSERT(0);
|
|
|
@@ -101,7 +101,7 @@ CdStreamInit(int32 numChannels) |
|
DWORD NumberOfFreeClusters;
|
|
DWORD NumberOfFreeClusters;
|
|
DWORD TotalNumberOfClusters;
|
|
DWORD TotalNumberOfClusters;
|
|
|
|
|
|
GetDiskFreeSpace(NULL, &SectorsPerCluster, &BytesPerSector, &NumberOfFreeClusters, &TotalNumberOfClusters);
|
|
GetDiskFreeSpace(nil, &SectorsPerCluster, &BytesPerSector, &NumberOfFreeClusters, &TotalNumberOfClusters);
|
|
|
|
|
|
_gdwCdStreamFlags = 0;
|
|
_gdwCdStreamFlags = 0;
|
|
|
|
|
|
|
@@ -118,7 +118,7 @@ CdStreamInit(int32 numChannels) |
|
_gbCdStreamAsync = FALSE;
|
|
_gbCdStreamAsync = FALSE;
|
|
|
|
|
|
void *pBuffer = (void *)RwMallocAlign(CDSTREAM_SECTOR_SIZE, BytesPerSector);
|
|
void *pBuffer = (void *)RwMallocAlign(CDSTREAM_SECTOR_SIZE, BytesPerSector);
|
|
ASSERT( pBuffer != NULL );
|
|
ASSERT( pBuffer != nil );
|
|
|
|
|
|
SetLastError(0);
|
|
SetLastError(0);
|
|
|
|
|
|
|
@@ -127,7 +127,7 @@ CdStreamInit(int32 numChannels) |
|
gNumChannels = numChannels;
|
|
gNumChannels = numChannels;
|
|
|
|
|
|
gpReadInfo = (CdReadInfo *)LocalAlloc(LMEM_ZEROINIT, sizeof(CdReadInfo) * numChannels);
|
|
gpReadInfo = (CdReadInfo *)LocalAlloc(LMEM_ZEROINIT, sizeof(CdReadInfo) * numChannels);
|
|
ASSERT( gpReadInfo != NULL );
|
|
ASSERT( gpReadInfo != nil );
|
|
|
|
|
|
CDDEBUG("read info %p", gpReadInfo);
|
|
CDDEBUG("read info %p", gpReadInfo);
|
|
|
|
|
|
|
@@ -156,15 +156,15 @@ CdStreamInit(int32 numChannels) |
|
|
|
|
|
CdStreamInitThread();
|
|
CdStreamInitThread();
|
|
|
|
|
|
ASSERT( pBuffer != NULL );
|
|
ASSERT( pBuffer != nil );
|
|
RwFreeAlign(pBuffer);
|
|
RwFreeAlign(pBuffer);
|
|
}
|
|
}
|
|
|
|
|
|
uint32
|
|
uint32
|
|
GetGTA3ImgSize(void)
|
|
GetGTA3ImgSize(void)
|
|
{
|
|
{
|
|
ASSERT( gImgFiles[0] != NULL );
|
|
ASSERT( gImgFiles[0] != nil );
|
|
return (uint32)GetFileSize(gImgFiles[0], NULL);
|
|
return (uint32)GetFileSize(gImgFiles[0], nil);
|
|
}
|
|
}
|
|
|
|
|
|
void
|
|
void
|
|
|
@@ -189,17 +189,17 @@ int32 |
|
CdStreamRead(int32 channel, void *buffer, uint32 offset, uint32 size)
|
|
CdStreamRead(int32 channel, void *buffer, uint32 offset, uint32 size)
|
|
{
|
|
{
|
|
ASSERT( channel < gNumChannels );
|
|
ASSERT( channel < gNumChannels );
|
|
ASSERT( buffer != NULL );
|
|
ASSERT( buffer != nil );
|
|
|
|
|
|
lastPosnRead = size + offset;
|
|
lastPosnRead = size + offset;
|
|
|
|
|
|
ASSERT( _GET_INDEX(offset) < MAX_CDIMAGES );
|
|
ASSERT( _GET_INDEX(offset) < MAX_CDIMAGES );
|
|
HANDLE hImage = gImgFiles[_GET_INDEX(offset)];
|
|
HANDLE hImage = gImgFiles[_GET_INDEX(offset)];
|
|
ASSERT( hImage != NULL );
|
|
ASSERT( hImage != nil );
|
|
|
|
|
|
|
|
|
|
CdReadInfo *pChannel = &gpReadInfo[channel];
|
|
CdReadInfo *pChannel = &gpReadInfo[channel];
|
|
ASSERT( pChannel != NULL );
|
|
ASSERT( pChannel != nil );
|
|
|
|
|
|
pChannel->hFile = hImage;
|
|
pChannel->hFile = hImage;
|
|
|
|
|
|
|
@@ -218,7 +218,7 @@ CdStreamRead(int32 channel, void *buffer, uint32 offset, uint32 size) |
|
|
|
|
|
AddToQueue(&gChannelRequestQ, channel);
|
|
AddToQueue(&gChannelRequestQ, channel);
|
|
|
|
|
|
if ( !ReleaseSemaphore(gCdStreamSema, 1, NULL) )
|
|
if ( !ReleaseSemaphore(gCdStreamSema, 1, nil) )
|
|
printf("Signal Sema Error\n");
|
|
printf("Signal Sema Error\n");
|
|
|
|
|
|
return STREAM_SUCCESS;
|
|
return STREAM_SUCCESS;
|
|
|
@@ -228,7 +228,7 @@ CdStreamRead(int32 channel, void *buffer, uint32 offset, uint32 size) |
|
{
|
|
{
|
|
ASSERT( channel < gNumChannels );
|
|
ASSERT( channel < gNumChannels );
|
|
CdReadInfo *pChannel = &gpReadInfo[channel];
|
|
CdReadInfo *pChannel = &gpReadInfo[channel];
|
|
ASSERT( pChannel != NULL );
|
|
ASSERT( pChannel != nil );
|
|
|
|
|
|
pChannel->Overlapped.Offset = _GET_OFFSET(offset) * CDSTREAM_SECTOR_SIZE;
|
|
pChannel->Overlapped.Offset = _GET_OFFSET(offset) * CDSTREAM_SECTOR_SIZE;
|
|
|
|
|
|
|
@@ -239,11 +239,11 @@ CdStreamRead(int32 channel, void *buffer, uint32 offset, uint32 size) |
|
return STREAM_SUCCESS;
|
|
return STREAM_SUCCESS;
|
|
}
|
|
}
|
|
|
|
|
|
SetFilePointer(hImage, _GET_OFFSET(offset) * CDSTREAM_SECTOR_SIZE, NULL, FILE_BEGIN);
|
|
SetFilePointer(hImage, _GET_OFFSET(offset) * CDSTREAM_SECTOR_SIZE, nil, FILE_BEGIN);
|
|
|
|
|
|
DWORD NumberOfBytesRead;
|
|
DWORD NumberOfBytesRead;
|
|
|
|
|
|
if ( !ReadFile(hImage, buffer, size * CDSTREAM_SECTOR_SIZE, &NumberOfBytesRead, NULL) )
|
|
if ( !ReadFile(hImage, buffer, size * CDSTREAM_SECTOR_SIZE, &NumberOfBytesRead, nil) )
|
|
return STREAM_NONE;
|
|
return STREAM_NONE;
|
|
else
|
|
else
|
|
return STREAM_SUCCESS;
|
|
return STREAM_SUCCESS;
|
|
|
@@ -254,7 +254,7 @@ CdStreamGetStatus(int32 channel) |
|
{
|
|
{
|
|
ASSERT( channel < gNumChannels );
|
|
ASSERT( channel < gNumChannels );
|
|
CdReadInfo *pChannel = &gpReadInfo[channel];
|
|
CdReadInfo *pChannel = &gpReadInfo[channel];
|
|
ASSERT( pChannel != NULL );
|
|
ASSERT( pChannel != nil );
|
|
|
|
|
|
if ( _gbCdStreamAsync )
|
|
if ( _gbCdStreamAsync )
|
|
{
|
|
{
|
|
|
@@ -278,7 +278,7 @@ CdStreamGetStatus(int32 channel) |
|
|
|
|
|
if ( _gbCdStreamOverlapped )
|
|
if ( _gbCdStreamOverlapped )
|
|
{
|
|
{
|
|
ASSERT( pChannel->hFile != NULL );
|
|
ASSERT( pChannel->hFile != nil );
|
|
if ( WaitForSingleObjectEx(pChannel->hFile, 0, TRUE) == WAIT_OBJECT_0 )
|
|
if ( WaitForSingleObjectEx(pChannel->hFile, 0, TRUE) == WAIT_OBJECT_0 )
|
|
return STREAM_NONE;
|
|
return STREAM_NONE;
|
|
else
|
|
else
|
|
|
@@ -299,15 +299,15 @@ CdStreamSync(int32 channel) |
|
{
|
|
{
|
|
ASSERT( channel < gNumChannels );
|
|
ASSERT( channel < gNumChannels );
|
|
CdReadInfo *pChannel = &gpReadInfo[channel];
|
|
CdReadInfo *pChannel = &gpReadInfo[channel];
|
|
ASSERT( pChannel != NULL );
|
|
ASSERT( pChannel != nil );
|
|
|
|
|
|
if ( _gbCdStreamAsync )
|
|
if ( _gbCdStreamAsync )
|
|
{
|
|
{
|
|
if ( pChannel->nSectorsToRead != 0 )
|
|
if ( pChannel->nSectorsToRead != 0 )
|
|
{
|
|
{
|
|
pChannel->bLocked = true;
|
|
pChannel->bLocked = true;
|
|
|
|
|
|
ASSERT( pChannel->hSemaphore != NULL );
|
|
ASSERT( pChannel->hSemaphore != nil );
|
|
|
|
|
|
WaitForSingleObject(pChannel->hSemaphore, INFINITE);
|
|
WaitForSingleObject(pChannel->hSemaphore, INFINITE);
|
|
}
|
|
}
|
|
|
@@ -321,7 +321,7 @@ CdStreamSync(int32 channel) |
|
|
|
|
|
if ( _gbCdStreamOverlapped && pChannel->hFile )
|
|
if ( _gbCdStreamOverlapped && pChannel->hFile )
|
|
{
|
|
{
|
|
ASSERT(pChannel->hFile != NULL );
|
|
ASSERT(pChannel->hFile != nil );
|
|
if ( GetOverlappedResult(pChannel->hFile, &pChannel->Overlapped, &NumberOfBytesTransferred, TRUE) )
|
|
if ( GetOverlappedResult(pChannel->hFile, &pChannel->Overlapped, &NumberOfBytesTransferred, TRUE) )
|
|
return STREAM_NONE;
|
|
return STREAM_NONE;
|
|
else
|
|
else
|
|
|
@@ -334,8 +334,8 @@ CdStreamSync(int32 channel) |
|
void
|
|
void
|
|
AddToQueue(Queue *queue, int32 item)
|
|
AddToQueue(Queue *queue, int32 item)
|
|
{
|
|
{
|
|
ASSERT( queue != NULL );
|
|
ASSERT( queue != nil );
|
|
ASSERT( queue->items != NULL );
|
|
ASSERT( queue->items != nil );
|
|
queue->items[queue->tail] = item;
|
|
queue->items[queue->tail] = item;
|
|
|
|
|
|
queue->tail = (queue->tail + 1) % queue->size;
|
|
queue->tail = (queue->tail + 1) % queue->size;
|
|
|
@@ -347,18 +347,18 @@ AddToQueue(Queue *queue, int32 item) |
|
int32
|
|
int32
|
|
GetFirstInQueue(Queue *queue)
|
|
GetFirstInQueue(Queue *queue)
|
|
{
|
|
{
|
|
ASSERT( queue != NULL );
|
|
ASSERT( queue != nil );
|
|
if ( queue->head == queue->tail )
|
|
if ( queue->head == queue->tail )
|
|
return -1;
|
|
return -1;
|
|
|
|
|
|
ASSERT( queue->items != NULL );
|
|
ASSERT( queue->items != nil );
|
|
return queue->items[queue->head];
|
|
return queue->items[queue->head];
|
|
}
|
|
}
|
|
|
|
|
|
void
|
|
void
|
|
RemoveFirstInQueue(Queue *queue)
|
|
RemoveFirstInQueue(Queue *queue)
|
|
{
|
|
{
|
|
ASSERT( queue != NULL );
|
|
ASSERT( queue != nil );
|
|
if ( queue->head == queue->tail )
|
|
if ( queue->head == queue->tail )
|
|
{
|
|
{
|
|
debug("Queue is empty\n");
|
|
debug("Queue is empty\n");
|
|
|
@@ -381,7 +381,7 @@ WINAPI CdStreamThread(LPVOID lpThreadParameter) |
|
ASSERT( channel < gNumChannels );
|
|
ASSERT( channel < gNumChannels );
|
|
|
|
|
|
CdReadInfo *pChannel = &gpReadInfo[channel];
|
|
CdReadInfo *pChannel = &gpReadInfo[channel];
|
|
ASSERT( pChannel != NULL );
|
|
ASSERT( pChannel != nil );
|
|
|
|
|
|
pChannel->bInUse = true;
|
|
pChannel->bInUse = true;
|
|
|
|
|
|
|
@@ -391,8 +391,8 @@ WINAPI CdStreamThread(LPVOID lpThreadParameter) |
|
{
|
|
{
|
|
pChannel->Overlapped.Offset = pChannel->nSectorOffset * CDSTREAM_SECTOR_SIZE;
|
|
pChannel->Overlapped.Offset = pChannel->nSectorOffset * CDSTREAM_SECTOR_SIZE;
|
|
|
|
|
|
ASSERT(pChannel->hFile != NULL );
|
|
ASSERT(pChannel->hFile != nil );
|
|
ASSERT(pChannel->pBuffer != NULL );
|
|
ASSERT(pChannel->pBuffer != nil );
|
|
|
|
|
|
DWORD NumberOfBytesTransferred;
|
|
DWORD NumberOfBytesTransferred;
|
|
|
|
|
|
|
@@ -416,10 +416,10 @@ WINAPI CdStreamThread(LPVOID lpThreadParameter) |
|
}
|
|
}
|
|
else
|
|
else
|
|
{
|
|
{
|
|
ASSERT(pChannel->hFile != NULL );
|
|
ASSERT(pChannel->hFile != nil );
|
|
ASSERT(pChannel->pBuffer != NULL );
|
|
ASSERT(pChannel->pBuffer != nil );
|
|
|
|
|
|
SetFilePointer(pChannel->hFile, pChannel->nSectorOffset * CDSTREAM_SECTOR_SIZE, NULL, FILE_BEGIN);
|
|
SetFilePointer(pChannel->hFile, pChannel->nSectorOffset * CDSTREAM_SECTOR_SIZE, nil, FILE_BEGIN);
|
|
|
|
|
|
DWORD NumberOfBytesRead;
|
|
DWORD NumberOfBytesRead;
|
|
if ( ReadFile(pChannel->hFile,
|
|
if ( ReadFile(pChannel->hFile,
|
|
|
@@ -439,7 +439,7 @@ WINAPI CdStreamThread(LPVOID lpThreadParameter) |
|
|
|
|
|
if ( pChannel->bLocked )
|
|
if ( pChannel->bLocked )
|
|
{
|
|
{
|
|
ASSERT( pChannel->hSemaphore != NULL );
|
|
ASSERT( pChannel->hSemaphore != nil );
|
|
ReleaseSemaphore(pChannel->hSemaphore, 1, NULL);
|
|
ReleaseSemaphore(pChannel->hSemaphore, 1, NULL);
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -450,20 +450,20 @@ WINAPI CdStreamThread(LPVOID lpThreadParameter) |
|
bool
|
|
bool
|
|
CdStreamAddImage(char const *path)
|
|
CdStreamAddImage(char const *path)
|
|
{
|
|
{
|
|
ASSERT(path != NULL);
|
|
ASSERT(path != nil);
|
|
ASSERT(gNumImages < MAX_CDIMAGES);
|
|
ASSERT(gNumImages < MAX_CDIMAGES);
|
|
|
|
|
|
SetLastError(0);
|
|
SetLastError(0);
|
|
|
|
|
|
gImgFiles[gNumImages] = CreateFile(path,
|
|
gImgFiles[gNumImages] = CreateFile(path,
|
|
GENERIC_READ,
|
|
GENERIC_READ,
|
|
FILE_SHARE_READ,
|
|
FILE_SHARE_READ,
|
|
NULL,
|
|
nil,
|
|
OPEN_EXISTING,
|
|
OPEN_EXISTING,
|
|
_gdwCdStreamFlags | FILE_FLAG_RANDOM_ACCESS | FILE_ATTRIBUTE_READONLY,
|
|
_gdwCdStreamFlags | FILE_FLAG_RANDOM_ACCESS | FILE_ATTRIBUTE_READONLY,
|
|
NULL);
|
|
nil);
|
|
|
|
|
|
ASSERT( gImgFiles[gNumImages] != NULL );
|
|
ASSERT( gImgFiles[gNumImages] != nil );
|
|
if ( gImgFiles[gNumImages] == NULL )
|
|
if ( gImgFiles[gNumImages] == NULL )
|
|
return false;
|
|
return false;
|
|
|
|
|
|
|
@@ -478,10 +478,10 @@ char * |
|
CdStreamGetImageName(int32 cd)
|
|
CdStreamGetImageName(int32 cd)
|
|
{
|
|
{
|
|
ASSERT(cd < MAX_CDIMAGES);
|
|
ASSERT(cd < MAX_CDIMAGES);
|
|
if ( gImgFiles[cd] != NULL )
|
|
if ( gImgFiles[cd] != nil )
|
|
return gCdImageNames[cd];
|
|
return gCdImageNames[cd];
|
|
|
|
|
|
return NULL;
|
|
return nil;
|
|
}
|
|
}
|
|
|
|
|
|
void
|
|
void
|
|
|
@@ -495,7 +495,7 @@ CdStreamRemoveImages(void) |
|
SetLastError(0);
|
|
SetLastError(0);
|
|
|
|
|
|
CloseHandle(gImgFiles[i]);
|
|
CloseHandle(gImgFiles[i]);
|
|
gImgFiles[i] = NULL;
|
|
gImgFiles[i] = nil;
|
|
}
|
|
}
|
|
|
|
|
|
gNumImages = 0;
|
|
gNumImages = 0;
|
|
|
|