mirror of
https://github.com/shadps4-emu/shadPS4.git
synced 2025-07-22 10:04:39 +00:00
Callback ABI fix
This commit is contained in:
parent
b403e1be33
commit
9aabc609a4
@ -10,6 +10,33 @@
|
||||
#include <fmt/format.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 {
|
||||
|
||||
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) {
|
||||
LOG_DEBUG(Lib_Usbd, "called");
|
||||
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(g_callback_mutex);
|
||||
g_transfer_callbacks.erase(transfer);
|
||||
}
|
||||
|
||||
libusb_free_transfer(transfer);
|
||||
}
|
||||
|
||||
@ -305,7 +337,12 @@ void PS4_SYSV_ABI sceUsbdFillInterruptTransfer(SceUsbdTransfer* transfer,
|
||||
u32 timeout) {
|
||||
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);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user