CHD: Support for precache mode CD access method
authornegativeExponent <negativeExponent@users.noreply.github.com>
Wed, 4 Nov 2020 13:16:24 +0000 (21:16 +0800)
committernegativeExponent <negativeExponent@users.noreply.github.com>
Wed, 4 Nov 2020 13:38:12 +0000 (21:38 +0800)
https://github.com/libretro/pcsx_rearmed/issues/261

frontend/libretro.c
frontend/libretro_core_options.h
libpcsxcore/cdriso.c
libpcsxcore/psxcommon.h

index e18b190..5c966a4 100644 (file)
@@ -1744,9 +1744,20 @@ static void update_variables(bool in_flight)
    if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
    {
       if (strcmp(var.value, "async") == 0)
+      {
          Config.AsyncCD = 1;
-      else
+         Config.CHD_Precache = 0;
+      }
+      else if (strcmp(var.value, "sync") == 0)
+      {
          Config.AsyncCD = 0;
+         Config.CHD_Precache = 0;
+      }
+      else if (strcmp(var.value, "precache") == 0)
+      {
+         Config.AsyncCD = 0;
+         Config.CHD_Precache = 1;
+      }
    }
 #endif
 
index 3f589cc..21f6783 100644 (file)
@@ -935,10 +935,11 @@ struct retro_core_option_definition option_defs_us[] = {
    {
       "pcsx_rearmed_async_cd",
       "CD Access Method (Restart)",
-      "Select method used to read data from content disk images. 'Synchronous' mimics original hardware. 'Asynchronous' can reduce stuttering on devices with slow storage.",
+      "Select method used to read data from content disk images. 'Synchronous' mimics original hardware. 'Asynchronous' can reduce stuttering on devices with slow storage. 'Precache' loads disk image into memory for faster access (CHD only).",
       {
-         { "sync", "Synchronous" },
-         { "async",  "Asynchronous" },
+         { "sync",     "Synchronous" },
+         { "async",    "Asynchronous" },
+         { "precache", "Precache" },
          { NULL, NULL},
       },
       "sync",
index d8799db..9e70ddf 100644 (file)
@@ -1057,7 +1057,10 @@ static int handlechd(const char *isofile) {
                goto fail_io;
 
        if(chd_open(isofile, CHD_OPEN_READ, NULL, &chd_img->chd) != CHDERR_NONE)
-      goto fail_io;
+               goto fail_io;
+
+       if (Config.CHD_Precache && (chd_precache(chd_img->chd) != CHDERR_NONE))
+               goto fail_io;
 
    chd_img->header = chd_get_header(chd_img->chd);
 
index cb417d4..708d984 100644 (file)
@@ -121,6 +121,7 @@ typedef struct {
        boolean PsxAuto;
        boolean Cdda;
        boolean AsyncCD;
+       boolean CHD_Precache; /* loads disk image into memory, works with CHD only. */
        boolean HLE;
        boolean SlowBoot;
        boolean Debug;