mirror of
https://github.com/moonlight-stream/moonlight-android.git
synced 2025-07-21 12:03:02 +00:00
Fix some listener bugs in the XB1 driver
This commit is contained in:
parent
d740e7a521
commit
4486a126ad
@ -14,7 +14,7 @@ import android.os.IBinder;
|
|||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|
||||||
public class UsbDriverService extends Service {
|
public class UsbDriverService extends Service implements UsbDriverListener {
|
||||||
|
|
||||||
private static final String ACTION_USB_PERMISSION =
|
private static final String ACTION_USB_PERMISSION =
|
||||||
"com.limelight.USB_PERMISSION";
|
"com.limelight.USB_PERMISSION";
|
||||||
@ -29,6 +29,38 @@ public class UsbDriverService extends Service {
|
|||||||
private UsbDriverListener listener;
|
private UsbDriverListener listener;
|
||||||
private static int nextDeviceId;
|
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 {
|
public class UsbEventReceiver extends BroadcastReceiver {
|
||||||
@Override
|
@Override
|
||||||
public void onReceive(Context context, Intent intent) {
|
public void onReceive(Context context, Intent intent) {
|
||||||
@ -56,13 +88,13 @@ public class UsbDriverService extends Service {
|
|||||||
public class UsbDriverBinder extends Binder {
|
public class UsbDriverBinder extends Binder {
|
||||||
public void setListener(UsbDriverListener listener) {
|
public void setListener(UsbDriverListener listener) {
|
||||||
UsbDriverService.this.listener = listener;
|
UsbDriverService.this.listener = listener;
|
||||||
updateListeners();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void updateListeners() {
|
// Report all controllerMap that already exist
|
||||||
for (XboxOneController controller : controllers) {
|
if (listener != null) {
|
||||||
controller.setListener(listener);
|
for (XboxOneController controller : controllers) {
|
||||||
|
listener.deviceAdded(controller.getControllerId());
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -80,23 +112,20 @@ public class UsbDriverService extends Service {
|
|||||||
UsbDeviceConnection connection = usbManager.openDevice(device);
|
UsbDeviceConnection connection = usbManager.openDevice(device);
|
||||||
|
|
||||||
// Try to initialize it
|
// Try to initialize it
|
||||||
XboxOneController controller = new XboxOneController(device, connection, nextDeviceId++);
|
XboxOneController controller = new XboxOneController(device, connection, nextDeviceId++, this);
|
||||||
if (!controller.start()) {
|
if (!controller.start()) {
|
||||||
connection.close();
|
connection.close();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add to the list
|
// Add this controller to the list
|
||||||
controllers.add(controller);
|
controllers.add(controller);
|
||||||
|
|
||||||
// Add listener
|
|
||||||
updateListeners();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCreate() {
|
public void onCreate() {
|
||||||
usbManager = (UsbManager) getSystemService(Context.USB_SERVICE);
|
this.usbManager = (UsbManager) getSystemService(Context.USB_SERVICE);
|
||||||
|
|
||||||
// Register for USB attach broadcasts and permission completions
|
// Register for USB attach broadcasts and permission completions
|
||||||
IntentFilter filter = new IntentFilter();
|
IntentFilter filter = new IntentFilter();
|
||||||
@ -118,13 +147,13 @@ public class UsbDriverService extends Service {
|
|||||||
// Stop the attachment receiver
|
// Stop the attachment receiver
|
||||||
unregisterReceiver(receiver);
|
unregisterReceiver(receiver);
|
||||||
|
|
||||||
// Remove all listeners
|
// Remove listeners
|
||||||
listener = null;
|
listener = null;
|
||||||
updateListeners();
|
|
||||||
|
|
||||||
// Stop all controllers
|
// Stop all controllers
|
||||||
for (XboxOneController controller : controllers) {
|
while (controllers.size() > 0) {
|
||||||
controller.stop();
|
// Stop and remove the controller
|
||||||
|
controllers.remove(0).stop();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5,7 +5,6 @@ import android.hardware.usb.UsbDevice;
|
|||||||
import android.hardware.usb.UsbDeviceConnection;
|
import android.hardware.usb.UsbDeviceConnection;
|
||||||
import android.hardware.usb.UsbEndpoint;
|
import android.hardware.usb.UsbEndpoint;
|
||||||
import android.hardware.usb.UsbInterface;
|
import android.hardware.usb.UsbInterface;
|
||||||
import android.media.MediaCodec;
|
|
||||||
|
|
||||||
import com.limelight.LimeLog;
|
import com.limelight.LimeLog;
|
||||||
import com.limelight.binding.video.MediaCodecHelper;
|
import com.limelight.binding.video.MediaCodecHelper;
|
||||||
@ -35,18 +34,15 @@ public class XboxOneController {
|
|||||||
// FIXME: odata_serial
|
// FIXME: odata_serial
|
||||||
private static final byte[] XB1_INIT_DATA = {0x05, 0x20, 0x00, 0x01, 0x00};
|
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.device = device;
|
||||||
this.connection = connection;
|
this.connection = connection;
|
||||||
this.deviceId = deviceId;
|
this.deviceId = deviceId;
|
||||||
|
this.listener = listener;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setListener(UsbDriverListener listener) {
|
public int getControllerId() {
|
||||||
this.listener = listener;
|
return this.deviceId;
|
||||||
|
|
||||||
if (listener != null) {
|
|
||||||
listener.deviceAdded(deviceId);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setButtonFlag(int buttonFlag, int data) {
|
private void setButtonFlag(int buttonFlag, int data) {
|
||||||
@ -59,10 +55,8 @@ public class XboxOneController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void reportInput() {
|
private void reportInput() {
|
||||||
if (listener != null) {
|
listener.reportControllerState(deviceId, buttonFlags, leftStickX, leftStickY,
|
||||||
listener.reportControllerState(deviceId, buttonFlags, leftStickX, leftStickY,
|
rightStickX, rightStickY, leftTrigger, rightTrigger);
|
||||||
rightStickX, rightStickY, leftTrigger, rightTrigger);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void processButtons(ByteBuffer buffer) {
|
private void processButtons(ByteBuffer buffer) {
|
||||||
@ -203,21 +197,29 @@ public class XboxOneController {
|
|||||||
// Start listening for controller input
|
// Start listening for controller input
|
||||||
startInputThread(inEndpt);
|
startInputThread(inEndpt);
|
||||||
|
|
||||||
|
// Report this device added via the listener
|
||||||
|
listener.deviceAdded(deviceId);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void stop() {
|
public void stop() {
|
||||||
|
if (stopped) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
stopped = true;
|
stopped = true;
|
||||||
|
|
||||||
|
// Stop the input thread
|
||||||
if (inputThread != null) {
|
if (inputThread != null) {
|
||||||
inputThread.interrupt();
|
inputThread.interrupt();
|
||||||
inputThread = null;
|
inputThread = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (listener != null) {
|
// Report the device removed
|
||||||
listener.deviceRemoved(deviceId);
|
listener.deviceRemoved(deviceId);
|
||||||
}
|
|
||||||
|
|
||||||
|
// Close the USB connection
|
||||||
connection.close();
|
connection.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user