Move controller creation to System class, switch shared_ptr to unique_ptr

This commit is contained in:
Connor McLaughlin 2019-12-14 23:20:24 +10:00
parent 5fd421860a
commit ea0845d5ad
14 changed files with 56 additions and 47 deletions

View File

@ -23,7 +23,7 @@ bool Controller::Transfer(const u8 data_in, u8* data_out)
void Controller::SetButtonState(s32 button_code, bool pressed) {} void Controller::SetButtonState(s32 button_code, bool pressed) {}
std::shared_ptr<Controller> Controller::Create(std::string_view type_name) std::unique_ptr<Controller> Controller::Create(std::string_view type_name)
{ {
if (type_name == "DigitalController") if (type_name == "DigitalController")
return DigitalController::Create(); return DigitalController::Create();

View File

@ -25,7 +25,7 @@ public:
virtual void SetButtonState(s32 button_code, bool pressed); virtual void SetButtonState(s32 button_code, bool pressed);
/// Creates a new controller of the specified type. /// Creates a new controller of the specified type.
static std::shared_ptr<Controller> Create(std::string_view type_name); static std::unique_ptr<Controller> Create(std::string_view type_name);
/// Gets the integer code for a button in the specified controller type. /// Gets the integer code for a button in the specified controller type.
static std::optional<s32> GetButtonCodeByName(std::string_view type_name, std::string_view button_name); static std::optional<s32> GetButtonCodeByName(std::string_view type_name, std::string_view button_name);

View File

@ -76,9 +76,9 @@ bool DigitalController::Transfer(const u8 data_in, u8* data_out)
} }
} }
std::shared_ptr<DigitalController> DigitalController::Create() std::unique_ptr<DigitalController> DigitalController::Create()
{ {
return std::make_shared<DigitalController>(); return std::make_unique<DigitalController>();
} }
std::optional<s32> DigitalController::GetButtonCodeByName(std::string_view button_name) std::optional<s32> DigitalController::GetButtonCodeByName(std::string_view button_name)

View File

@ -31,7 +31,7 @@ public:
DigitalController(); DigitalController();
~DigitalController() override; ~DigitalController() override;
static std::shared_ptr<DigitalController> Create(); static std::unique_ptr<DigitalController> Create();
static std::optional<s32> GetButtonCodeByName(std::string_view button_name); static std::optional<s32> GetButtonCodeByName(std::string_view button_name);
void SetButtonState(Button button, bool pressed); void SetButtonState(Button button, bool pressed);

View File

@ -66,7 +66,6 @@ bool HostInterface::BootSystem(const char* filename, const char* state_filename)
return false; return false;
m_paused = m_settings.start_paused; m_paused = m_settings.start_paused;
ConnectControllers();
UpdateSpeedLimiterState(); UpdateSpeedLimiterState();
if (state_filename && !LoadState(state_filename)) if (state_filename && !LoadState(state_filename))
@ -208,8 +207,6 @@ std::optional<std::vector<u8>> HostInterface::GetBIOSImage(ConsoleRegion region)
return BIOS::LoadImageFromFile(m_settings.bios_path); return BIOS::LoadImageFromFile(m_settings.bios_path);
} }
void HostInterface::ConnectControllers() {}
void HostInterface::Throttle() void HostInterface::Throttle()
{ {
// Allow variance of up to 40ms either way. // Allow variance of up to 40ms either way.

View File

@ -60,9 +60,6 @@ protected:
float duration; float duration;
}; };
/// Connects controllers. TODO: Clean this up later...
virtual void ConnectControllers();
/// Throttles the system, i.e. sleeps until it's time to execute the next frame. /// Throttles the system, i.e. sleeps until it's time to execute the next frame.
void Throttle(); void Throttle();

View File

@ -230,16 +230,16 @@ bool MemoryCard::Transfer(const u8 data_in, u8* data_out)
return ack; return ack;
} }
std::shared_ptr<MemoryCard> MemoryCard::Create(System* system) std::unique_ptr<MemoryCard> MemoryCard::Create(System* system)
{ {
auto mc = std::make_shared<MemoryCard>(system); std::unique_ptr<MemoryCard> mc = std::make_unique<MemoryCard>(system);
mc->Format(); mc->Format();
return mc; return mc;
} }
std::shared_ptr<MemoryCard> MemoryCard::Open(System* system, std::string_view filename) std::unique_ptr<MemoryCard> MemoryCard::Open(System* system, std::string_view filename)
{ {
auto mc = std::make_shared<MemoryCard>(system); std::unique_ptr<MemoryCard> mc = std::make_unique<MemoryCard>(system);
mc->m_filename = filename; mc->m_filename = filename;
if (!mc->LoadFromFile()) if (!mc->LoadFromFile())
{ {

View File

@ -21,8 +21,8 @@ public:
MemoryCard(System* system); MemoryCard(System* system);
~MemoryCard(); ~MemoryCard();
static std::shared_ptr<MemoryCard> Create(System* system); static std::unique_ptr<MemoryCard> Create(System* system);
static std::shared_ptr<MemoryCard> Open(System* system, std::string_view filename); static std::unique_ptr<MemoryCard> Open(System* system, std::string_view filename);
void Reset(); void Reset();
bool DoState(StateWrapper& sw); bool DoState(StateWrapper& sw);

View File

@ -95,6 +95,16 @@ bool Pad::DoState(StateWrapper& sw)
return !sw.HasError(); return !sw.HasError();
} }
void Pad::SetController(u32 slot, std::unique_ptr<Controller> dev)
{
m_controllers[slot] = std::move(dev);
}
void Pad::SetMemoryCard(u32 slot, std::unique_ptr<MemoryCard> dev)
{
m_memory_cards[slot] = std::move(dev);
}
u32 Pad::ReadRegister(u32 offset) u32 Pad::ReadRegister(u32 offset)
{ {
switch (offset) switch (offset)
@ -289,8 +299,8 @@ void Pad::DoTransfer()
{ {
Log_DebugPrintf("Transferring slot %d", m_JOY_CTRL.SLOT.GetValue()); Log_DebugPrintf("Transferring slot %d", m_JOY_CTRL.SLOT.GetValue());
const std::shared_ptr<Controller>& controller = m_controllers[m_JOY_CTRL.SLOT]; Controller* const controller = m_controllers[m_JOY_CTRL.SLOT].get();
const std::shared_ptr<MemoryCard>& memory_card = m_memory_cards[m_JOY_CTRL.SLOT]; MemoryCard* const memory_card = m_memory_cards[m_JOY_CTRL.SLOT].get();
// set rx? // set rx?
m_JOY_CTRL.RXEN = true; m_JOY_CTRL.RXEN = true;

View File

@ -22,11 +22,11 @@ public:
void Reset(); void Reset();
bool DoState(StateWrapper& sw); bool DoState(StateWrapper& sw);
Controller* GetController(u32 slot) { return m_controllers[slot].get(); } Controller* GetController(u32 slot) const { return m_controllers[slot].get(); }
void SetController(u32 slot, std::shared_ptr<Controller> dev) { m_controllers[slot] = dev; } void SetController(u32 slot, std::unique_ptr<Controller> dev);
MemoryCard* GetMemoryCard(u32 slot) { return m_memory_cards[slot].get(); } MemoryCard* GetMemoryCard(u32 slot) { return m_memory_cards[slot].get(); }
void SetMemoryCard(u32 slot, std::shared_ptr<MemoryCard> dev) { m_memory_cards[slot] = dev; } void SetMemoryCard(u32 slot, std::unique_ptr<MemoryCard> dev);
u32 ReadRegister(u32 offset); u32 ReadRegister(u32 offset);
void WriteRegister(u32 offset, u32 value); void WriteRegister(u32 offset, u32 value);
@ -106,8 +106,8 @@ private:
System* m_system = nullptr; System* m_system = nullptr;
InterruptController* m_interrupt_controller = nullptr; InterruptController* m_interrupt_controller = nullptr;
std::array<std::shared_ptr<Controller>, NUM_SLOTS> m_controllers; std::array<std::unique_ptr<Controller>, NUM_SLOTS> m_controllers;
std::array<std::shared_ptr<MemoryCard>, NUM_SLOTS> m_memory_cards; std::array<std::unique_ptr<MemoryCard>, NUM_SLOTS> m_memory_cards;
State m_state = State::Idle; State m_state = State::Idle;
TickCount m_ticks_remaining = 0; TickCount m_ticks_remaining = 0;

View File

@ -146,6 +146,7 @@ bool System::Boot(const char* filename)
// Component setup. // Component setup.
InitializeComponents(); InitializeComponents();
UpdateControllers();
UpdateMemoryCards(); UpdateMemoryCards();
Reset(); Reset();
@ -451,9 +452,21 @@ void System::StallCPU(TickCount ticks)
m_cpu->AddPendingTicks(ticks); m_cpu->AddPendingTicks(ticks);
} }
void System::SetController(u32 slot, std::shared_ptr<Controller> dev) Controller* System::GetController(u32 slot) const
{ {
m_pad->SetController(slot, std::move(dev)); return m_pad->GetController(slot);
}
void System::UpdateControllers()
{
m_pad->SetController(0, nullptr);
m_pad->SetController(1, nullptr);
{
std::unique_ptr<Controller> controller = Controller::Create("DigitalController");
if (controller)
m_pad->SetController(0, std::move(controller));
}
} }
void System::UpdateMemoryCards() void System::UpdateMemoryCards()
@ -464,14 +477,14 @@ void System::UpdateMemoryCards()
const Settings& settings = m_host_interface->GetSettings(); const Settings& settings = m_host_interface->GetSettings();
if (!settings.memory_card_a_path.empty()) if (!settings.memory_card_a_path.empty())
{ {
std::shared_ptr<MemoryCard> card = MemoryCard::Open(this, settings.memory_card_a_path); std::unique_ptr<MemoryCard> card = MemoryCard::Open(this, settings.memory_card_a_path);
if (card) if (card)
m_pad->SetMemoryCard(0, std::move(card)); m_pad->SetMemoryCard(0, std::move(card));
} }
if (!settings.memory_card_b_path.empty()) if (!settings.memory_card_b_path.empty())
{ {
std::shared_ptr<MemoryCard> card = MemoryCard::Open(this, settings.memory_card_b_path); std::unique_ptr<MemoryCard> card = MemoryCard::Open(this, settings.memory_card_b_path);
if (card) if (card)
m_pad->SetMemoryCard(1, std::move(card)); m_pad->SetMemoryCard(1, std::move(card));
} }

View File

@ -79,7 +79,9 @@ public:
// Adds ticks to the global tick counter, simulating the CPU being stalled. // Adds ticks to the global tick counter, simulating the CPU being stalled.
void StallCPU(TickCount ticks); void StallCPU(TickCount ticks);
void SetController(u32 slot, std::shared_ptr<Controller> dev); // Access controllers for simulating input.
Controller* GetController(u32 slot) const;
void UpdateControllers();
void UpdateMemoryCards(); void UpdateMemoryCards();
void UpdateCPUExecutionMode(); void UpdateCPUExecutionMode();

View File

@ -160,12 +160,6 @@ void SDLHostInterface::SaveSettings()
m_settings.Save(m_settings_filename.c_str()); m_settings.Save(m_settings_filename.c_str());
} }
void SDLHostInterface::ConnectControllers()
{
m_controller = DigitalController::Create();
m_system->SetController(0, m_controller);
}
void SDLHostInterface::QueueSwitchGPURenderer() void SDLHostInterface::QueueSwitchGPURenderer()
{ {
SDL_Event ev = {}; SDL_Event ev = {};
@ -489,8 +483,9 @@ void SDLHostInterface::HandleSDLEvent(const SDL_Event* event)
case SDL_CONTROLLERAXISMOTION: case SDL_CONTROLLERAXISMOTION:
{ {
if (m_controller) DigitalController* controller = static_cast<DigitalController*>(m_system->GetController(0));
HandleSDLControllerAxisEventForController(event, m_controller.get()); if (controller)
HandleSDLControllerAxisEventForController(event, controller);
} }
break; break;
@ -503,8 +498,9 @@ void SDLHostInterface::HandleSDLEvent(const SDL_Event* event)
m_focus_main_menu_bar = true; m_focus_main_menu_bar = true;
} }
if (m_controller) DigitalController* controller = static_cast<DigitalController*>(m_system->GetController(0));
HandleSDLControllerButtonEventForController(event, m_controller.get()); if (controller)
HandleSDLControllerButtonEventForController(event, controller);
} }
break; break;
@ -520,7 +516,8 @@ void SDLHostInterface::HandleSDLEvent(const SDL_Event* event)
void SDLHostInterface::HandleSDLKeyEvent(const SDL_Event* event) void SDLHostInterface::HandleSDLKeyEvent(const SDL_Event* event)
{ {
const bool repeat = event->key.repeat != 0; const bool repeat = event->key.repeat != 0;
if (!repeat && m_controller && HandleSDLKeyEventForController(event, m_controller.get())) DigitalController* controller = static_cast<DigitalController*>(m_system->GetController(0));
if (!repeat && controller && HandleSDLKeyEventForController(event, controller))
return; return;
const bool pressed = (event->type == SDL_KEYDOWN); const bool pressed = (event->type == SDL_KEYDOWN);

View File

@ -13,8 +13,6 @@
#include <mutex> #include <mutex>
class System; class System;
class DigitalController;
class MemoryCard;
class AudioStream; class AudioStream;
class SDLHostInterface final : public HostInterface class SDLHostInterface final : public HostInterface
@ -33,9 +31,6 @@ public:
void Run(); void Run();
protected:
void ConnectControllers() override;
private: private:
static constexpr u32 NUM_QUICK_SAVE_STATES = 10; static constexpr u32 NUM_QUICK_SAVE_STATES = 10;
static constexpr char RESUME_SAVESTATE_FILENAME[] = "savestate_resume.bin"; static constexpr char RESUME_SAVESTATE_FILENAME[] = "savestate_resume.bin";
@ -98,8 +93,6 @@ private:
std::map<int, SDL_GameController*> m_sdl_controllers; std::map<int, SDL_GameController*> m_sdl_controllers;
std::shared_ptr<DigitalController> m_controller;
u32 m_switch_gpu_renderer_event_id = 0; u32 m_switch_gpu_renderer_event_id = 0;
bool m_quit_request = false; bool m_quit_request = false;