mirror of
https://github.com/libretro/Play-.git
synced 2025-02-19 19:10:42 +00:00
poll button state on retro_run() thread... to avoid race condition, as these methods are not thread safe
This commit is contained in:
parent
ade7f38f7e
commit
aab9b66c89
@ -3,40 +3,53 @@
|
||||
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;
|
||||
std::mutex m_input_mutex;
|
||||
|
||||
void CPH_Libretro_Input::UpdateInputState()
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(m_input_mutex);
|
||||
g_input_poll_cb();
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void CPH_Libretro_Input::Update(uint8* ram)
|
||||
{
|
||||
if(!g_input_poll_cb || !g_input_state_cb || g_ds2_to_retro_btn_map.size() == 0)
|
||||
return;
|
||||
|
||||
g_input_poll_cb();
|
||||
|
||||
std::lock_guard<std::mutex> lock(m_input_mutex);
|
||||
for(auto* listener : m_listeners)
|
||||
{
|
||||
for(unsigned int i = 0; i < PS2::CControllerInfo::MAX_BUTTONS; i++)
|
||||
{
|
||||
auto button = static_cast<PS2::CControllerInfo::BUTTON>(i);
|
||||
auto itr = g_ds2_to_retro_btn_map.find(button);
|
||||
|
||||
if(itr == g_ds2_to_retro_btn_map.end()) return;
|
||||
|
||||
auto currentButtonId = static_cast<PS2::CControllerInfo::BUTTON>(i);
|
||||
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;
|
||||
listener->SetAxisState(0, currentButtonId, val, ram);
|
||||
listener->SetAxisState(0, currentButtonId, m_btn_state[currentButtonId], ram);
|
||||
}
|
||||
else
|
||||
{
|
||||
uint32 value = g_input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, itr->second);
|
||||
listener->SetButtonState(0, currentButtonId, value != 0, ram);
|
||||
listener->SetButtonState(0, currentButtonId, m_btn_state[currentButtonId], ram);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,6 +1,7 @@
|
||||
#pragma once
|
||||
|
||||
#include <map>
|
||||
#include <mutex>
|
||||
#include "PadHandler.h"
|
||||
// #include "InputBindingManager.h"
|
||||
#include "libretro.h"
|
||||
@ -14,4 +15,9 @@ public:
|
||||
void Update(uint8*) override;
|
||||
|
||||
static FactoryFunction GetFactoryFunction();
|
||||
|
||||
void UpdateInputState();
|
||||
|
||||
private:
|
||||
std::map<int, uint8> m_btn_state = {};
|
||||
};
|
||||
|
@ -407,6 +407,7 @@ void retro_run()
|
||||
|
||||
checkVarsUpdates();
|
||||
|
||||
|
||||
if(!first_run)
|
||||
{
|
||||
if(m_virtualMachine)
|
||||
@ -421,8 +422,14 @@ void retro_run()
|
||||
}
|
||||
|
||||
if(m_virtualMachine)
|
||||
{
|
||||
auto pad = m_virtualMachine->GetPadHandler();
|
||||
if(pad)
|
||||
static_cast<CPH_Libretro_Input*>(pad)->UpdateInputState();
|
||||
|
||||
if(m_virtualMachine->GetGSHandler())
|
||||
m_virtualMachine->GetGSHandler()->ProcessSingleFrame();
|
||||
}
|
||||
}
|
||||
|
||||
void retro_reset(void)
|
||||
|
Loading…
x
Reference in New Issue
Block a user