pandora: fix readme and pxml version
[picodrive.git] / pico / cd / cd_image.c
index 07b55ce..582b3e3 100644 (file)
@@ -9,7 +9,11 @@
 #include "../pico_int.h"
 #include "genplus_macros.h"
 #include "cdd.h"
 #include "../pico_int.h"
 #include "genplus_macros.h"
 #include "cdd.h"
-#include "cue.h"
+#include "cd_parse.h"
+
+#if defined(__GNUC__) && __GNUC__ >= 7
+#pragma GCC diagnostic ignored "-Wformat-truncation"
+#endif
 
 static int handle_mp3(const char *fname, int index)
 {
 
 static int handle_mp3(const char *fname, int index)
 {
@@ -45,6 +49,7 @@ static int handle_mp3(const char *fname, int index)
     return -1;
   }
 
     return -1;
   }
 
+  track->type = CT_MP3;
   track->fd = tmp_file;
   track->offset = 0;
 
   track->fd = tmp_file;
   track->offset = 0;
 
@@ -61,6 +66,7 @@ static void to_upper(char *d, const char *s)
     else
       *d = *s;
   }
     else
       *d = *s;
   }
+  *d = 0;
 }
 
 // cdd.c uses lba - 150
 }
 
 // cdd.c uses lba - 150
@@ -81,33 +87,37 @@ int load_cd_image(const char *cd_img_name, int *type)
   int iso_name_len, missed, cd_img_sectors;
   char tmp_name[256], tmp_ext[10], tmp_ext_u[10];
   track_t *tracks = cdd.toc.tracks;
   int iso_name_len, missed, cd_img_sectors;
   char tmp_name[256], tmp_ext[10], tmp_ext_u[10];
   track_t *tracks = cdd.toc.tracks;
-  cue_data_t *cue_data = NULL;
+  cd_data_t *cue_data = NULL;
   pm_file *pmf;
 
   if (PicoCDLoadProgressCB != NULL)
     PicoCDLoadProgressCB(cd_img_name, 1);
 
   pm_file *pmf;
 
   if (PicoCDLoadProgressCB != NULL)
     PicoCDLoadProgressCB(cd_img_name, 1);
 
-  Pico_mcd->cdda_type = CT_UNKNOWN;
-
   /* is this a .cue? */
   cue_data = cue_parse(cd_img_name);
   if (cue_data != NULL) {
     cd_img_name = cue_data->tracks[1].fname;
     *type = cue_data->tracks[1].type;
   /* is this a .cue? */
   cue_data = cue_parse(cd_img_name);
   if (cue_data != NULL) {
     cd_img_name = cue_data->tracks[1].fname;
     *type = cue_data->tracks[1].type;
+  } else {
+    cue_data = chd_parse(cd_img_name);
+    if (cue_data != NULL)
+      *type = cue_data->tracks[1].type;
   }
 
   pmf = pm_open(cd_img_name);
   if (pmf == NULL)
   {
     if (cue_data != NULL)
   }
 
   pmf = pm_open(cd_img_name);
   if (pmf == NULL)
   {
     if (cue_data != NULL)
-      cue_destroy(cue_data);
+      cdparse_destroy(cue_data);
     return -1;
   }
   tracks[0].fd = pmf;
     return -1;
   }
   tracks[0].fd = pmf;
+  tracks[0].fname = strdup(cd_img_name);
+  tracks[0].type = *type;
 
   if (*type == CT_ISO)
 
   if (*type == CT_ISO)
-       cd_img_sectors = pmf->size >>= 11;  // size in sectors
-  else cd_img_sectors = pmf->size /= 2352;
+       cd_img_sectors = pmf->size >> 11;  // size in sectors
+  else cd_img_sectors = pmf->size / 2352;
 
   // cdd.c operates with lba - 150
   tracks[0].start = 0;
 
   // cdd.c operates with lba - 150
   tracks[0].start = 0;
@@ -115,14 +125,14 @@ int load_cd_image(const char *cd_img_name, int *type)
   tracks[0].offset = 0;
 
   sprintf_lba(tmp_ext, sizeof(tmp_ext), 0);
   tracks[0].offset = 0;
 
   sprintf_lba(tmp_ext, sizeof(tmp_ext), 0);
-  elprintf(EL_STATUS, "Track  1: %s %9i DATA  %s",
-    tmp_ext, tracks[0].end, cd_img_name);
+  elprintf(EL_STATUS, "Track  1: %s %9i %s %s",
+    tmp_ext, tracks[0].end, tracks[0].type ? "AUDIO" : "DATA ", cd_img_name);
 
   lba = cd_img_sectors;
 
   if (cue_data != NULL)
   {
 
   lba = cd_img_sectors;
 
   if (cue_data != NULL)
   {
-    if (cue_data->tracks[2].fname == NULL) {
+    if (cue_data->track_count > 1 && cue_data->tracks[2].fname == NULL) {
       // NULL fname means track2 is in same file as track1
       lba = tracks[0].end = cue_data->tracks[2].sector_offset;
     }
       // NULL fname means track2 is in same file as track1
       lba = tracks[0].end = cue_data->tracks[2].sector_offset;
     }
@@ -148,6 +158,7 @@ int load_cd_image(const char *cd_img_name, int *type)
         {
           // assume raw, ignore header for wav..
           tracks[index].fd = f;
         {
           // assume raw, ignore header for wav..
           tracks[index].fd = f;
+          tracks[index].fname = strdup(cue_data->tracks[n].fname);
           tracks[index].offset = cue_data->tracks[n].sector_offset;
           length = f->size / 2352;
         }
           tracks[index].offset = cue_data->tracks[n].sector_offset;
           length = f->size / 2352;
         }
@@ -173,15 +184,25 @@ int load_cd_image(const char *cd_img_name, int *type)
         // overriden by custom cue command
         length = cue_data->tracks[n].sector_xlength;
 
         // overriden by custom cue command
         length = cue_data->tracks[n].sector_xlength;
 
-      Pico_mcd->cdda_type = cue_data->tracks[n].type;
+      tracks[index].type = cue_data->tracks[n].type;
 
       tracks[index].start = lba;
       lba += length;
       tracks[index].end = lba;
 
 
       tracks[index].start = lba;
       lba += length;
       tracks[index].end = lba;
 
+      // weird MEGASD cue file extensions
+      tracks[index].loop = cue_data->tracks[n].loop;
+      tracks[index].loop_lba = cue_data->tracks[n].loop_lba;
+
       sprintf_lba(tmp_ext, sizeof(tmp_ext), tracks[index].start);
       sprintf_lba(tmp_ext, sizeof(tmp_ext), tracks[index].start);
-      elprintf(EL_STATUS, "Track %2i: %s %9i AUDIO %s",
-        n, tmp_ext, length, cue_data->tracks[n].fname);
+      elprintf(EL_STATUS, "Track %2i: %s %9i %s %s", n, tmp_ext, length,
+          tracks[index].type ? "AUDIO" : "DATA ",
+          cue_data->tracks[n].fname ? cue_data->tracks[n].fname : "");
+
+      if (tracks[index].end > 99*60*75-151) {
+        tracks[index].end = 99*60*75-151;
+        break;
+      }
     }
     goto finish;
   }
     }
     goto finish;
   }
@@ -234,7 +255,7 @@ int load_cd_image(const char *cd_img_name, int *type)
         lba += length;
         tracks[index].end = lba;
 
         lba += length;
         tracks[index].end = lba;
 
-        Pico_mcd->cdda_type = CT_MP3;
+        tracks[index].type = CT_MP3;
 
         sprintf_lba(tmp_ext, sizeof(tmp_ext), tracks[index].start);
         elprintf(EL_STATUS, "Track %2i: %s %9i AUDIO - %s",
 
         sprintf_lba(tmp_ext, sizeof(tmp_ext), tracks[index].start);
         elprintf(EL_STATUS, "Track %2i: %s %9i AUDIO - %s",
@@ -247,11 +268,16 @@ int load_cd_image(const char *cd_img_name, int *type)
     }
     if (ret <= 0 && i > 1)
       missed++;
     }
     if (ret <= 0 && i > 1)
       missed++;
+    else if (tracks[index].end > 99*60*75-151) {
+      tracks[index].end = 99*60*75-151;
+      break;
+    }
   }
 
 finish:
   cdd.toc.last = n - 1;
   cdd.toc.end = lba;
   }
 
 finish:
   cdd.toc.last = n - 1;
   cdd.toc.end = lba;
+  tracks[n].start = cdd.toc.end;
 
   sprintf_lba(tmp_ext, sizeof(tmp_ext), cdd.toc.end);
   elprintf(EL_STATUS, "End CD -  %s\n", tmp_ext);
 
   sprintf_lba(tmp_ext, sizeof(tmp_ext), cdd.toc.end);
   elprintf(EL_STATUS, "End CD -  %s\n", tmp_ext);
@@ -260,7 +286,7 @@ finish:
     PicoCDLoadProgressCB(cd_img_name, 100);
 
   if (cue_data != NULL)
     PicoCDLoadProgressCB(cd_img_name, 100);
 
   if (cue_data != NULL)
-    cue_destroy(cue_data);
+    cdparse_destroy(cue_data);
 
   return 0;
 }
 
   return 0;
 }