Merge pull request #449 from cmitu/cdX-as-cue
authorAutechre <libretro@gmail.com>
Sat, 10 Oct 2020 22:50:54 +0000 (00:50 +0200)
committerGitHub <noreply@github.com>
Sat, 10 Oct 2020 22:50:54 +0000 (00:50 +0200)
cdriso: parse .cd<X> files as .cue

1  2 
libpcsxcore/cdriso.c

diff --combined libpcsxcore/cdriso.c
@@@ -477,7 -477,10 +477,10 @@@ static int parsecue(const char *isofile
        strncpy(cuename, isofile, sizeof(cuename));
        cuename[MAXPATHLEN - 1] = '\0';
        if (strlen(cuename) >= 4) {
-               strcpy(cuename + strlen(cuename) - 4, ".cue");
+               // If 'isofile' is a '.cd<X>' file, use it as a .cue file
+               //  and don't try to search the additional .cue file
+               if (strncasecmp(cuename + strlen(cuename) - 4, ".cd", 3) != 0 )
+                       strcpy(cuename + strlen(cuename) - 4, ".cue");
        }
        else {
                return -1;
                        file_len = ftell(ti[numtracks + 1].handle) / 2352;
  
                        if (numtracks == 0 && strlen(isofile) >= 4 &&
-                               strcmp(isofile + strlen(isofile) - 4, ".cue") == 0)
-                       {
-                               // user selected .cue as image file, use it's data track instead
+                               (strcmp(isofile + strlen(isofile) - 4, ".cue") == 0 ||
+                               strncasecmp(isofile + strlen(isofile) - 4, ".cd", 3) == 0)) {
+                               // user selected .cue/.cdX as image file, use it's data track instead
                                fclose(cdHandle);
                                cdHandle = fopen(filepath, "rb");
                        }
  
        fclose(fi);
  
+       // if there are no tracks detected, then it's not a cue file
+       if (!numtracks)
+               return -1;
        return 0;
  }
  
@@@ -1260,19 -1267,14 +1267,19 @@@ static void *readThreadMain(void *param
        last_read_sector = requested_sector_end;
      }
  
 +    index = ra_sector % SECTOR_BUFFER_SIZE;
 +
      // check for end of CD
      if (ra_count && ra_sector >= max_sector) {
        ra_count = 0;
 +      pthread_mutex_lock(&sectorbuffer_lock);
 +      sectorbuffer[index].ret = -1;
 +      sectorbuffer[index].sector = ra_sector;
 +      pthread_cond_signal(&sectorbuffer_cond);
 +      pthread_mutex_unlock(&sectorbuffer_lock);
      }
  
      if (ra_count) {
 -
 -      index = ra_sector % SECTOR_BUFFER_SIZE;
        pthread_mutex_lock(&sectorbuffer_lock);
        if (sectorbuffer[index].sector != ra_sector) {
          pthread_mutex_unlock(&sectorbuffer_lock);