Fix some listener bugs in the XB1 driver

This commit is contained in:
Cameron Gutman 2015-11-08 19:03:12 -08:00
parent d740e7a521
commit 4486a126ad
2 changed files with 63 additions and 32 deletions

View File

@ -14,7 +14,7 @@ import android.os.IBinder;
import java.util.ArrayList;
public class UsbDriverService extends Service {
public class UsbDriverService extends Service implements UsbDriverListener {
private static final String ACTION_USB_PERMISSION =
"com.limelight.USB_PERMISSION";
@ -29,6 +29,38 @@ public class UsbDriverService extends Service {
private UsbDriverListener listener;
private static int nextDeviceId;
@Override
public void reportControllerState(int controllerId, short buttonFlags, float leftStickX, float leftStickY, float rightStickX, float rightStickY, float leftTrigger, float rightTrigger) {
// Call through to the client's listener
if (listener != null) {
listener.reportControllerState(controllerId, buttonFlags, leftStickX, leftStickY, rightStickX, rightStickY, leftTrigger, rightTrigger);
}
}
@Override
public void deviceRemoved(int controllerId) {
// Remove the the controller from our list (if not removed already)
for (XboxOneController controller : controllers) {
if (controller.getControllerId() == controllerId) {
controllers.remove(controller);
break;
}
}
// Call through to the client's listener
if (listener != null) {
listener.deviceRemoved(controllerId);
}
}
@Override
public void deviceAdded(int controllerId) {
// Call through to the client's listener
if (listener != null) {
listener.deviceAdded(controllerId);
}
}
public class UsbEventReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
@ -56,13 +88,13 @@ public class UsbDriverService extends Service {
public class UsbDriverBinder extends Binder {
public void setListener(UsbDriverListener listener) {
UsbDriverService.this.listener = listener;
updateListeners();
}
}
private void updateListeners() {
for (XboxOneController controller : controllers) {
controller.setListener(listener);
// Report all controllerMap that already exist
if (listener != null) {
for (XboxOneController controller : controllers) {
listener.deviceAdded(controller.getControllerId());
}
}
}
}
@ -80,23 +112,20 @@ public class UsbDriverService extends Service {
UsbDeviceConnection connection = usbManager.openDevice(device);
// Try to initialize it
XboxOneController controller = new XboxOneController(device, connection, nextDeviceId++);
XboxOneController controller = new XboxOneController(device, connection, nextDeviceId++, this);
if (!controller.start()) {
connection.close();
return;
}
// Add to the list
// Add this controller to the list
controllers.add(controller);
// Add listener
updateListeners();
}
}
@Override
public void onCreate() {
usbManager = (UsbManager) getSystemService(Context.USB_SERVICE);
this.usbManager = (UsbManager) getSystemService(Context.USB_SERVICE);
// Register for USB attach broadcasts and permission completions
IntentFilter filter = new IntentFilter();
@ -118,13 +147,13 @@ public class UsbDriverService extends Service {
// Stop the attachment receiver
unregisterReceiver(receiver);
// Remove all listeners
// Remove listeners
listener = null;
updateListeners();
// Stop all controllers
for (XboxOneController controller : controllers) {
controller.stop();
while (controllers.size() > 0) {
// Stop and remove the controller
controllers.remove(0).stop();
}
}

View File

@ -5,7 +5,6 @@ import android.hardware.usb.UsbDevice;
import android.hardware.usb.UsbDeviceConnection;
import android.hardware.usb.UsbEndpoint;
import android.hardware.usb.UsbInterface;
import android.media.MediaCodec;
import com.limelight.LimeLog;
import com.limelight.binding.video.MediaCodecHelper;
@ -35,18 +34,15 @@ public class XboxOneController {
// FIXME: odata_serial
private static final byte[] XB1_INIT_DATA = {0x05, 0x20, 0x00, 0x01, 0x00};
public XboxOneController(UsbDevice device, UsbDeviceConnection connection, int deviceId) {
public XboxOneController(UsbDevice device, UsbDeviceConnection connection, int deviceId, UsbDriverListener listener) {
this.device = device;
this.connection = connection;
this.deviceId = deviceId;
this.listener = listener;
}
public void setListener(UsbDriverListener listener) {
this.listener = listener;
if (listener != null) {
listener.deviceAdded(deviceId);
}
public int getControllerId() {
return this.deviceId;
}
private void setButtonFlag(int buttonFlag, int data) {
@ -59,10 +55,8 @@ public class XboxOneController {
}
private void reportInput() {
if (listener != null) {
listener.reportControllerState(deviceId, buttonFlags, leftStickX, leftStickY,
rightStickX, rightStickY, leftTrigger, rightTrigger);
}
listener.reportControllerState(deviceId, buttonFlags, leftStickX, leftStickY,
rightStickX, rightStickY, leftTrigger, rightTrigger);
}
private void processButtons(ByteBuffer buffer) {
@ -203,21 +197,29 @@ public class XboxOneController {
// Start listening for controller input
startInputThread(inEndpt);
// Report this device added via the listener
listener.deviceAdded(deviceId);
return true;
}
public void stop() {
if (stopped) {
return;
}
stopped = true;
// Stop the input thread
if (inputThread != null) {
inputThread.interrupt();
inputThread = null;
}
if (listener != null) {
listener.deviceRemoved(deviceId);
}
// Report the device removed
listener.deviceRemoved(deviceId);
// Close the USB connection
connection.close();
}