Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 962e94ec authored by Robert Wu's avatar Robert Wu Committed by Presubmit Automerger Backend
Browse files

[automerge] USB MIDI: Create encoder per output port 2p: d338c3c8

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/17293673

Bug: 225884009
Change-Id: Ib8262c68ba5cac5ac8b3e55e66973c775c459c05
parents bd35cfbd d338c3c8
Loading
Loading
Loading
Loading
+9 −2
Original line number Original line Diff line number Diff line
@@ -84,7 +84,7 @@ public final class UsbDirectMidiDevice implements Closeable {
    private final Object mLock = new Object();
    private final Object mLock = new Object();
    private boolean mIsOpen;
    private boolean mIsOpen;


    private final UsbMidiPacketConverter mUsbMidiPacketConverter = new UsbMidiPacketConverter();
    private UsbMidiPacketConverter mUsbMidiPacketConverter;


    private final MidiDeviceServer.Callback mCallback = new MidiDeviceServer.Callback() {
    private final MidiDeviceServer.Callback mCallback = new MidiDeviceServer.Callback() {


@@ -264,6 +264,11 @@ public final class UsbDirectMidiDevice implements Closeable {
        Log.d(TAG, "openLocked()");
        Log.d(TAG, "openLocked()");
        UsbManager manager = mContext.getSystemService(UsbManager.class);
        UsbManager manager = mContext.getSystemService(UsbManager.class);


        // Converting from raw MIDI to USB MIDI is not thread-safe.
        // UsbMidiPacketConverter creates a converter from raw MIDI
        // to USB MIDI for each USB output.
        mUsbMidiPacketConverter = new UsbMidiPacketConverter(mNumOutputs);

        mUsbDeviceConnections = new ArrayList<UsbDeviceConnection>(mUsbInterfaces.size());
        mUsbDeviceConnections = new ArrayList<UsbDeviceConnection>(mUsbInterfaces.size());
        mInputUsbEndpoints = new ArrayList<ArrayList<UsbEndpoint>>(mUsbInterfaces.size());
        mInputUsbEndpoints = new ArrayList<ArrayList<UsbEndpoint>>(mUsbInterfaces.size());
        mOutputUsbEndpoints = new ArrayList<ArrayList<UsbEndpoint>>(mUsbInterfaces.size());
        mOutputUsbEndpoints = new ArrayList<ArrayList<UsbEndpoint>>(mUsbInterfaces.size());
@@ -415,7 +420,7 @@ public final class UsbDirectMidiDevice implements Closeable {
                            } else {
                            } else {
                                convertedArray =
                                convertedArray =
                                        mUsbMidiPacketConverter.rawMidiToUsbMidi(
                                        mUsbMidiPacketConverter.rawMidiToUsbMidi(
                                                 event.data, event.count);
                                                 event.data, event.count, portFinal);
                            }
                            }


                            if (DEBUG) {
                            if (DEBUG) {
@@ -518,6 +523,8 @@ public final class UsbDirectMidiDevice implements Closeable {
        mInputUsbEndpoints = null;
        mInputUsbEndpoints = null;
        mOutputUsbEndpoints = null;
        mOutputUsbEndpoints = null;


        mUsbMidiPacketConverter = null;

        mIsOpen = false;
        mIsOpen = false;
    }
    }


+11 −3
Original line number Original line Diff line number Diff line
@@ -74,8 +74,15 @@ public class UsbMidiPacketConverter {
    private static final byte SYSEX_START_EXCLUSIVE = (byte) 0xF0;
    private static final byte SYSEX_START_EXCLUSIVE = (byte) 0xF0;
    private static final byte SYSEX_END_EXCLUSIVE = (byte) 0xF7;
    private static final byte SYSEX_END_EXCLUSIVE = (byte) 0xF7;


    private UsbMidiEncoder mUsbMidiEncoder = new UsbMidiEncoder();
    private UsbMidiDecoder mUsbMidiDecoder = new UsbMidiDecoder();
    private UsbMidiDecoder mUsbMidiDecoder = new UsbMidiDecoder();
    private UsbMidiEncoder[] mUsbMidiEncoders;

    public UsbMidiPacketConverter(int numEncoders) {
        mUsbMidiEncoders = new UsbMidiEncoder[numEncoders];
        for (int i = 0; i < numEncoders; i++) {
            mUsbMidiEncoders[i] = new UsbMidiEncoder();
        }
    }


    /**
    /**
     * Converts a USB MIDI array into a raw MIDI array.
     * Converts a USB MIDI array into a raw MIDI array.
@@ -93,10 +100,11 @@ public class UsbMidiPacketConverter {
     *
     *
     * @param midiBytes the raw MIDI bytes to convert
     * @param midiBytes the raw MIDI bytes to convert
     * @param size the size of usbMidiBytes
     * @param size the size of usbMidiBytes
     * @param encoderId which encoder to use
     * @return byte array of USB MIDI packets
     * @return byte array of USB MIDI packets
     */
     */
    public byte[] rawMidiToUsbMidi(byte[] midiBytes, int size) {
    public byte[] rawMidiToUsbMidi(byte[] midiBytes, int size, int encoderId) {
        return mUsbMidiEncoder.encode(midiBytes, size);
        return mUsbMidiEncoders[encoderId].encode(midiBytes, size);
    }
    }


    private class UsbMidiDecoder {
    private class UsbMidiDecoder {