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

Commit 98cc8e5a authored by Mike Lockwood's avatar Mike Lockwood
Browse files

MidiManager bug fixing:

- fix off by one error that caused failure handling one byte messages

- poll thread now terminates properly in UsbMidiDevice

- fix cleanup logic in MidiDeviceServer

Change-Id: I0c13a98b6542cfb271b51678e81d1822c8da2985
parent 10024b3d
Loading
Loading
Loading
Loading
+5 −8
Original line number Original line Diff line number Diff line
@@ -57,7 +57,7 @@ public final class MidiDeviceServer implements Closeable {
        @Override
        @Override
        public void onIOException() {
        public void onIOException() {
            synchronized (mOutputPortReceivers) {
            synchronized (mOutputPortReceivers) {
                mOutputPortReceivers[getPortNumber()] = null;
                mOutputPortReceivers[getPortNumber()].clear();
            }
            }
        }
        }
    }
    }
@@ -88,7 +88,6 @@ public final class MidiDeviceServer implements Closeable {
            }
            }


            ParcelFileDescriptor result = null;
            ParcelFileDescriptor result = null;
            MidiOutputPort newOutputPort = null;


            synchronized (mInputPortSenders) {
            synchronized (mInputPortSenders) {
                if (mInputPortSenders[portNumber] != null) {
                if (mInputPortSenders[portNumber] != null) {
@@ -99,21 +98,19 @@ public final class MidiDeviceServer implements Closeable {
                try {
                try {
                    ParcelFileDescriptor[] pair = ParcelFileDescriptor.createSocketPair(
                    ParcelFileDescriptor[] pair = ParcelFileDescriptor.createSocketPair(
                                                        OsConstants.SOCK_SEQPACKET);
                                                        OsConstants.SOCK_SEQPACKET);
                    newOutputPort = new ServerOutputPort(pair[0], portNumber);
                    MidiOutputPort newOutputPort = new ServerOutputPort(pair[0], portNumber);
                    mInputPortSenders[portNumber] = newOutputPort;
                    mInputPortSenders[portNumber] = newOutputPort;
                    result =  pair[1];
                    result =  pair[1];
                } catch (IOException e) {
                    Log.e(TAG, "unable to create ParcelFileDescriptors in openInputPort");
                    return null;
                }


                if (newOutputPort != null) {
                    ArrayList<MidiReceiver> receivers = mInputPortReceivers[portNumber];
                    ArrayList<MidiReceiver> receivers = mInputPortReceivers[portNumber];
                    synchronized (receivers) {
                    synchronized (receivers) {
                        for (int i = 0; i < receivers.size(); i++) {
                        for (int i = 0; i < receivers.size(); i++) {
                            newOutputPort.connect(receivers.get(i));
                            newOutputPort.connect(receivers.get(i));
                        }
                        }
                    }
                    }
                } catch (IOException e) {
                    Log.e(TAG, "unable to create ParcelFileDescriptors in openInputPort");
                    return null;
                }
                }
            }
            }


+4 −2
Original line number Original line Diff line number Diff line
@@ -52,9 +52,11 @@ public class MidiOutputPort extends MidiPort implements MidiSender {
                while (true) {
                while (true) {
                    // read next event
                    // read next event
                    int count = mInputStream.read(buffer);
                    int count = mInputStream.read(buffer);
                    if (count < MIN_PACKED_MESSAGE_SIZE || count > MAX_PACKED_MESSAGE_SIZE) {
                    if (count < 0) {
                        Log.e(TAG, "Number of bytes read out of range: " + count);
                        break;
                        break;
                    } else if (count < MIN_PACKED_MESSAGE_SIZE || count > MAX_PACKED_MESSAGE_SIZE) {
                        Log.e(TAG, "Number of bytes read out of range: " + count);
                        continue;
                    }
                    }


                    int offset = getMessageOffset(buffer, count);
                    int offset = getMessageOffset(buffer, count);
+4 −4
Original line number Original line Diff line number Diff line
@@ -33,15 +33,15 @@ abstract public class MidiPort implements Closeable {


    /**
    /**
     * Minimum size of packed message as sent through our ParcelFileDescriptor
     * Minimum size of packed message as sent through our ParcelFileDescriptor
     * 8 bytes for timestamp, 1 byte for port number and 1 to 3 bytes for message
     * 8 bytes for timestamp and 1 to 3 bytes for message
     */
     */
    protected static final int MIN_PACKED_MESSAGE_SIZE = 10;
    protected static final int MIN_PACKED_MESSAGE_SIZE = 9;


    /**
    /**
     * Maximum size of packed message as sent through our ParcelFileDescriptor
     * Maximum size of packed message as sent through our ParcelFileDescriptor
     * 8 bytes for timestamp, 1 byte for port number and 1 to 3 bytes for message
     * 8 bytes for timestamp and 1 to 3 bytes for message
     */
     */
    protected static final int MAX_PACKED_MESSAGE_SIZE = 12;
    protected static final int MAX_PACKED_MESSAGE_SIZE = 11;




  /* package */ MidiPort(int portNumber) {
  /* package */ MidiPort(int portNumber) {
+7 −2
Original line number Original line Diff line number Diff line
@@ -133,7 +133,8 @@ public final class UsbMidiDevice implements Closeable {
            public void run() {
            public void run() {
                byte[] buffer = new byte[3];
                byte[] buffer = new byte[3];
                try {
                try {
                    while (true) {
                    boolean done = false;
                    while (!done) {
                        // look for a readable FileDescriptor
                        // look for a readable FileDescriptor
                        for (int index = 0; index < mPollFDs.length; index++) {
                        for (int index = 0; index < mPollFDs.length; index++) {
                            StructPollfd pfd = mPollFDs[index];
                            StructPollfd pfd = mPollFDs[index];
@@ -141,7 +142,11 @@ public final class UsbMidiDevice implements Closeable {
                                // clear readable flag
                                // clear readable flag
                                pfd.revents = 0;
                                pfd.revents = 0;
                                int count = readMessage(buffer, index);
                                int count = readMessage(buffer, index);
                                mOutputPortReceivers[index].onPost(buffer, 0, count, System.nanoTime());
                                mOutputPortReceivers[index].onPost(buffer, 0, count,
                                        System.nanoTime());
                            } else if ((pfd.revents & (OsConstants.POLLERR
                                                        | OsConstants.POLLHUP)) != 0) {
                                done = true;
                            }
                            }
                        }
                        }