mirror of
https://github.com/Detanup01/gbe_fork.git
synced 2024-12-27 02:44:16 +08:00
Fix controller rumble code.
This commit is contained in:
parent
5234d8b0e6
commit
0d65114ee6
@ -66,7 +66,7 @@ struct Controller_Action {
|
|||||||
|
|
||||||
struct Rumble_Thread_Data {
|
struct Rumble_Thread_Data {
|
||||||
std::condition_variable rumble_thread_cv;
|
std::condition_variable rumble_thread_cv;
|
||||||
std::atomic_bool kill_rumble_thread;
|
bool kill_rumble_thread;
|
||||||
std::mutex rumble_mutex;
|
std::mutex rumble_mutex;
|
||||||
|
|
||||||
struct Rumble_Data {
|
struct Rumble_Data {
|
||||||
@ -232,38 +232,21 @@ public:
|
|||||||
|
|
||||||
static void background_rumble(Rumble_Thread_Data *data)
|
static void background_rumble(Rumble_Thread_Data *data)
|
||||||
{
|
{
|
||||||
std::mutex mtx;
|
|
||||||
std::unique_lock<std::mutex> lck(mtx);
|
|
||||||
bool rumbled = false;
|
|
||||||
while (true) {
|
|
||||||
bool new_data = false;
|
|
||||||
if (rumbled) {
|
|
||||||
std::this_thread::sleep_for(std::chrono::milliseconds(20));
|
|
||||||
data->rumble_mutex.lock();
|
|
||||||
for (int i = 0; i < GAMEPAD_COUNT; ++i) {
|
|
||||||
if (data->data[i].new_data) {
|
|
||||||
new_data = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
data->rumble_mutex.unlock();
|
|
||||||
|
|
||||||
if (data->kill_rumble_thread) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool x = new_data || data->rumble_thread_cv.wait_for(lck, std::chrono::milliseconds(100)) != std::cv_status::timeout;
|
|
||||||
if (data->kill_rumble_thread) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
rumbled = false;
|
|
||||||
while (true) {
|
while (true) {
|
||||||
unsigned short left, right;
|
unsigned short left, right;
|
||||||
unsigned int rumble_length_ms;
|
unsigned int rumble_length_ms;
|
||||||
int gamepad = -1;
|
int gamepad = -1;
|
||||||
data->rumble_mutex.lock();
|
while (gamepad == -1) {
|
||||||
|
std::unique_lock<std::mutex> lck(data->rumble_mutex);
|
||||||
|
if (data->kill_rumble_thread) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
data->rumble_thread_cv.wait_for(lck, std::chrono::milliseconds(1000));
|
||||||
|
if (data->kill_rumble_thread) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
for (int i = 0; i < GAMEPAD_COUNT; ++i) {
|
for (int i = 0; i < GAMEPAD_COUNT; ++i) {
|
||||||
if (data->data[i].new_data) {
|
if (data->data[i].new_data) {
|
||||||
left = data->data[i].left;
|
left = data->data[i].left;
|
||||||
@ -278,15 +261,9 @@ static void background_rumble(Rumble_Thread_Data *data)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
data->rumble_mutex.unlock();
|
|
||||||
if (gamepad == -1) {
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
GamepadSetRumble((GAMEPAD_DEVICE)gamepad, ((double)left) / 65535.0, ((double)right) / 65535.0, rumble_length_ms);
|
GamepadSetRumble((GAMEPAD_DEVICE)gamepad, ((double)left) / 65535.0, ((double)right) / 65535.0, rumble_length_ms);
|
||||||
rumbled = true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -370,7 +347,9 @@ bool Shutdown()
|
|||||||
}
|
}
|
||||||
|
|
||||||
controllers = std::map<ControllerHandle_t, struct Controller_Action>();
|
controllers = std::map<ControllerHandle_t, struct Controller_Action>();
|
||||||
|
rumble_thread_data->rumble_mutex.lock();
|
||||||
rumble_thread_data->kill_rumble_thread = true;
|
rumble_thread_data->kill_rumble_thread = true;
|
||||||
|
rumble_thread_data->rumble_mutex.unlock();
|
||||||
rumble_thread_data->rumble_thread_cv.notify_one();
|
rumble_thread_data->rumble_thread_cv.notify_one();
|
||||||
background_rumble_thread.join();
|
background_rumble_thread.join();
|
||||||
delete rumble_thread_data;
|
delete rumble_thread_data;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user