Skip to content
This repository was archived by the owner on Apr 9, 2025. It is now read-only.

Commit f1d44be

Browse files
committed
ds3/ds4/dualsense pad support
1 parent c17373c commit f1d44be

3 files changed

Lines changed: 76 additions & 20 deletions

File tree

app/src/main/cpp/native-lib.cpp

Lines changed: 67 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,9 @@ extern std::string g_android_executable_dir;
7171
extern std::string g_android_config_dir;
7272
extern std::string g_android_cache_dir;
7373

74+
std::string g_input_config_override;
75+
cfg_input_configurations g_cfg_input_configs;
76+
7477
LOG_CHANNEL(rpcs3_android, "ANDROID");
7578

7679
struct LogListener : logs::listener {
@@ -150,9 +153,6 @@ struct GraphicsFrame : GSFrameBase {
150153
u32 sshot_height, bool is_bgra) override {}
151154
};
152155

153-
std::string g_input_config_override;
154-
cfg_input_configurations g_cfg_input_configs;
155-
156156
void jit_announce(uptr, usz, std::string_view);
157157

158158
[[noreturn]] void report_fatal_error(std::string_view _text,
@@ -914,36 +914,87 @@ extern "C" JNIEXPORT jboolean JNICALL Java_net_rpcs3_RPCS3_surfaceEvent(
914914
return true;
915915
}
916916

917-
extern "C" JNIEXPORT jboolean JNICALL
918-
Java_net_rpcs3_RPCS3_usbDeviceEvent(JNIEnv *env, jobject, jint fd, jint event) {
919-
rpcs3_android.warning("usb device event %d, %d", fd, event);
917+
extern "C" JNIEXPORT jboolean JNICALL Java_net_rpcs3_RPCS3_usbDeviceEvent(
918+
JNIEnv *env, jobject, jint fd, jint vendorId, jint productId, jint event) {
919+
rpcs3_android.warning(
920+
"usb device event %d fd: %d, vendorId: %d, productId: %d", event, fd,
921+
vendorId, productId);
920922

921923
{
922924
std::lock_guard lock(g_android_usb_devices_mutex);
923925

924926
if (event == 0) {
925-
g_android_usb_devices.push_back(fd);
927+
g_android_usb_devices.push_back({
928+
.fd = int(fd),
929+
.vendorId = u16(vendorId),
930+
.productId = u16(productId),
931+
});
926932
} else {
927-
if (auto it = std::ranges::find(g_android_usb_devices, fd);
933+
auto filter = [fd](auto device) { return device.fd == fd; };
934+
if (auto it = std::ranges::find_if(g_android_usb_devices, filter);
928935
it != g_android_usb_devices.end()) {
929936
g_android_usb_devices.erase(it);
930937
}
931938
}
932939
}
933940

934941
{
935-
auto list = [](auto handler, std::string name) {
936-
rpcs3_android.warning("going to enumerate %s pads", name);
937-
handler.Init();
942+
auto selectedHandler = g_cfg_input.player1.handler.get();
943+
std::string selectedDevice;
944+
945+
std::map<pad_handler, std::pair<std::unique_ptr<PadHandlerBase>,
946+
std::vector<std::string>>>
947+
handlerToDevices;
948+
949+
auto collectDevices = [&](auto handler) {
950+
handler->Init();
951+
952+
std::vector<std::string> devices;
953+
for (const auto &device : handler->list_devices()) {
954+
devices.push_back(device.name);
955+
}
956+
957+
auto type = handler->m_type;
958+
959+
handlerToDevices[type] = std::pair{
960+
std::move(handler),
961+
std::move(devices),
962+
};
938963
};
939964

940-
list(ds3_pad_handler(), "ds3");
941-
list(ds4_pad_handler(), "ds4");
942-
list(dualsense_pad_handler(), "dualsense");
965+
collectDevices(std::make_unique<dualsense_pad_handler>());
966+
collectDevices(std::make_unique<ds4_pad_handler>());
967+
collectDevices(std::make_unique<ds3_pad_handler>());
968+
969+
if (handlerToDevices[selectedHandler].second.empty()) {
970+
selectedHandler = pad_handler::null;
971+
}
972+
973+
if (!handlerToDevices[pad_handler::dualsense].second.empty()) {
974+
selectedHandler = pad_handler::dualsense;
975+
} else if (!handlerToDevices[pad_handler::ds4].second.empty()) {
976+
selectedHandler = pad_handler::ds4;
977+
} else if (!handlerToDevices[pad_handler::ds3].second.empty()) {
978+
selectedHandler = pad_handler::ds3;
979+
}
980+
981+
if (selectedHandler != g_cfg_input.player1.handler.get()) {
982+
rpcs3_android.warning("install %s pad handler", selectedHandler);
983+
984+
g_cfg_input.player1.handler.set(selectedHandler);
985+
986+
if (selectedHandler != pad_handler::null) {
987+
g_cfg_input.player1.device.from_string(
988+
handlerToDevices[selectedHandler].second.front());
989+
handlerToDevices[selectedHandler].first->init_config(&g_cfg_input.player1.config);
990+
} else {
991+
g_cfg_input.player1.device.from_default();
992+
}
993+
994+
g_cfg_input.save("", g_cfg_input_configs.default_config);
995+
}
943996
}
944997

945-
// FIXME
946-
g_cfg_input.player1.handler.set(pad_handler::dualsense);
947998
return true;
948999
}
9491000

app/src/main/java/net/rpcs3/RPCS3.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ class RPCS3 {
88
external fun installPkgFile(fd: Int, progressId: Long): Boolean
99
external fun boot(path: String): Boolean
1010
external fun surfaceEvent(surface: Surface, event: Int): Boolean
11-
external fun usbDeviceEvent(fd: Int, event: Int): Boolean
11+
external fun usbDeviceEvent(fd: Int, vendorId: Int, productId: Int, event: Int): Boolean
1212

1313
companion object {
1414
val instance = RPCS3()

app/src/main/java/net/rpcs3/UsbDeviceRepository.kt

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,19 @@ class UsbDeviceRepository {
1515

1616
val connection = usbManager.openDevice(device)
1717
devices[device] = connection
18-
RPCS3.instance.usbDeviceEvent(connection.fileDescriptor, 0);
18+
RPCS3.instance.usbDeviceEvent(
19+
connection.fileDescriptor,
20+
device.vendorId,
21+
device.productId,
22+
0
23+
)
1924
}
2025

2126
fun detach(device: UsbDevice) {
2227
val connection = devices[device]
2328
if (connection != null) {
24-
RPCS3.instance.usbDeviceEvent(connection.fileDescriptor, 1);
25-
connection.close();
29+
RPCS3.instance.usbDeviceEvent(connection.fileDescriptor, -1, -1, 1)
30+
connection.close()
2631

2732
devices.remove(device)
2833
}

0 commit comments

Comments
 (0)