mirror of
https://github.com/shadps4-emu/shadPS4.git
synced 2025-07-22 18:15:14 +00:00
Callback ABI fix
This commit is contained in:
parent
b403e1be33
commit
9aabc609a4
@ -10,6 +10,33 @@
|
|||||||
#include <fmt/format.h>
|
#include <fmt/format.h>
|
||||||
#include <libusb.h>
|
#include <libusb.h>
|
||||||
|
|
||||||
|
#include <unordered_map>
|
||||||
|
#include <mutex>
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
std::unordered_map<Libraries::Usbd::SceUsbdTransfer*, Libraries::Usbd::SceUsbdTransferCallback> g_transfer_callbacks;
|
||||||
|
std::mutex g_callback_mutex;
|
||||||
|
|
||||||
|
void transfer_abi_callback(libusb_transfer* transfer) {
|
||||||
|
using SysVCallback = void (PS4_SYSV_ABI *)(Libraries::Usbd::SceUsbdTransfer*);
|
||||||
|
SysVCallback callback = nullptr;
|
||||||
|
|
||||||
|
{
|
||||||
|
std::lock_guard<std::mutex> lock(g_callback_mutex);
|
||||||
|
auto it = g_transfer_callbacks.find(transfer);
|
||||||
|
if (it != g_transfer_callbacks.end()) {
|
||||||
|
callback = (SysVCallback)it->second;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (callback) {
|
||||||
|
callback(transfer);
|
||||||
|
} else {
|
||||||
|
LOG_WARNING(Lib_Usbd, "No registered callback for USB transfer {:p}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
namespace Libraries::Usbd {
|
namespace Libraries::Usbd {
|
||||||
|
|
||||||
s32 libusb_to_orbis_error(int retVal) {
|
s32 libusb_to_orbis_error(int retVal) {
|
||||||
@ -276,6 +303,11 @@ s32 PS4_SYSV_ABI sceUsbdCancelTransfer(SceUsbdTransfer* transfer) {
|
|||||||
void PS4_SYSV_ABI sceUsbdFreeTransfer(SceUsbdTransfer* transfer) {
|
void PS4_SYSV_ABI sceUsbdFreeTransfer(SceUsbdTransfer* transfer) {
|
||||||
LOG_DEBUG(Lib_Usbd, "called");
|
LOG_DEBUG(Lib_Usbd, "called");
|
||||||
|
|
||||||
|
{
|
||||||
|
std::lock_guard<std::mutex> lock(g_callback_mutex);
|
||||||
|
g_transfer_callbacks.erase(transfer);
|
||||||
|
}
|
||||||
|
|
||||||
libusb_free_transfer(transfer);
|
libusb_free_transfer(transfer);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -305,7 +337,12 @@ void PS4_SYSV_ABI sceUsbdFillInterruptTransfer(SceUsbdTransfer* transfer,
|
|||||||
u32 timeout) {
|
u32 timeout) {
|
||||||
LOG_DEBUG(Lib_Usbd, "called");
|
LOG_DEBUG(Lib_Usbd, "called");
|
||||||
|
|
||||||
libusb_fill_interrupt_transfer(transfer, dev_handle, endpoint, buffer, length, callback,
|
{
|
||||||
|
std::lock_guard<std::mutex> lock(g_callback_mutex);
|
||||||
|
g_transfer_callbacks[transfer] = callback;
|
||||||
|
}
|
||||||
|
|
||||||
|
libusb_fill_interrupt_transfer(transfer, dev_handle, endpoint, buffer, length, transfer_abi_callback,
|
||||||
user_data, timeout);
|
user_data, timeout);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user