Fix deallocation of GC Adapter

This commit is contained in:
Ameer 2020-06-23 12:47:58 -04:00
parent 901bc09dd7
commit d4e07fd95e
3 changed files with 10 additions and 4 deletions

View file

@ -130,6 +130,7 @@ void Adapter::Read() {
if (payload_size != sizeof(controller_payload_copy) || if (payload_size != sizeof(controller_payload_copy) ||
controller_payload_copy[0] != LIBUSB_DT_HID) { controller_payload_copy[0] != LIBUSB_DT_HID) {
// TODO: It might be worthwhile to Shutdown GC Adapter if we encounter errors here
LOG_ERROR(Input, "error reading payload (size: %d, type: %02x)", payload_size, LOG_ERROR(Input, "error reading payload (size: %d, type: %02x)", payload_size,
controller_payload_copy[0]); controller_payload_copy[0]);
} else { } else {
@ -200,6 +201,7 @@ void Adapter::StartScanThread() {
} }
void Adapter::StopScanThread() { void Adapter::StopScanThread() {
detect_thread_running = false;
detect_thread.join(); detect_thread.join();
} }
@ -298,8 +300,6 @@ void Adapter::GetGCEndpoint(libusb_device* device) {
Adapter::~Adapter() { Adapter::~Adapter() {
StopScanThread(); StopScanThread();
Reset(); Reset();
current_status = NO_ADAPTER_DETECTED;
} }
void Adapter::Reset() { void Adapter::Reset() {
@ -312,11 +312,11 @@ void Adapter::Reset() {
} }
if (adapter_thread_running) { if (adapter_thread_running) {
adapter_thread_running = false;
adapter_input_thread.join(); adapter_input_thread.join();
} }
adapter_controllers_status.fill(ControllerTypes::None); adapter_controllers_status.fill(ControllerTypes::None);
current_status = NO_ADAPTER_DETECTED; current_status = NO_ADAPTER_DETECTED;
if (usb_adapter_handle) { if (usb_adapter_handle) {
@ -324,6 +324,10 @@ void Adapter::Reset() {
libusb_close(usb_adapter_handle); libusb_close(usb_adapter_handle);
usb_adapter_handle = nullptr; usb_adapter_handle = nullptr;
} }
if (libusb_ctx) {
libusb_exit(libusb_ctx);
}
} }
bool Adapter::DeviceConnected(int port) { bool Adapter::DeviceConnected(int port) {

View file

@ -82,7 +82,6 @@ enum {
ADAPTER_DETECTED = 1, ADAPTER_DETECTED = 1,
}; };
/// Singleton Adapter class
class Adapter { class Adapter {
public: public:
/// Initialize the GC Adapter capture and read sequence /// Initialize the GC Adapter capture and read sequence

View file

@ -59,7 +59,10 @@ void Shutdown() {
#endif #endif
udp.reset(); udp.reset();
Input::UnregisterFactory<Input::ButtonDevice>("gcpad"); Input::UnregisterFactory<Input::ButtonDevice>("gcpad");
Input::UnregisterFactory<Input::AnalogDevice>("gcpad");
gcbuttons.reset(); gcbuttons.reset();
gcanalog.reset();
} }
Keyboard* GetKeyboard() { Keyboard* GetKeyboard() {