Callback ABI fix

This commit is contained in:
Connor Harrison 2025-07-12 18:10:55 +01:00
parent b403e1be33
commit 9aabc609a4

View File

@ -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);
}