Exemplo n.º 1
0
static void load_symbols(bool is_dummy)
{
   if (is_dummy)
   {
      SYM_DUMMY(retro_init);
      SYM_DUMMY(retro_deinit);

      SYM_DUMMY(retro_api_version);
      SYM_DUMMY(retro_get_system_info);
      SYM_DUMMY(retro_get_system_av_info);

      SYM_DUMMY(retro_set_environment);
      SYM_DUMMY(retro_set_video_refresh);
      SYM_DUMMY(retro_set_audio_sample);
      SYM_DUMMY(retro_set_audio_sample_batch);
      SYM_DUMMY(retro_set_input_poll);
      SYM_DUMMY(retro_set_input_state);

      SYM_DUMMY(retro_set_controller_port_device);

      SYM_DUMMY(retro_reset);
      SYM_DUMMY(retro_run);

      SYM_DUMMY(retro_serialize_size);
      SYM_DUMMY(retro_serialize);
      SYM_DUMMY(retro_unserialize);

      SYM_DUMMY(retro_cheat_reset);
      SYM_DUMMY(retro_cheat_set);

      SYM_DUMMY(retro_load_game);
      SYM_DUMMY(retro_load_game_special);

      SYM_DUMMY(retro_unload_game);
      SYM_DUMMY(retro_get_region);
      SYM_DUMMY(retro_get_memory_data);
      SYM_DUMMY(retro_get_memory_size);
   }
   else
   {
#ifdef HAVE_DYNAMIC
      if (path_is_directory(g_settings.libretro))
      {
         char libretro_core_buffer[PATH_MAX];
         if (!find_first_libretro(libretro_core_buffer, sizeof(libretro_core_buffer),
                  g_settings.libretro, g_extern.fullpath))
         {
            RARCH_ERR("libretro_path is a directory, but no valid libretro implementation was found.\n");
            rarch_fail(1, "load_dynamic()");
         }

         strlcpy(g_settings.libretro, libretro_core_buffer, sizeof(g_settings.libretro));
      }

      // Need to use absolute path for this setting. It can be saved to ROM history,
      // and a relative path would break in that scenario.
      path_resolve_realpath(g_settings.libretro, sizeof(g_settings.libretro));

      RARCH_LOG("Loading dynamic libretro from: \"%s\"\n", g_settings.libretro);
      lib_handle = dylib_load(g_settings.libretro);
      if (!lib_handle)
      {
         RARCH_ERR("Failed to open dynamic library: \"%s\"\n", g_settings.libretro);
         rarch_fail(1, "load_dynamic()");
      }
#endif

      SYM(retro_init);
      SYM(retro_deinit);

      SYM(retro_api_version);
      SYM(retro_get_system_info);
      SYM(retro_get_system_av_info);

      SYM(retro_set_environment);
      SYM(retro_set_video_refresh);
      SYM(retro_set_audio_sample);
      SYM(retro_set_audio_sample_batch);
      SYM(retro_set_input_poll);
      SYM(retro_set_input_state);

      SYM(retro_set_controller_port_device);

      SYM(retro_reset);
      SYM(retro_run);

      SYM(retro_serialize_size);
      SYM(retro_serialize);
      SYM(retro_unserialize);

      SYM(retro_cheat_reset);
      SYM(retro_cheat_set);

      SYM(retro_load_game);
      SYM(retro_load_game_special);

      SYM(retro_unload_game);
      SYM(retro_get_region);
      SYM(retro_get_memory_data);
      SYM(retro_get_memory_size);
   }
}
Exemplo n.º 2
0
/**
 * load_symbols:
 * @type                        : Type of core to be loaded.
 *                                If CORE_TYPE_DUMMY, will 
 *                                load dummy symbols.
 *
 * Setup libretro callback symbols.
 **/
static void load_symbols(enum rarch_core_type type)
{
   switch (type)
   {
      case CORE_TYPE_PLAIN:
         {
#ifdef HAVE_DYNAMIC
            settings_t *settings = config_get_ptr();
            function_t sym       = dylib_proc(NULL, "retro_init");

            if (sym)
            {
               /* Try to verify that -lretro was not linked in from other modules
                * since loading it dynamically and with -l will fail hard. */
               RARCH_ERR("Serious problem. RetroArch wants to load libretro cores dyamically, but it is already linked.\n");
               RARCH_ERR("This could happen if other modules RetroArch depends on link against libretro directly.\n");
               RARCH_ERR("Proceeding could cause a crash. Aborting ...\n");
               rarch_fail(1, "init_libretro_sym()");
            }

            if (!*settings->libretro)
            {
               RARCH_ERR("RetroArch is built for dynamic libretro cores, but libretro_path is not set. Cannot continue.\n");
               rarch_fail(1, "init_libretro_sym()");
            }

            /* Need to use absolute path for this setting. It can be 
             * saved to content history, and a relative path would 
             * break in that scenario. */
            path_resolve_realpath(settings->libretro,
                  sizeof(settings->libretro));

            RARCH_LOG("Loading dynamic libretro core from: \"%s\"\n",
                  settings->libretro);
            lib_handle = dylib_load(settings->libretro);
            if (!lib_handle)
            {
               RARCH_ERR("Failed to open libretro core: \"%s\"\n",
                     settings->libretro);
               rarch_fail(1, "load_dynamic()");
            }
#endif
         }

         SYM(retro_init);
         SYM(retro_deinit);

         SYM(retro_api_version);
         SYM(retro_get_system_info);
         SYM(retro_get_system_av_info);

         SYM(retro_set_environment);
         SYM(retro_set_video_refresh);
         SYM(retro_set_audio_sample);
         SYM(retro_set_audio_sample_batch);
         SYM(retro_set_input_poll);
         SYM(retro_set_input_state);

         SYM(retro_set_controller_port_device);

         SYM(retro_reset);
         SYM(retro_run);

         SYM(retro_serialize_size);
         SYM(retro_serialize);
         SYM(retro_unserialize);

         SYM(retro_cheat_reset);
         SYM(retro_cheat_set);

         SYM(retro_load_game);
         SYM(retro_load_game_special);

         SYM(retro_unload_game);
         SYM(retro_get_region);
         SYM(retro_get_memory_data);
         SYM(retro_get_memory_size);
         break;
      case CORE_TYPE_DUMMY:
         SYM_DUMMY(retro_init);
         SYM_DUMMY(retro_deinit);

         SYM_DUMMY(retro_api_version);
         SYM_DUMMY(retro_get_system_info);
         SYM_DUMMY(retro_get_system_av_info);

         SYM_DUMMY(retro_set_environment);
         SYM_DUMMY(retro_set_video_refresh);
         SYM_DUMMY(retro_set_audio_sample);
         SYM_DUMMY(retro_set_audio_sample_batch);
         SYM_DUMMY(retro_set_input_poll);
         SYM_DUMMY(retro_set_input_state);

         SYM_DUMMY(retro_set_controller_port_device);

         SYM_DUMMY(retro_reset);
         SYM_DUMMY(retro_run);

         SYM_DUMMY(retro_serialize_size);
         SYM_DUMMY(retro_serialize);
         SYM_DUMMY(retro_unserialize);

         SYM_DUMMY(retro_cheat_reset);
         SYM_DUMMY(retro_cheat_set);

         SYM_DUMMY(retro_load_game);
         SYM_DUMMY(retro_load_game_special);

         SYM_DUMMY(retro_unload_game);
         SYM_DUMMY(retro_get_region);
         SYM_DUMMY(retro_get_memory_data);
         SYM_DUMMY(retro_get_memory_size);
         break;
#ifdef HAVE_FFMPEG
      case CORE_TYPE_FFMPEG:
         SYM_FFMPEG(retro_init);
         SYM_FFMPEG(retro_deinit);

         SYM_FFMPEG(retro_api_version);
         SYM_FFMPEG(retro_get_system_info);
         SYM_FFMPEG(retro_get_system_av_info);

         SYM_FFMPEG(retro_set_environment);
         SYM_FFMPEG(retro_set_video_refresh);
         SYM_FFMPEG(retro_set_audio_sample);
         SYM_FFMPEG(retro_set_audio_sample_batch);
         SYM_FFMPEG(retro_set_input_poll);
         SYM_FFMPEG(retro_set_input_state);

         SYM_FFMPEG(retro_set_controller_port_device);

         SYM_FFMPEG(retro_reset);
         SYM_FFMPEG(retro_run);

         SYM_FFMPEG(retro_serialize_size);
         SYM_FFMPEG(retro_serialize);
         SYM_FFMPEG(retro_unserialize);

         SYM_FFMPEG(retro_cheat_reset);
         SYM_FFMPEG(retro_cheat_set);

         SYM_FFMPEG(retro_load_game);
         SYM_FFMPEG(retro_load_game_special);

         SYM_FFMPEG(retro_unload_game);
         SYM_FFMPEG(retro_get_region);
         SYM_FFMPEG(retro_get_memory_data);
         SYM_FFMPEG(retro_get_memory_size);
         break;
#endif
      case CORE_TYPE_IMAGEVIEWER:
#ifdef HAVE_IMAGEVIEWER
         SYM_IMAGEVIEWER(retro_init);
         SYM_IMAGEVIEWER(retro_deinit);

         SYM_IMAGEVIEWER(retro_api_version);
         SYM_IMAGEVIEWER(retro_get_system_info);
         SYM_IMAGEVIEWER(retro_get_system_av_info);

         SYM_IMAGEVIEWER(retro_set_environment);
         SYM_IMAGEVIEWER(retro_set_video_refresh);
         SYM_IMAGEVIEWER(retro_set_audio_sample);
         SYM_IMAGEVIEWER(retro_set_audio_sample_batch);
         SYM_IMAGEVIEWER(retro_set_input_poll);
         SYM_IMAGEVIEWER(retro_set_input_state);

         SYM_IMAGEVIEWER(retro_set_controller_port_device);

         SYM_IMAGEVIEWER(retro_reset);
         SYM_IMAGEVIEWER(retro_run);

         SYM_IMAGEVIEWER(retro_serialize_size);
         SYM_IMAGEVIEWER(retro_serialize);
         SYM_IMAGEVIEWER(retro_unserialize);

         SYM_IMAGEVIEWER(retro_cheat_reset);
         SYM_IMAGEVIEWER(retro_cheat_set);

         SYM_IMAGEVIEWER(retro_load_game);
         SYM_IMAGEVIEWER(retro_load_game_special);

         SYM_IMAGEVIEWER(retro_unload_game);
         SYM_IMAGEVIEWER(retro_get_region);
         SYM_IMAGEVIEWER(retro_get_memory_data);
         SYM_IMAGEVIEWER(retro_get_memory_size);
#endif
         break;
   }
}