Pass correct type for RETRO_ENVIRONMENT_SET_MESSAGE
[pcsx_rearmed.git] / frontend / libretro.c
index 9e73fc7..62f968a 100644 (file)
@@ -230,7 +230,25 @@ void out_register_libretro(struct out_driver *drv)
 }
 
 /* libretro */
-void retro_set_environment(retro_environment_t cb) { environ_cb = cb; }
+void retro_set_environment(retro_environment_t cb)
+{
+   static const struct retro_variable vars[] = {
+      { "frameskip", "Frameskip; 0|1|2|3" },
+      { "region", "Region; Auto|NTSC|PAL" },
+#ifdef __ARM_NEON__
+      { "neon_interlace_enable", "Enable interlacing mode(s); disabled|enabled" },
+#if 0
+      { "neon_enhancement_enable", "Enhanced resolution (slow); disabled|enabled" },
+#endif
+#endif
+      { NULL, NULL },
+   };
+
+   environ_cb = cb;
+
+   cb(RETRO_ENVIRONMENT_SET_VARIABLES, (void*)vars);
+}
+
 void retro_set_video_refresh(retro_video_refresh_t cb) { video_cb = cb; }
 void retro_set_audio_sample(retro_audio_sample_t cb) { (void)cb; }
 void retro_set_audio_sample_batch(retro_audio_sample_batch_t cb) { audio_batch_cb = cb; }
@@ -394,6 +412,7 @@ void retro_cheat_set(unsigned index, bool enabled, const char *code)
 /* multidisk support */
 static bool disk_ejected;
 static unsigned int disk_current_index;
+static unsigned int disk_count;
 static struct disks_state {
        char *fname;
        int internal_index; // for multidisk eboots
@@ -463,14 +482,7 @@ static bool disk_set_image_index(unsigned int index)
 
 static unsigned int disk_get_num_images(void)
 {
-       unsigned int count = 0;
-       size_t i;
-
-       for (i = 0; i < sizeof(disks) / sizeof(disks[0]); i++)
-               if (disks[i].fname != NULL)
-                       count++;
-
-       return count;
+       return disk_count;
 }
 
 static bool disk_replace_image_index(unsigned index,
@@ -500,7 +512,10 @@ static bool disk_replace_image_index(unsigned index,
 
 static bool disk_add_image_index(void)
 {
-       // TODO??
+       if (disk_count >= 8)
+               return false;
+
+       disk_count++;
        return true;
 }
 
@@ -527,12 +542,11 @@ static bool read_m3u(const char *file)
 {
        char line[PATH_MAX];
        char name[PATH_MAX];
-       size_t i = 0;
        FILE *f = fopen(file, "r");
        if (!f)
                return false;
 
-       while (fgets(line, sizeof(line), f) && i < sizeof(disks) / sizeof(disks[0])) {
+       while (fgets(line, sizeof(line), f) && disk_count < sizeof(disks) / sizeof(disks[0])) {
                if (line[0] == '#')
                        continue;
                char *carrige_return = strchr(line, '\r');
@@ -545,12 +559,12 @@ static bool read_m3u(const char *file)
                if (line[0] != '\0')
                {
                        snprintf(name, sizeof(name), "%s%c%s", base_dir, SLASH, line);
-                       disks[i++].fname = strdup(name);
+                       disks[disk_count++].fname = strdup(name);
                }
        }
 
        fclose(f);
-       return (i != 0);
+       return (disk_count != 0);
 }
 
 static void extract_directory(char *buf, const char *path, size_t size)
@@ -610,9 +624,10 @@ bool retro_load_game(const struct retro_game_info *info)
                        SysPrintf("failed to read m3u file\n");
                        return false;
                }
-       }
-       else
+       } else {
+               disk_count = 1;
                disks[0].fname = strdup(info->path);
+       }
 
        set_cd_image(disks[0].fname);
 
@@ -648,6 +663,7 @@ bool retro_load_game(const struct retro_game_info *info)
 
        // multidisk images
        if (!is_m3u) {
+               disk_count = cdrIsoMultidiskCount < 8 ? cdrIsoMultidiskCount : 8;
                for (i = 1; i < sizeof(disks) / sizeof(disks[0]) && i < cdrIsoMultidiskCount; i++) {
                        disks[i].fname = strdup(info->path);
                        disks[i].internal_index = i;
@@ -712,11 +728,66 @@ static const unsigned short retro_psx_map[] = {
 };
 #define RETRO_PSX_MAP_LEN (sizeof(retro_psx_map) / sizeof(retro_psx_map[0]))
 
+static void update_variables(void)
+{
+   struct retro_variable var;
+   
+   var.value = NULL;
+   var.key = "frameskip";
+
+   if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) || var.value)
+      pl_rearmed_cbs.frameskip = atoi(var.value);
+
+   var.value = NULL;
+   var.key = "region";
+
+   if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) || var.value)
+   {
+      Config.PsxAuto = 0;
+      if (strcmp(var.value, "Automatic") == 0)
+         Config.PsxAuto = 1;
+      else if (strcmp(var.value, "NTSC") == 0)
+         Config.PsxType = 0;
+      else if (strcmp(var.value, "PAL") == 0)
+         Config.PsxType = 1;
+   }
+#ifdef __ARM_NEON__
+   var.value = "NULL";
+   var.key = "neon_interlace_enable";
+
+   if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) || var.value)
+   {
+      if (strcmp(var.value, "disabled") == 0)
+         pl_rearmed_cbs.gpu_neon.allow_interlace = 0;
+      else if (strcmp(var.value, "enabled") == 0)
+         pl_rearmed_cbs.gpu_neon.allow_interlace = 1;
+   }
+
+#if 0
+   var.value = NULL;
+   var.key = "neon_enhancement_enable";
+
+   if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) || var.value)
+   {
+      if (strcmp(var.value, "disabled") == 0)
+         pl_rearmed_cbs.gpu_neon.enhancement_enable = 0;
+      else if (strcmp(var.value, "enabled") == 0)
+         pl_rearmed_cbs.gpu_neon.enhancement_enable = 1;
+   }
+#endif
+#endif
+}
+
 void retro_run(void) 
 {
        int i;
 
        input_poll_cb();
+
+   bool updated = false;
+   if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE_UPDATE, &updated) && updated)
+      update_variables();
+
        in_keystate = 0;
        for (i = 0; i < RETRO_PSX_MAP_LEN; i++)
                if (input_state_cb(1, RETRO_DEVICE_JOYPAD, 0, i))
@@ -771,7 +842,15 @@ void retro_init(void)
                fclose(f);
        }
        else
+   {
                SysPrintf("no BIOS files found.\n");
+      struct retro_message msg = 
+      {
+         "no BIOS found, expect bugs!",
+         180
+      };
+      environ_cb(RETRO_ENVIRONMENT_SET_MESSAGE, (void*)&msg);
+   }
 
        level = 1;
        environ_cb(RETRO_ENVIRONMENT_SET_PERFORMANCE_LEVEL, &level);
@@ -797,6 +876,8 @@ void retro_init(void)
        SaveFuncs.write = save_write;
        SaveFuncs.seek = save_seek;
        SaveFuncs.close = save_close;
+
+   update_variables();
 }
 
 void retro_deinit(void)