summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Robert Wu <robertwu@google.com> 2022-05-23 14:23:09 +0000
committer Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> 2022-05-23 14:23:09 +0000
commit63a301c819f099e84c5b4f31fa31c67c80f294fa (patch)
tree02db9857d315461e6f438ebc63169cc0af3b4de3
parent37ce6fa22a4f9e067b7db417e6e1a28d4d22645e (diff)
parent0559661c13528919c9391aa936abdf409525943d (diff)
Merge "USB MIDI: Null check for mUsbMidiPacketConverter" into tm-dev am: 0559661c13
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/18529017 Change-Id: Iedbb0337ee6c5d017425bb2765c3ce23c7bb5515 Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
-rw-r--r--services/usb/java/com/android/server/usb/UsbDirectMidiDevice.java100
1 files changed, 60 insertions, 40 deletions
diff --git a/services/usb/java/com/android/server/usb/UsbDirectMidiDevice.java b/services/usb/java/com/android/server/usb/UsbDirectMidiDevice.java
index df9fc6601ac5..15e5e6465643 100644
--- a/services/usb/java/com/android/server/usb/UsbDirectMidiDevice.java
+++ b/services/usb/java/com/android/server/usb/UsbDirectMidiDevice.java
@@ -81,7 +81,7 @@ public final class UsbDirectMidiDevice implements Closeable {
private static final int BULK_TRANSFER_TIMEOUT_MILLISECONDS = 10;
// Arbitrary number for timeout when closing a thread
- private static final int THREAD_JOIN_TIMEOUT_MILLISECONDS = 50;
+ private static final int THREAD_JOIN_TIMEOUT_MILLISECONDS = 200;
private ArrayList<UsbDeviceConnection> mUsbDeviceConnections;
private ArrayList<ArrayList<UsbEndpoint>> mInputUsbEndpoints;
@@ -370,6 +370,10 @@ public final class UsbDirectMidiDevice implements Closeable {
convertedArray = swapEndiannessPerWord(inputBuffer,
bytesRead);
} else {
+ if (mUsbMidiPacketConverter == null) {
+ Log.w(TAG, "mUsbMidiPacketConverter is null");
+ break;
+ }
convertedArray =
mUsbMidiPacketConverter.usbMidiToRawMidi(
inputBuffer, bytesRead);
@@ -379,12 +383,20 @@ public final class UsbDirectMidiDevice implements Closeable {
logByteArray("Input after conversion ", convertedArray,
0, convertedArray.length);
}
+
+ if ((outputReceivers == null)
+ || (outputReceivers[portFinal] == null)) {
+ Log.w(TAG, "outputReceivers is null");
+ break;
+ }
outputReceivers[portFinal].send(convertedArray, 0,
convertedArray.length, timestamp);
}
}
} catch (IOException e) {
Log.d(TAG, "reader thread exiting");
+ } catch (NullPointerException e) {
+ Log.e(TAG, "input thread: ", e);
} finally {
request.close();
}
@@ -414,49 +426,57 @@ public final class UsbDirectMidiDevice implements Closeable {
Thread newThread = new Thread("UsbDirectMidiDevice output thread " + portFinal) {
@Override
public void run() {
- while (true) {
- if (Thread.currentThread().interrupted()) {
- Log.w(TAG, "output thread interrupted");
- break;
- }
- MidiEvent event;
- try {
- event = (MidiEvent) eventSchedulerFinal.waitNextEvent();
- } catch (InterruptedException e) {
- Log.w(TAG, "event scheduler interrupted");
- break;
- }
- if (event == null) {
- Log.w(TAG, "event is null");
- break;
- }
+ try {
+ while (true) {
+ if (Thread.currentThread().interrupted()) {
+ Log.w(TAG, "output thread interrupted");
+ break;
+ }
+ MidiEvent event;
+ try {
+ event = (MidiEvent) eventSchedulerFinal.waitNextEvent();
+ } catch (InterruptedException e) {
+ Log.w(TAG, "event scheduler interrupted");
+ break;
+ }
+ if (event == null) {
+ Log.w(TAG, "event is null");
+ break;
+ }
- if (DEBUG) {
- logByteArray("Output before conversion ", event.data, 0,
- event.count);
- }
+ if (DEBUG) {
+ logByteArray("Output before conversion ", event.data, 0,
+ event.count);
+ }
- byte[] convertedArray;
- if (mIsUniversalMidiDevice) {
- // For USB, each 32 bit word of a UMP is
- // sent with the least significant byte first.
- convertedArray = swapEndiannessPerWord(event.data,
- event.count);
- } else {
- convertedArray =
- mUsbMidiPacketConverter.rawMidiToUsbMidi(
- event.data, event.count, portFinal);
- }
+ byte[] convertedArray;
+ if (mIsUniversalMidiDevice) {
+ // For USB, each 32 bit word of a UMP is
+ // sent with the least significant byte first.
+ convertedArray = swapEndiannessPerWord(event.data,
+ event.count);
+ } else {
+ if (mUsbMidiPacketConverter == null) {
+ Log.w(TAG, "mUsbMidiPacketConverter is null");
+ break;
+ }
+ convertedArray =
+ mUsbMidiPacketConverter.rawMidiToUsbMidi(
+ event.data, event.count, portFinal);
+ }
- if (DEBUG) {
- logByteArray("Output after conversion ", convertedArray, 0,
- convertedArray.length);
- }
+ if (DEBUG) {
+ logByteArray("Output after conversion ", convertedArray, 0,
+ convertedArray.length);
+ }
- connectionFinal.bulkTransfer(endpointFinal, convertedArray,
- convertedArray.length,
- BULK_TRANSFER_TIMEOUT_MILLISECONDS);
- eventSchedulerFinal.addEventToPool(event);
+ connectionFinal.bulkTransfer(endpointFinal, convertedArray,
+ convertedArray.length,
+ BULK_TRANSFER_TIMEOUT_MILLISECONDS);
+ eventSchedulerFinal.addEventToPool(event);
+ }
+ } catch (NullPointerException e) {
+ Log.e(TAG, "output thread: ", e);
}
Log.d(TAG, "output thread exit");
}