diff options
| author | 2022-05-23 14:23:09 +0000 | |
|---|---|---|
| committer | 2022-05-23 14:23:09 +0000 | |
| commit | 63a301c819f099e84c5b4f31fa31c67c80f294fa (patch) | |
| tree | 02db9857d315461e6f438ebc63169cc0af3b4de3 | |
| parent | 37ce6fa22a4f9e067b7db417e6e1a28d4d22645e (diff) | |
| parent | 0559661c13528919c9391aa936abdf409525943d (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.java | 100 |
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"); } |