Example #1
0
s32 cdvdRequestSector(u32 sector, s32 mode)
{
    if (sector >= tracks[0].length)
        return -1;

    sector &= ~15;  //align to 16-sector block

    threadRequestInfo.lsn = sector;
    threadRequestInfo.mode = mode;
    threadRequestPending = false;
    if (cdvdCacheFetch(sector, mode, threadRequestInfo.data)) {
        return 0;
    }

    threadRequestPending = true;
    ResetEvent(hRequestComplete);
    PulseEvent(hNotify);

    return 0;
}
Example #2
0
s32 cdvdDirectReadSector(s32 first, s32 mode, char *buffer)
{
	static char data[16*2352];

	if((u32)first>=tracks[0].length)
		return -1;

	s32 sector = first&(~15); //align to 16-sector block

	EnterCriticalSection( &CacheMutex );
	if(!cdvdCacheFetch(sector,mode,data))
	{
		s32 ret = -1;
		s32 tries=5;

		s32 count = 16;

		s32 left = tracks[0].length-sector;

		if(left<count) count=left;

		do {
			if(mode==CDVD_MODE_2048)
				ret = src->ReadSectors2048(sector,count,data);
			else
				ret = src->ReadSectors2352(sector,count,data);

			if(ret==0)
				break;

			tries--;

		} while((ret<0)&&(tries>0));

		cdvdCacheUpdate(sector,mode,data);
	}
	LeaveCriticalSection( &CacheMutex );

	s32 offset;

	if(mode==CDVD_MODE_2048)
	{
		offset = 2048*(first-sector);
		memcpy(buffer,data + offset,2048);
		return 0;
	}

	offset  = 2352*(first-sector);
	s8* bfr = data + offset;

	switch(mode)
	{
		case CDVD_MODE_2328:
			memcpy(buffer,bfr+24,2328);
			return 0;
		case CDVD_MODE_2340:
			memcpy(buffer,bfr+12,2340);
			return 0;
		default:
			memcpy(buffer,bfr+12,2352);
			return 0;
	}
	return 0;
}