X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=Pico%2Fcd%2Fcd_file.c;h=1fdbef64990e9d10a66ddf1709d11b97d405e86d;hb=1832075ec7b43b166a9d5f83753832a05e7d4239;hp=549aab9c9dba4056d66f080e56844bdc240ef6ea;hpb=9037e45d9f2752fdd6ebbc01328148839403a84f;p=picodrive.git diff --git a/Pico/cd/cd_file.c b/Pico/cd/cd_file.c index 549aab9..1fdbef6 100644 --- a/Pico/cd/cd_file.c +++ b/Pico/cd/cd_file.c @@ -105,7 +105,7 @@ PICO_INTERNAL int Load_CD_Image(const char *cd_img_name, cd_img_type type) Tracks[0].MSF.S = 2; // seconds Tracks[0].MSF.F = 0; // frames - elprintf(EL_STATUS, "Track 0: %02d:%02d:%02d %9i DATA", + elprintf(EL_STATUS, "Track 1: %02d:%02d:%02d %9i DATA", Tracks[0].MSF.M, Tracks[0].MSF.S, Tracks[0].MSF.F, Tracks[0].Length); Cur_LBA = Tracks[0].Length = cd_img_sectors; @@ -115,8 +115,10 @@ PICO_INTERNAL int Load_CD_Image(const char *cd_img_name, cd_img_type type) if (cue_data->tracks[2].fname == NULL) { // NULL means track2 is in same file as track1 Cur_LBA = Tracks[0].Length = cue_data->tracks[2].sector_offset; } + i = 100 / cue_data->track_count+1; for (num_track = 2; num_track <= cue_data->track_count; num_track++) { + if (PicoCDLoadProgressCB != NULL) PicoCDLoadProgressCB(i * num_track); index = num_track - 1; Cur_LBA += cue_data->tracks[num_track].pregap; if (cue_data->tracks[num_track].type == CT_MP3) { @@ -128,12 +130,24 @@ PICO_INTERNAL int Load_CD_Image(const char *cd_img_name, cd_img_type type) Tracks[index].ftype = cue_data->tracks[num_track].type; if (cue_data->tracks[num_track].fname != NULL) { - Tracks[index].F = fopen(cue_data->tracks[num_track].fname, "rb"); - elprintf(EL_STATUS, "track %2i (%s): can't determine length", - cue_data->tracks[num_track].fname); - Tracks[index].Length = 2*75; - Tracks[index].Offset = 0; - } else { + pm_file *pmfn = pm_open(cue_data->tracks[num_track].fname); + if (pmfn != NULL) + { + // addume raw, ignore header for wav.. + Tracks[index].F = pmfn; + Tracks[index].Length = pmfn->size / 2352; + Tracks[index].Offset = cue_data->tracks[num_track].sector_offset; + } + else + { + elprintf(EL_STATUS, "track %2i (%s): can't determine length", + num_track, cue_data->tracks[num_track].fname); + Tracks[index].Length = 2*75; + Tracks[index].Offset = 0; + } + } + else + { if (num_track < cue_data->track_count) Tracks[index].Length = cue_data->tracks[num_track+1].sector_offset - cue_data->tracks[num_track].sector_offset; @@ -143,10 +157,14 @@ PICO_INTERNAL int Load_CD_Image(const char *cd_img_name, cd_img_type type) } } + if (cue_data->tracks[num_track].sector_xlength != 0) + // overriden by custom cue command + Tracks[index].Length = cue_data->tracks[num_track].sector_xlength; + LBA_to_MSF(Cur_LBA, &Tracks[index].MSF); Cur_LBA += Tracks[index].Length; - elprintf(EL_STATUS, "Track %2i: %02d:%02d:%02d %9i AUDIO - %s", index, Tracks[index].MSF.M, + elprintf(EL_STATUS, "Track %2i: %02d:%02d:%02d %9i AUDIO - %s", num_track, Tracks[index].MSF.M, Tracks[index].MSF.S, Tracks[index].MSF.F, Tracks[index].Length, cue_data->tracks[num_track].fname); } @@ -154,7 +172,7 @@ PICO_INTERNAL int Load_CD_Image(const char *cd_img_name, cd_img_type type) goto finish; } - /* track autosearch, Gens-like */ + /* mp3 track autosearch, Gens-like */ iso_name_len = strlen(cd_img_name); if (iso_name_len >= sizeof(tmp_name)) iso_name_len = sizeof(tmp_name) - 1; @@ -186,7 +204,7 @@ PICO_INTERNAL int Load_CD_Image(const char *cd_img_name, cd_img_type type) LBA_to_MSF(Cur_LBA, &Tracks[index].MSF); Cur_LBA += Tracks[index].Length; - elprintf(EL_STATUS, "Track %2i: %02d:%02d:%02d %9i AUDIO - %s", index, Tracks[index].MSF.M, + elprintf(EL_STATUS, "Track %2i: %02d:%02d:%02d %9i AUDIO - %s", num_track, Tracks[index].MSF.M, Tracks[index].MSF.S, Tracks[index].MSF.F, Tracks[index].Length, tmp_name); num_track++; @@ -194,7 +212,7 @@ PICO_INTERNAL int Load_CD_Image(const char *cd_img_name, cd_img_type type) break; } } - if (ret != 0) missed++; + if (ret != 0 && i > 1) missed++; } finish: @@ -225,12 +243,14 @@ PICO_INTERNAL void Unload_ISO(void) { if (Pico_mcd->TOC.Tracks[i].F != NULL) { + if (Pico_mcd->TOC.Tracks[i].ftype == TYPE_MP3) #if DONT_OPEN_MANY_FILES - if (Pico_mcd->TOC.Tracks[i].type == TYPE_MP3) free(Pico_mcd->TOC.Tracks[i].F); - else -#endif +#else fclose(Pico_mcd->TOC.Tracks[i].F); +#endif + else + pm_close(Pico_mcd->TOC.Tracks[i].F); } } memset(Pico_mcd->TOC.Tracks, 0, sizeof(Pico_mcd->TOC.Tracks)); @@ -239,8 +259,6 @@ PICO_INTERNAL void Unload_ISO(void) PICO_INTERNAL int FILE_Read_One_LBA_CDC(void) { -// static char cp_buf[2560]; - if (Pico_mcd->s68k_regs[0x36] & 1) // DATA { if (Pico_mcd->TOC.Tracks[0].F == NULL) return -1; @@ -253,15 +271,6 @@ PICO_INTERNAL int FILE_Read_One_LBA_CDC(void) } else // AUDIO { - // int rate, channel; - - // if (Pico_mcd->TOC.Tracks[Pico_mcd->scd.Cur_Track - 1].ftype == TYPE_MP3) - { - // TODO - // MP3_Update(cp_buf, &rate, &channel, 0); - // Write_CD_Audio((short *) cp_buf, rate, channel, 588); - } - cdprintf("Read file CDC 1 audio sector :\n"); } @@ -324,7 +333,8 @@ PICO_INTERNAL int FILE_Read_One_LBA_CDC(void) { // CAUTION : lookahead bit not implemented - //memcpy(&Pico_mcd->cdc.Buffer[Pico_mcd->cdc.PT.N], cp_buf, 2352); + // this is pretty rough, but oh well - not much depends on this anyway + memcpy(&Pico_mcd->cdc.Buffer[Pico_mcd->cdc.PT.N], cdda_out_buffer, 2352); } } } @@ -362,34 +372,3 @@ PICO_INTERNAL int FILE_Read_One_LBA_CDC(void) return 0; } - -PICO_INTERNAL int FILE_Play_CD_LBA(void) -{ - int index = Pico_mcd->scd.Cur_Track - 1; - Pico_mcd->m.audio_track = index; - - cdprintf("Play track #%i", Pico_mcd->scd.Cur_Track); - - if (Pico_mcd->TOC.Tracks[index].F == NULL) - { - return 1; - } - - if (Pico_mcd->TOC.Tracks[index].ftype == TYPE_MP3) - { - int pos1024 = 0; - int Track_LBA_Pos = Pico_mcd->scd.Cur_LBA - Track_to_LBA(Pico_mcd->scd.Cur_Track); - if (Track_LBA_Pos < 0) Track_LBA_Pos = 0; - if (Track_LBA_Pos) - pos1024 = Track_LBA_Pos * 1024 / Pico_mcd->TOC.Tracks[index].Length; - - mp3_start_play(Pico_mcd->TOC.Tracks[index].F, pos1024); - } - else - { - return 3; - } - - return 0; -} -