Disc* cdi_parse(wchar* file) { FILE* fsource=fopen(file,"rb"); if (!fsource) return 0; Disc* rv= new Disc(); image_s image = { 0 }; track_s track = { 0 }; CDI_init(fsource,&image,0); CDI_get_sessions(fsource,&image); image.remaining_sessions = image.sessions; /////////////////////////////////////////////////////////////// Bucle 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 = ftell(fsource); printf("\nSession %d has %d track(s)\n",image.global_current_session,image.tracks); if (image.tracks == 0) printf("Open session\n"); else { // Crear cuesheet image.remaining_tracks = image.tracks; ///////////////////////////////////////////////////////////////// Bucle 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 = ftell(fsource); // Mostrar info 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("%d ",track.sector_size); printf("Pregap: %-3ld ",track.pregap_length); printf("Size: %-6ld ",track.length); printf("LBA: %-6ld ",track.start_lba); 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(fopen(file,"rb"),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) 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"); fseek(fsource, track.position, SEEK_SET); fseek(fsource, track.total_length, SEEK_CUR); track.position = ftell(fsource); } else { printf("Track position: %d\n",track.position + track.pregap_length * track.sector_size); 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); fseek(fsource, track.total_length * track.sector_size, SEEK_CUR); //savetrack(fsource, &image, &track, &opts, &flags); track.position = ftell(fsource); rv->EndFAD=track.start_lba +track.total_length; // Generar entradas de cuesheet //if (flags.create_cuesheet && !(track.mode == 2 && flags.do_convert)) // No generar entrada si convertimos (obsoleto) // savecuesheet(fcuesheet, &image, &track, &opts, &flags); } } fseek(fsource, image.header_position, SEEK_SET); // Cerrar bucles image.remaining_tracks--; } //if (flags.create_cuesheet) fclose(fcuesheet); } CDI_skip_next_session (fsource, &image); image.remaining_sessions--; } rv->type=GuessDiscType(CD_M1,CD_M2,CD_DA); rv->LeadOut.StartFAD=rv->EndFAD; rv->LeadOut.ADDR=0; rv->LeadOut.CTRL=0; return rv; }
CDIDisc(SPfcToc* pstToc,const wchar* file) { printf("\n--CDI toc info start--\n"); printf("Last Sector : %d\n",pstToc->dwOuterLeadOut); printf("Session count : %d\n",pstToc->dwSessionCount); u32 last_FAD=0; u32 TrackOffset=0; bool CD_M1=false,CD_M2=false,CD_DA=false; u32 ses_count=0; u32 track=0; for (u32 s=0;s<pstToc->dwSessionCount;s++) { printf("Session %d:\n",s); SPfcSession* ses=&pstToc->pstSession[s]; if (ses->bType==4 && ses->dwTrackCount==0) { printf("Detected open disc\n"); continue; } ses_count++; printf(" Track Count: %d\n",ses->dwTrackCount); for (u32 t=0;t< ses->dwTrackCount ;t++) { SPfcTrack* cdi_track=&ses->pstTrack[t]; //pre gap last_FAD +=cdi_track->pdwIndex[0]; TrackOffset +=cdi_track->pdwIndex[0]*cdi_track->dwBlockSize; if (t==0) { Session s; s.StartFAD=last_FAD; s.FirstTrack=track+1; sessions.push_back(s); printf(" Session start FAD: %d\n",last_FAD); } verify(cdi_track->dwIndexCount==2); printf(" track %d:\n",t); printf(" Type : %d\n",cdi_track->bMode); Track trk; if (cdi_track->bMode==2) CD_M2=true; if (cdi_track->bMode==1) CD_M1=true; if (cdi_track->bMode==0) CD_DA=true; trk.ADDR=1;//hmm is that ok ? trk.CTRL=cdi_track->bCtrl; trk.StartFAD=last_FAD; trk.EndFAD=0; trk.file = new RawTrackFile(_wfopen(file,L"rb"),TrackOffset,last_FAD,cdi_track->dwBlockSize); tracks.push_back(trk); printf(" Start FAD : %d\n",trk.StartFAD); //printf(" SectorSize : %d\n",Track[track].SectorSize); //printf(" File Offset : %d\n",Track[track].Offset); printf(" %d indexes \n",cdi_track->dwIndexCount); for (u32 i=0;i<cdi_track->dwIndexCount;i++) { printf(" index %d : %d\n",i,cdi_track->pdwIndex[i]); } //main track data TrackOffset+=(cdi_track->pdwIndex[1])*cdi_track->dwBlockSize; last_FAD+=cdi_track->pdwIndex[1]; track++; } last_FAD+=11400-150;///next session } type=GuessDiscType(CD_M1,CD_M2,CD_DA); this->EndFAD=pstToc->dwOuterLeadOut; LeadOut.StartFAD=pstToc->dwOuterLeadOut; LeadOut.ADDR=0; LeadOut.CTRL=0; printf("Disc Type = %d\n",type); printf("--CDI toc info end--\n\n"); }