Move get_{audio,video}_rate() to rom type methods

This commit is contained in:
Ilari Liusvaara 2013-01-05 16:07:29 +02:00
parent c0eb4d83d2
commit 315d1620b3
6 changed files with 72 additions and 48 deletions

View file

@ -24,10 +24,6 @@ void do_basic_core_init();
std::set<std::string> get_sram_set(); std::set<std::string> get_sram_set();
//Get region. //Get region.
core_region& core_get_region(); core_region& core_get_region();
//Get the current video rate.
std::pair<uint32_t, uint32_t> get_video_rate();
//Get the current audio rate.
std::pair<uint32_t, uint32_t> get_audio_rate();
//Set preload settings. //Set preload settings.
void set_preload_settings(); void set_preload_settings();
//Power the core. //Power the core.

View file

@ -50,6 +50,8 @@ struct core_type_params
core_romimage_info** images; //Terminate with NULL. core_romimage_info** images; //Terminate with NULL.
core_setting_group* settings; core_setting_group* settings;
bool (*set_region)(core_region& region); bool (*set_region)(core_region& region);
std::pair<uint32_t, uint32_t> (*video_rate)();
std::pair<uint32_t, uint32_t> (*audio_rate)();
}; };
struct core_region struct core_region
@ -116,6 +118,8 @@ public:
unsigned get_reset_support(); unsigned get_reset_support();
core_setting_group& get_settings(); core_setting_group& get_settings();
bool set_region(core_region& region); bool set_region(core_region& region);
std::pair<uint32_t, uint32_t> get_video_rate();
std::pair<uint32_t, uint32_t> get_audio_rate();
private: private:
core_type(const core_type&); core_type(const core_type&);
core_type& operator=(const core_type&); core_type& operator=(const core_type&);
@ -123,6 +127,8 @@ private:
uint64_t rtc_subsec); uint64_t rtc_subsec);
controller_set (*_controllerconfig)(std::map<std::string, std::string>& settings); controller_set (*_controllerconfig)(std::map<std::string, std::string>& settings);
bool (*_set_region)(core_region& region); bool (*_set_region)(core_region& region);
std::pair<uint32_t, uint32_t> (*_video_rate)();
std::pair<uint32_t, uint32_t> (*_audio_rate)();
unsigned id; unsigned id;
unsigned reset_support; unsigned reset_support;
std::string iname; std::string iname;

View file

@ -63,6 +63,8 @@ namespace
int16_t blanksound[1070] = {0}; int16_t blanksound[1070] = {0};
int16_t soundbuf[8192] = {0}; int16_t soundbuf[8192] = {0};
size_t soundbuf_fill = 0; size_t soundbuf_fill = 0;
bool last_hires = false;
bool last_interlace = false;
uint64_t trace_counter; uint64_t trace_counter;
std::ofstream trace_output; std::ofstream trace_output;
bool trace_output_enable; bool trace_output_enable;
@ -649,27 +651,51 @@ namespace
return true; return true;
} }
//Get the current video rate.
std::pair<uint32_t, uint32_t> 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<uint32_t, uint32_t> get_audio_rate()
{
if(!internal_rom)
return std::make_pair(64081, 2);
return std::make_pair(get_snes_apu_rate(), static_cast<uint32_t>(768));
}
core_type_params _type_snes = { core_type_params _type_snes = {
"snes", "SNES", 0, BSNES_RESET_LEVEL , load_rom_snes, _controllerconfig, "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, "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 = { core_type_params _type_bsx = {
"bsx", "BS-X (non-slotted)", 1, BSNES_RESET_LEVEL , load_rom_bsx, _controllerconfig, "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 = { core_type_params _type_bsxslotted = {
"bsxslotted", "BS-X (slotted)", 2, BSNES_RESET_LEVEL , load_rom_bsxslotted, _controllerconfig, "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 = { core_type_params _type_sufamiturbo = {
"sufamiturbo", "Sufami Turbo", 3, BSNES_RESET_LEVEL , load_rom_sufamiturbo, _controllerconfig, "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 = { core_type_params _type_sgb = {
"sgb", "Super Game Boy", 4, BSNES_RESET_LEVEL , load_rom_sgb, _controllerconfig, "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); core_type type_snes(_type_snes);
@ -685,8 +711,6 @@ namespace
core_sysregion sr6("sgb_ntsc", type_sgb, region_ntsc); core_sysregion sr6("sgb_ntsc", type_sgb, region_ntsc);
core_sysregion sr7("sgb_pal", type_sgb, region_pal); core_sysregion sr7("sgb_pal", type_sgb, region_pal);
bool last_hires = false;
bool last_interlace = false;
bool stepping_into_save; bool stepping_into_save;
bool video_refresh_done; bool video_refresh_done;
//Delay reset. //Delay reset.
@ -1035,26 +1059,6 @@ void core_unload_cartridge()
internal_rom = NULL; internal_rom = NULL;
} }
//Get the current video rate.
std::pair<uint32_t, uint32_t> 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<uint32_t, uint32_t> get_audio_rate()
{
if(!internal_rom)
return std::make_pair(64081, 2);
return std::make_pair(get_snes_apu_rate(), static_cast<uint32_t>(768));
}
std::map<std::string, std::vector<char>> save_sram() throw(std::bad_alloc) std::map<std::string, std::vector<char>> save_sram() throw(std::bad_alloc)
{ {

View file

@ -97,6 +97,17 @@ namespace
}; };
} getinput; } getinput;
std::pair<uint32_t, uint32_t> get_video_rate()
{
return std::make_pair(262144, 4389);
}
std::pair<uint32_t, uint32_t> get_audio_rate()
{
return std::make_pair(32768, 1);
}
const char* buttonnames[] = {"left", "right", "up", "down", "A", "B", "select", "start"}; const char* buttonnames[] = {"left", "right", "up", "down", "A", "B", "select", "start"};
void system_write(unsigned char* buffer, unsigned idx, unsigned ctrl, short x) throw() void system_write(unsigned char* buffer, unsigned idx, unsigned ctrl, short x) throw()
@ -296,15 +307,15 @@ namespace
core_type_params _type_dmg = { core_type_params _type_dmg = {
"dmg", "Game Boy", 1, 1, load_rom_dmg, _controllerconfig, "gb;dmg", NULL, "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 = { core_type_params _type_gbc = {
"gbc", "Game Boy Color", 0, 1, load_rom_gbc, _controllerconfig, "gbc;cgb", NULL, "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 = { core_type_params _type_gbc_gba = {
"gbc_gba", "Game Boy Color (GBA)", 2, 1, load_rom_gbc_gba, _controllerconfig, "", NULL, "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_dmg(_type_dmg);
core_type type_gbc(_type_gbc); core_type type_gbc(_type_gbc);
@ -337,16 +348,6 @@ core_region& core_get_region()
return region_world; return region_world;
} }
std::pair<uint32_t, uint32_t> get_video_rate()
{
return std::make_pair(262144, 4389);
}
std::pair<uint32_t, uint32_t> get_audio_rate()
{
return std::make_pair(32768, 1);
}
void core_runtosave() void core_runtosave()
{ {
} }

View file

@ -72,6 +72,9 @@ namespace
return x; return x;
} }
std::pair<unsigned, unsigned> videorate_null() { return std::make_pair(60, 1); }
std::pair<unsigned, unsigned> audiorate_null() { return std::make_pair(48000, 1); }
bool set_region_null(core_region& reg) bool set_region_null(core_region& reg)
{ {
return true; return true;
@ -94,7 +97,8 @@ namespace
core_romimage_info* null_images[] = {NULL}; core_romimage_info* null_images[] = {NULL};
core_type_params _type_null = { core_type_params _type_null = {
"null", "(null)", 9999, 0, load_rom_null, null_controllerconfig, "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_type type_null(_type_null);
core_sysregion sysregion_null("null", type_null, null_region); core_sysregion sysregion_null("null", type_null, null_region);
@ -363,8 +367,8 @@ void loaded_rom::load(std::map<std::string, std::string>& settings, uint64_t rtc
region = &core_get_region(); region = &core_get_region();
core_power(); core_power();
} }
auto nominal_fps = get_video_rate(); auto nominal_fps = rtype->get_video_rate();
auto nominal_hz = get_audio_rate(); auto nominal_hz = rtype->get_audio_rate();
set_nominal_framerate(1.0 * nominal_fps.first / nominal_fps.second); set_nominal_framerate(1.0 * nominal_fps.first / nominal_fps.second);
information_dispatch::do_sound_rate(nominal_hz.first, nominal_hz.second); information_dispatch::do_sound_rate(nominal_hz.first, nominal_hz.second);
current_rom_type = rtype; current_rom_type = rtype;

View file

@ -125,6 +125,8 @@ core_type::core_type(core_type_params& params)
loadimg = params.load_rom; loadimg = params.load_rom;
_controllerconfig = params.controllerconfig; _controllerconfig = params.controllerconfig;
_set_region = params.set_region; _set_region = params.set_region;
_audio_rate = params.audio_rate;
_video_rate = params.video_rate;
settings = params.settings; settings = params.settings;
if(params.bios) if(params.bios)
biosname = params.bios; biosname = params.bios;
@ -254,6 +256,17 @@ bool core_type::set_region(core_region& region)
return _set_region(region); return _set_region(region);
} }
std::pair<uint32_t, uint32_t> core_type::get_video_rate()
{
return _video_rate();
}
std::pair<uint32_t, uint32_t> core_type::get_audio_rate()
{
return _audio_rate();
}
core_sysregion::core_sysregion(const std::string& _name, core_type& _type, core_region& _region) core_sysregion::core_sysregion(const std::string& _name, core_type& _type, core_region& _region)
: name(_name), type(_type), region(_region) : name(_name), type(_type), region(_region)
{ {