2019-12-31 21:02:35 +01:00
|
|
|
#include "PH_Libretro_Input.h"
|
|
|
|
|
|
|
|
extern retro_input_poll_t g_input_poll_cb;
|
|
|
|
extern retro_input_state_t g_input_state_cb;
|
|
|
|
extern std::map<int, int> g_ds2_to_retro_btn_map;
|
2019-06-27 10:25:52 +01:00
|
|
|
std::mutex m_input_mutex;
|
2019-12-31 21:02:35 +01:00
|
|
|
|
2019-06-27 10:25:52 +01:00
|
|
|
void CPH_Libretro_Input::UpdateInputState()
|
2019-12-31 21:02:35 +01:00
|
|
|
{
|
2019-06-27 10:25:52 +01:00
|
|
|
std::lock_guard<std::mutex> lock(m_input_mutex);
|
2019-12-31 21:02:35 +01:00
|
|
|
g_input_poll_cb();
|
2019-06-27 10:25:52 +01:00
|
|
|
for(unsigned int i = 0; i < PS2::CControllerInfo::MAX_BUTTONS; i++)
|
|
|
|
{
|
|
|
|
auto currentButtonId = static_cast<PS2::CControllerInfo::BUTTON>(i);
|
|
|
|
auto itr = g_ds2_to_retro_btn_map.find(currentButtonId);
|
|
|
|
if(PS2::CControllerInfo::IsAxis(currentButtonId))
|
|
|
|
{
|
|
|
|
int index;
|
|
|
|
if(i < 2)
|
|
|
|
index = RETRO_DEVICE_INDEX_ANALOG_LEFT;
|
|
|
|
else
|
|
|
|
index = RETRO_DEVICE_INDEX_ANALOG_RIGHT;
|
|
|
|
|
|
|
|
float value = g_input_state_cb(0, RETRO_DEVICE_ANALOG, index, itr->second);
|
|
|
|
uint8 val = static_cast<int8>((value / 0xFF) + 0.5) + 0x7F;
|
|
|
|
if(val > 0x7F - 5 && val < 0x7F + 5)
|
|
|
|
val = 0x7F;
|
|
|
|
m_btn_state[currentButtonId] = val;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
uint32 value = g_input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, itr->second);
|
|
|
|
m_btn_state[currentButtonId] = value != 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2019-12-31 21:02:35 +01:00
|
|
|
|
2019-06-27 10:25:52 +01:00
|
|
|
void CPH_Libretro_Input::Update(uint8* ram)
|
|
|
|
{
|
|
|
|
std::lock_guard<std::mutex> lock(m_input_mutex);
|
2019-12-31 21:02:35 +01:00
|
|
|
for(auto* listener : m_listeners)
|
|
|
|
{
|
|
|
|
for(unsigned int i = 0; i < PS2::CControllerInfo::MAX_BUTTONS; i++)
|
|
|
|
{
|
|
|
|
auto currentButtonId = static_cast<PS2::CControllerInfo::BUTTON>(i);
|
|
|
|
if(PS2::CControllerInfo::IsAxis(currentButtonId))
|
|
|
|
{
|
2019-06-27 10:25:52 +01:00
|
|
|
listener->SetAxisState(0, currentButtonId, m_btn_state[currentButtonId], ram);
|
2019-12-31 21:02:35 +01:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2019-06-27 10:25:52 +01:00
|
|
|
listener->SetButtonState(0, currentButtonId, m_btn_state[currentButtonId], ram);
|
2019-12-31 21:02:35 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
CPadHandler::FactoryFunction CPH_Libretro_Input::GetFactoryFunction()
|
|
|
|
{
|
|
|
|
return []() { return new CPH_Libretro_Input(); };
|
|
|
|
}
|