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

Commit 87202916 authored by Robert Wu's avatar Robert Wu Committed by Android (Google) Code Review
Browse files

Merge "USB MIDI: Create encoder per output port" into tm-dev

parents 48709c65 d338c3c8
Loading
Loading
Loading
Loading
+9 −2
Original line number Diff line number Diff line
@@ -84,7 +84,7 @@ public final class UsbDirectMidiDevice implements Closeable {
    private final Object mLock = new Object();
    private boolean mIsOpen;

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

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

@@ -264,6 +264,11 @@ public final class UsbDirectMidiDevice implements Closeable {
        Log.d(TAG, "openLocked()");
        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());
        mInputUsbEndpoints = new ArrayList<ArrayList<UsbEndpoint>>(mUsbInterfaces.size());
        mOutputUsbEndpoints = new ArrayList<ArrayList<UsbEndpoint>>(mUsbInterfaces.size());
@@ -415,7 +420,7 @@ public final class UsbDirectMidiDevice implements Closeable {
                            } else {
                                convertedArray =
                                        mUsbMidiPacketConverter.rawMidiToUsbMidi(
                                                 event.data, event.count);
                                                 event.data, event.count, portFinal);
                            }

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

        mUsbMidiPacketConverter = null;

        mIsOpen = false;
    }

+11 −3
Original line number 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_END_EXCLUSIVE = (byte) 0xF7;

    private UsbMidiEncoder mUsbMidiEncoder = new UsbMidiEncoder();
    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.
@@ -93,10 +100,11 @@ public class UsbMidiPacketConverter {
     *
     * @param midiBytes the raw MIDI bytes to convert
     * @param size the size of usbMidiBytes
     * @param encoderId which encoder to use
     * @return byte array of USB MIDI packets
     */
    public byte[] rawMidiToUsbMidi(byte[] midiBytes, int size) {
        return mUsbMidiEncoder.encode(midiBytes, size);
    public byte[] rawMidiToUsbMidi(byte[] midiBytes, int size, int encoderId) {
        return mUsbMidiEncoders[encoderId].encode(midiBytes, size);
    }

    private class UsbMidiDecoder {