int CDIF_FindTrackByLBA(uint32 LBA) { for(track_t track = CD_Info.FirstTrack; track < CD_Info.FirstTrack + CD_Info.NumTracks; track++) { if(LBA >= CD_Info.Tracks[track].LSN && LBA < (CD_Info.Tracks[track].LSN + cdrfile_get_track_sec_count(p_cdrfile, track))) { return(track); } } return(0); }
uint32 CDIF_GetTrackStartPositionLBA(int32 track) { if(track == (CD_Info.FirstTrack + CD_Info.NumTracks)) // Leadout track. { uint32 lba = CD_Info.Tracks[track - 1].LSN + cdrfile_get_track_sec_count(p_cdrfile, track - 1); //printf("GTSPLBA Leadout: %d\n", lba); return(lba); } else if(track < CD_Info.FirstTrack || track >= (CD_Info.FirstTrack + CD_Info.NumTracks)) return(0); return(CD_Info.Tracks[track].LSN); }
bool CDIF_GetTrackStartPositionMSF(int32 track, int &min, int &sec, int &frame) { uint32 lba; if(track == (CD_Info.FirstTrack + CD_Info.NumTracks)) // Leadout track. { lba = CD_Info.Tracks[track - 1].LSN + cdrfile_get_track_sec_count(p_cdrfile, track - 1); //printf("GTSPMSF Leadout: %d\n", lba); } else if(track < CD_Info.FirstTrack || track >= (CD_Info.FirstTrack + CD_Info.NumTracks)) return(0); else lba = CD_Info.Tracks[track].LSN; lba += 150; min = (uint8)(lba / 75 / 60); sec = (uint8)((lba - min * 75 * 60) / 75); frame = (uint8)(lba - (min * 75 * 60) - (sec * 75)); return(1); }
uint32 CDIF_GetTrackSectorCount(int32 track) { return(cdrfile_get_track_sec_count(p_cdrfile, track)); }
static void DumpCUEISOWAV(void) { FILE *cuep = fopen("cd.cue", "wb"); for(int track = CDIF_GetFirstTrack(); track <= CDIF_GetLastTrack(); track++) { CDIF_Track_Format format; uint32 sectors; sectors = cdrfile_get_track_sec_count(p_cdrfile, track); CDIF_GetTrackFormat(track, format); if(format == CDIF_FORMAT_AUDIO) { char buf[256]; sprintf(buf, "%d.wav", track); static SNDFILE *sfp; SF_INFO slinfo; memset(&slinfo, 0, sizeof(SF_INFO)); fprintf(cuep, "FILE \"%s\" WAVE\n", buf); fprintf(cuep, " TRACK %02d AUDIO\n", track); fprintf(cuep, " INDEX 01 00:00:00\n"); slinfo.samplerate = 44100; slinfo.channels = 2; slinfo.format = SF_FORMAT_WAV | SF_FORMAT_PCM_16; sfp = sf_open(buf, SFM_WRITE, &slinfo); for(uint32 i = 0; i < sectors; i++) { uint8 secbuf[2352]; CDIF_ReadAudioSector((int16*)secbuf, NULL, CDIF_GetTrackStartPositionLBA(track) + i); sf_writef_short(sfp, (int16*)secbuf, 2352 / 4); } sf_close(sfp); } else { char buf[256]; sprintf(buf, "%d.iso", track); FILE *fp = fopen(buf, "wb"); fprintf(cuep, "FILE \"%s\" BINARY\n", buf); fprintf(cuep, " TRACK %02d MODE1/2048\n", track); fprintf(cuep, " INDEX 01 00:00:00\n"); for(uint32 i = 0; i < sectors; i++) { uint8 secbuf[2048]; CDIF_ReadSector(secbuf, NULL, CDIF_GetTrackStartPositionLBA(track) + i, 1); fwrite(secbuf, 1, 2048, fp); } fclose(fp); } } fclose(cuep); }