206 lines
4.8 KiB
C++
206 lines
4.8 KiB
C++
#include "types.h"
|
|
|
|
|
|
|
|
#include "common.h"
|
|
|
|
#include "deps/chdpsr/cdipsr.h"
|
|
|
|
Disc* cdi_parse(const wchar* file)
|
|
{
|
|
core_file* fsource=core_fopen(file);
|
|
|
|
if (!fsource)
|
|
return 0;
|
|
|
|
image_s image = { 0 };
|
|
track_s track = { 0 };
|
|
if (!CDI_init(fsource, &image, file))
|
|
{
|
|
core_fclose(fsource);
|
|
return NULL;
|
|
}
|
|
|
|
CDI_get_sessions(fsource,&image);
|
|
|
|
Disc* rv= new Disc();
|
|
|
|
image.remaining_sessions = image.sessions;
|
|
|
|
/////////////////////////////////////////////////////////////// Loop sessions
|
|
|
|
bool ft=true, CD_M2=false,CD_M1=false,CD_DA=false;
|
|
|
|
while(image.remaining_sessions > 0)
|
|
{
|
|
ft=true;
|
|
image.global_current_session++;
|
|
|
|
CDI_get_tracks (fsource, &image);
|
|
|
|
image.header_position = core_ftell(fsource);
|
|
|
|
//printf("\nSession %d has %d track(s)\n",image.global_current_session,image.tracks);
|
|
|
|
if (image.tracks == 0)
|
|
INFO_LOG(GDROM, "Open session");
|
|
else
|
|
{
|
|
// Clear cuesheet
|
|
image.remaining_tracks = image.tracks;
|
|
|
|
///////////////////////////////////////////////////////////////// Loop tracks
|
|
|
|
while(image.remaining_tracks > 0)
|
|
{
|
|
track.global_current_track++;
|
|
track.number = image.tracks - image.remaining_tracks + 1;
|
|
|
|
CDI_read_track (fsource, &image, &track);
|
|
|
|
image.header_position = core_ftell(fsource);
|
|
|
|
// Show info
|
|
#if 0
|
|
printf("Saving ");
|
|
printf("Track: %2d ",track.global_current_track);
|
|
printf("Type: ");
|
|
switch(track.mode)
|
|
{
|
|
case 0 : printf("Audio/"); break;
|
|
case 1 : printf("Mode1/"); break;
|
|
case 2 :
|
|
default: printf("Mode2/"); break;
|
|
}
|
|
printf("%lu ",track.sector_size);
|
|
|
|
printf("Pregap: %-3ld ",track.pregap_length);
|
|
printf("Size: %-6ld ",track.length);
|
|
printf("LBA: %-6ld ",track.start_lba);
|
|
#endif
|
|
if (ft)
|
|
{
|
|
ft=false;
|
|
Session s;
|
|
s.StartFAD=track.pregap_length + track.start_lba;
|
|
s.FirstTrack=track.global_current_track;
|
|
rv->sessions.push_back(s);
|
|
}
|
|
|
|
Track t;
|
|
if (track.mode==2)
|
|
CD_M2=true;
|
|
if (track.mode==1)
|
|
CD_M1=true;
|
|
if (track.mode==0)
|
|
CD_DA=true;
|
|
|
|
|
|
|
|
t.ADDR=1;//hmm is that ok ?
|
|
|
|
t.CTRL=track.mode==0?0:4;
|
|
t.StartFAD=track.start_lba+track.pregap_length;
|
|
t.EndFAD=t.StartFAD+track.length-1;
|
|
t.file = new RawTrackFile(core_fopen(file),track.position + track.pregap_length * track.sector_size,t.StartFAD,track.sector_size);
|
|
|
|
rv->tracks.push_back(t);
|
|
|
|
//printf("\n");
|
|
|
|
// if (track.pregap_length != 150) printf("Warning! This track seems to have a non-standard pregap...\n");
|
|
|
|
if (track.length < 0)
|
|
WARN_LOG(GDROM, "Negative track size found. You must extract image with /pregap option");
|
|
|
|
//if (!opts.showinfo)
|
|
{
|
|
if (track.total_length < track.length + track.pregap_length)
|
|
{
|
|
WARN_LOG(GDROM, "This track seems truncated. Skipping...");
|
|
core_fseek(fsource, track.position, SEEK_SET);
|
|
core_fseek(fsource, track.total_length, SEEK_CUR);
|
|
track.position = core_ftell(fsource);
|
|
}
|
|
else
|
|
{
|
|
|
|
//printf("Track position: %lu\n",track.position + track.pregap_length * track.sector_size);
|
|
core_fseek(fsource, track.position, SEEK_SET);
|
|
// fseek(fsource, track->pregap_length * track->sector_size, SEEK_CUR);
|
|
// fseek(fsource, track->length * track->sector_size, SEEK_CUR);
|
|
core_fseek(fsource, track.total_length * track.sector_size, SEEK_CUR);
|
|
|
|
//savetrack(fsource, &image, &track, &opts, &flags);
|
|
track.position = core_ftell(fsource);
|
|
|
|
rv->EndFAD=track.start_lba +track.total_length;
|
|
// Generate cuesheet entries
|
|
|
|
//if (flags.create_cuesheet && !(track.mode == 2 && flags.do_convert)) // Do not generate input if converted (obsolete)
|
|
// savecuesheet(fcuesheet, &image, &track, &opts, &flags);
|
|
|
|
}
|
|
}
|
|
|
|
core_fseek(fsource, image.header_position, SEEK_SET);
|
|
|
|
|
|
// Close loops
|
|
|
|
image.remaining_tracks--;
|
|
}
|
|
|
|
//if (flags.create_cuesheet) fclose(fcuesheet);
|
|
}
|
|
|
|
CDI_skip_next_session (fsource, &image);
|
|
|
|
image.remaining_sessions--;
|
|
}
|
|
core_fclose(fsource);
|
|
|
|
rv->type=GuessDiscType(CD_M1,CD_M2,CD_DA);
|
|
|
|
rv->LeadOut.StartFAD=rv->EndFAD;
|
|
rv->LeadOut.ADDR=0;
|
|
rv->LeadOut.CTRL=0;
|
|
|
|
|
|
|
|
return rv;
|
|
}
|
|
|
|
#if 0
|
|
SPfcToc* pstToc;
|
|
HMODULE pfctoc_mod=NULL;
|
|
pfctoc_mod=LoadLibrary("plugins\\pfctoc.dll");
|
|
if (pfctoc_mod==NULL)
|
|
pfctoc_mod=LoadLibrary("pfctoc.dll");
|
|
if(pfctoc_mod==NULL)
|
|
return false;
|
|
|
|
PfcFreeTocFP* PfcFreeToc;
|
|
PfcGetTocFP* PfcGetToc;
|
|
|
|
PfcFreeToc=(PfcFreeTocFP*)GetProcAddress(pfctoc_mod,"PfcFreeToc");
|
|
PfcGetToc=(PfcGetTocFP*)GetProcAddress(pfctoc_mod,"PfcGetToc");
|
|
verify(PfcFreeToc!=NULL && PfcGetToc!=NULL);
|
|
|
|
DWORD dwSize;//
|
|
DWORD dwErr = PfcGetToc(file, pstToc, dwSize);
|
|
if (dwErr == PFCTOC_OK)
|
|
{
|
|
rv= new CDIDisc(pstToc,file);
|
|
}
|
|
|
|
if (pstToc)
|
|
PfcFreeToc(pstToc);
|
|
if (pfctoc_mod)
|
|
FreeLibrary(pfctoc_mod);
|
|
pstToc=0;
|
|
pfctoc_mod=0;
|
|
|
|
return rv;
|
|
#endif
|