From 315d1620b35896aa7b78c5dbea8e16fcc33090bd Mon Sep 17 00:00:00 2001 From: Ilari Liusvaara Date: Sat, 5 Jan 2013 16:07:29 +0200 Subject: [PATCH] Move get_{audio,video}_rate() to rom type methods --- include/core/emucore.hpp | 4 --- include/interface/romtype.hpp | 6 +++++ src/core/bsnes-legacy.cpp | 60 +++++++++++++++++++++++-------------------- src/core/gambatte.cpp | 27 +++++++++---------- src/core/rom.cpp | 10 +++++--- src/interface/romtype.cpp | 13 ++++++++++ 6 files changed, 72 insertions(+), 48 deletions(-) diff --git a/include/core/emucore.hpp b/include/core/emucore.hpp index 5eee53a1..dd2a6edf 100644 --- a/include/core/emucore.hpp +++ b/include/core/emucore.hpp @@ -24,10 +24,6 @@ void do_basic_core_init(); std::set get_sram_set(); //Get region. core_region& core_get_region(); -//Get the current video rate. -std::pair get_video_rate(); -//Get the current audio rate. -std::pair get_audio_rate(); //Set preload settings. void set_preload_settings(); //Power the core. diff --git a/include/interface/romtype.hpp b/include/interface/romtype.hpp index 5d316a88..1ec70432 100644 --- a/include/interface/romtype.hpp +++ b/include/interface/romtype.hpp @@ -50,6 +50,8 @@ struct core_type_params core_romimage_info** images; //Terminate with NULL. core_setting_group* settings; bool (*set_region)(core_region& region); + std::pair (*video_rate)(); + std::pair (*audio_rate)(); }; struct core_region @@ -116,6 +118,8 @@ public: unsigned get_reset_support(); core_setting_group& get_settings(); bool set_region(core_region& region); + std::pair get_video_rate(); + std::pair get_audio_rate(); private: core_type(const core_type&); core_type& operator=(const core_type&); @@ -123,6 +127,8 @@ private: uint64_t rtc_subsec); controller_set (*_controllerconfig)(std::map& settings); bool (*_set_region)(core_region& region); + std::pair (*_video_rate)(); + std::pair (*_audio_rate)(); unsigned id; unsigned reset_support; std::string iname; diff --git a/src/core/bsnes-legacy.cpp b/src/core/bsnes-legacy.cpp index ea699f04..db8b81d9 100644 --- a/src/core/bsnes-legacy.cpp +++ b/src/core/bsnes-legacy.cpp @@ -63,6 +63,8 @@ namespace int16_t blanksound[1070] = {0}; int16_t soundbuf[8192] = {0}; size_t soundbuf_fill = 0; + bool last_hires = false; + bool last_interlace = false; uint64_t trace_counter; std::ofstream trace_output; bool trace_output_enable; @@ -649,27 +651,51 @@ namespace return true; } - + //Get the current video rate. + std::pair get_video_rate() + { + if(!internal_rom) + return std::make_pair(60, 1); + uint32_t div; + if(snes_get_region()) + div = last_interlace ? DURATION_PAL_FIELD : DURATION_PAL_FRAME; + else + div = last_interlace ? DURATION_NTSC_FIELD : DURATION_NTSC_FRAME; + return std::make_pair(get_snes_cpu_rate(), div); + } + + //Get the current audio rate. + std::pair get_audio_rate() + { + if(!internal_rom) + return std::make_pair(64081, 2); + return std::make_pair(get_snes_apu_rate(), static_cast(768)); + } + core_type_params _type_snes = { "snes", "SNES", 0, BSNES_RESET_LEVEL , load_rom_snes, _controllerconfig, "sfc;smc;swc;fig;ufo;sf2;gd3;gd7;dx2;mgd;mgh", NULL, _all_regions, snes_images, &bsnes_settings, - core_set_region + core_set_region, get_video_rate, get_audio_rate }; core_type_params _type_bsx = { "bsx", "BS-X (non-slotted)", 1, BSNES_RESET_LEVEL , load_rom_bsx, _controllerconfig, - "bs", "bsx.sfc", _ntsconly, bsx_images, &bsnes_settings, core_set_region + "bs", "bsx.sfc", _ntsconly, bsx_images, &bsnes_settings, core_set_region, get_video_rate, + get_audio_rate }; core_type_params _type_bsxslotted = { "bsxslotted", "BS-X (slotted)", 2, BSNES_RESET_LEVEL , load_rom_bsxslotted, _controllerconfig, - "bss", "bsxslotted.sfc", _ntsconly, bsxs_images, &bsnes_settings, core_set_region + "bss", "bsxslotted.sfc", _ntsconly, bsxs_images, &bsnes_settings, core_set_region, get_video_rate, + get_audio_rate }; core_type_params _type_sufamiturbo = { "sufamiturbo", "Sufami Turbo", 3, BSNES_RESET_LEVEL , load_rom_sufamiturbo, _controllerconfig, - "st", "sufamiturbo.sfc", _ntsconly, bsxs_images, &bsnes_settings, core_set_region + "st", "sufamiturbo.sfc", _ntsconly, bsxs_images, &bsnes_settings, core_set_region, get_video_rate, + get_audio_rate }; core_type_params _type_sgb = { "sgb", "Super Game Boy", 4, BSNES_RESET_LEVEL , load_rom_sgb, _controllerconfig, - "gb;dmg;sgb", "sgb.sfc", _all_regions, sgb_images, &bsnes_settings, core_set_region + "gb;dmg;sgb", "sgb.sfc", _all_regions, sgb_images, &bsnes_settings, core_set_region, get_video_rate, + get_audio_rate }; core_type type_snes(_type_snes); @@ -685,8 +711,6 @@ namespace core_sysregion sr6("sgb_ntsc", type_sgb, region_ntsc); core_sysregion sr7("sgb_pal", type_sgb, region_pal); - bool last_hires = false; - bool last_interlace = false; bool stepping_into_save; bool video_refresh_done; //Delay reset. @@ -1035,26 +1059,6 @@ void core_unload_cartridge() internal_rom = NULL; } -//Get the current video rate. -std::pair get_video_rate() -{ - if(!internal_rom) - return std::make_pair(60, 1); - uint32_t div; - if(snes_get_region()) - div = last_interlace ? DURATION_PAL_FIELD : DURATION_PAL_FRAME; - else - div = last_interlace ? DURATION_NTSC_FIELD : DURATION_NTSC_FRAME; - return std::make_pair(get_snes_cpu_rate(), div); -} - -//Get the current audio rate. -std::pair get_audio_rate() -{ - if(!internal_rom) - return std::make_pair(64081, 2); - return std::make_pair(get_snes_apu_rate(), static_cast(768)); -} std::map> save_sram() throw(std::bad_alloc) { diff --git a/src/core/gambatte.cpp b/src/core/gambatte.cpp index 9f009c07..a5923426 100644 --- a/src/core/gambatte.cpp +++ b/src/core/gambatte.cpp @@ -97,6 +97,17 @@ namespace }; } getinput; + std::pair get_video_rate() + { + return std::make_pair(262144, 4389); + } + + std::pair get_audio_rate() + { + return std::make_pair(32768, 1); + } + + const char* buttonnames[] = {"left", "right", "up", "down", "A", "B", "select", "start"}; void system_write(unsigned char* buffer, unsigned idx, unsigned ctrl, short x) throw() @@ -296,15 +307,15 @@ namespace core_type_params _type_dmg = { "dmg", "Game Boy", 1, 1, load_rom_dmg, _controllerconfig, "gb;dmg", NULL, - regions_gambatte, dmg_images, &gambatte_settings, core_set_region + regions_gambatte, dmg_images, &gambatte_settings, core_set_region, get_video_rate, get_audio_rate }; core_type_params _type_gbc = { "gbc", "Game Boy Color", 0, 1, load_rom_gbc, _controllerconfig, "gbc;cgb", NULL, - regions_gambatte, gbc_images, &gambatte_settings, core_set_region + regions_gambatte, gbc_images, &gambatte_settings, core_set_region, get_video_rate, get_audio_rate }; core_type_params _type_gbc_gba = { "gbc_gba", "Game Boy Color (GBA)", 2, 1, load_rom_gbc_gba, _controllerconfig, "", NULL, - regions_gambatte, gbca_images, &gambatte_settings, core_set_region + regions_gambatte, gbca_images, &gambatte_settings, core_set_region, get_video_rate, get_audio_rate }; core_type type_dmg(_type_dmg); core_type type_gbc(_type_gbc); @@ -337,16 +348,6 @@ core_region& core_get_region() return region_world; } -std::pair get_video_rate() -{ - return std::make_pair(262144, 4389); -} - -std::pair get_audio_rate() -{ - return std::make_pair(32768, 1); -} - void core_runtosave() { } diff --git a/src/core/rom.cpp b/src/core/rom.cpp index 8791356e..53e1d6c0 100644 --- a/src/core/rom.cpp +++ b/src/core/rom.cpp @@ -72,6 +72,9 @@ namespace return x; } + std::pair videorate_null() { return std::make_pair(60, 1); } + std::pair audiorate_null() { return std::make_pair(48000, 1); } + bool set_region_null(core_region& reg) { return true; @@ -94,7 +97,8 @@ namespace core_romimage_info* null_images[] = {NULL}; core_type_params _type_null = { "null", "(null)", 9999, 0, load_rom_null, null_controllerconfig, - "", NULL, null_regions, null_images, &null_settings, set_region_null + "", NULL, null_regions, null_images, &null_settings, set_region_null, + videorate_null, audiorate_null }; core_type type_null(_type_null); core_sysregion sysregion_null("null", type_null, null_region); @@ -363,8 +367,8 @@ void loaded_rom::load(std::map& settings, uint64_t rtc region = &core_get_region(); core_power(); } - auto nominal_fps = get_video_rate(); - auto nominal_hz = get_audio_rate(); + auto nominal_fps = rtype->get_video_rate(); + auto nominal_hz = rtype->get_audio_rate(); set_nominal_framerate(1.0 * nominal_fps.first / nominal_fps.second); information_dispatch::do_sound_rate(nominal_hz.first, nominal_hz.second); current_rom_type = rtype; diff --git a/src/interface/romtype.cpp b/src/interface/romtype.cpp index ad186b86..f7cfa0f4 100644 --- a/src/interface/romtype.cpp +++ b/src/interface/romtype.cpp @@ -125,6 +125,8 @@ core_type::core_type(core_type_params& params) loadimg = params.load_rom; _controllerconfig = params.controllerconfig; _set_region = params.set_region; + _audio_rate = params.audio_rate; + _video_rate = params.video_rate; settings = params.settings; if(params.bios) biosname = params.bios; @@ -254,6 +256,17 @@ bool core_type::set_region(core_region& region) return _set_region(region); } +std::pair core_type::get_video_rate() +{ + return _video_rate(); +} + +std::pair core_type::get_audio_rate() +{ + return _audio_rate(); +} + + core_sysregion::core_sysregion(const std::string& _name, core_type& _type, core_region& _region) : name(_name), type(_type), region(_region) { -- 2.11.4.GIT