flycast/core/imgread/cdi.cpp

207 lines
4.8 KiB
C++
Raw Normal View History

2013-12-19 17:10:14 +00:00
#include "types.h"
#include "common.h"
#include "deps/chdpsr/cdipsr.h"
Disc* cdi_parse(const wchar* file)
2013-12-19 17:10:14 +00:00
{
core_file* fsource=core_fopen(file);
2013-12-19 17:10:14 +00:00
if (!fsource)
return 0;
image_s image = { 0 };
track_s track = { 0 };
if (!CDI_init(fsource, &image, file))
{
core_fclose(fsource);
return NULL;
}
2013-12-19 17:10:14 +00:00
CDI_get_sessions(fsource,&image);
Disc* rv= new Disc();
2013-12-19 17:10:14 +00:00
image.remaining_sessions = image.sessions;
/////////////////////////////////////////////////////////////// Loop sessions
2013-12-19 17:10:14 +00:00
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);
2013-12-19 17:10:14 +00:00
//printf("\nSession %d has %d track(s)\n",image.global_current_session,image.tracks);
2013-12-19 17:10:14 +00:00
if (image.tracks == 0)
printf("Open session\n");
else
{
// Clear cuesheet
2013-12-19 17:10:14 +00:00
image.remaining_tracks = image.tracks;
///////////////////////////////////////////////////////////////// Loop tracks
2013-12-19 17:10:14 +00:00
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);
2013-12-19 17:10:14 +00:00
// Show info
#if 0
2013-12-19 17:10:14 +00:00
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);
2013-12-19 17:10:14 +00:00
printf("Pregap: %-3ld ",track.pregap_length);
printf("Size: %-6ld ",track.length);
printf("LBA: %-6ld ",track.start_lba);
#endif
2013-12-19 17:10:14 +00:00
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);
2013-12-19 17:10:14 +00:00
rv->tracks.push_back(t);
//printf("\n");
2013-12-19 17:10:14 +00:00
// if (track.pregap_length != 150) printf("Warning! This track seems to have a non-standard pregap...\n");
if (track.length < 0)
printf( "Negative track size found\n"
"You must extract image with /pregap option");
//if (!opts.showinfo)
{
if (track.total_length < track.length + track.pregap_length)
{
printf("\nThis track seems truncated. Skipping...\n");
core_fseek(fsource, track.position, SEEK_SET);
core_fseek(fsource, track.total_length, SEEK_CUR);
track.position = core_ftell(fsource);
2013-12-19 17:10:14 +00:00
}
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);
2013-12-19 17:10:14 +00:00
//savetrack(fsource, &image, &track, &opts, &flags);
track.position = core_ftell(fsource);
2013-12-19 17:10:14 +00:00
rv->EndFAD=track.start_lba +track.total_length;
// Generate cuesheet entries
2013-12-19 17:10:14 +00:00
//if (flags.create_cuesheet && !(track.mode == 2 && flags.do_convert)) // Do not generate input if converted (obsolete)
2013-12-19 17:10:14 +00:00
// savecuesheet(fcuesheet, &image, &track, &opts, &flags);
}
}
core_fseek(fsource, image.header_position, SEEK_SET);
2013-12-19 17:10:14 +00:00
// Close loops
2013-12-19 17:10:14 +00:00
image.remaining_tracks--;
}
//if (flags.create_cuesheet) fclose(fcuesheet);
}
CDI_skip_next_session (fsource, &image);
image.remaining_sessions--;
}
core_fclose(fsource);
2013-12-19 17:10:14 +00:00
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