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

Commit b6f50d35 authored by Mike Lockwood's avatar Mike Lockwood
Browse files

Add support for flushing MIDI all scheduled MIDI events on a port

Change-Id: I39d7862540d4d4b9e2df1265f9dd253541adb4c2
parent 52f57de9
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -16847,6 +16847,7 @@ package android.media.midi {
  public abstract class MidiReceiver {
    ctor public MidiReceiver();
    method public void flush() throws java.io.IOException;
    method public int getMaxMessageSize();
    method public abstract void onReceive(byte[], int, int, long) throws java.io.IOException;
    method public void send(byte[], int, int) throws java.io.IOException;
+1 −0
Original line number Diff line number Diff line
@@ -18122,6 +18122,7 @@ package android.media.midi {
  public abstract class MidiReceiver {
    ctor public MidiReceiver();
    method public void flush() throws java.io.IOException;
    method public int getMaxMessageSize();
    method public abstract void onReceive(byte[], int, int, long) throws java.io.IOException;
    method public void send(byte[], int, int) throws java.io.IOException;
+9 −2
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package com.android.internal.midi;

import java.util.Iterator;
import java.util.SortedMap;
import java.util.TreeMap;

@@ -28,7 +29,7 @@ public class EventScheduler {
    private static final long NANOS_PER_MILLI = 1000000;

    private final Object mLock = new Object();
    private SortedMap<Long, FastEventQueue> mEventBuffer;
    volatile private SortedMap<Long, FastEventQueue> mEventBuffer;
    private FastEventQueue mEventPool = null;
    private int mMaxPoolSize = 200;
    private boolean mClosed;
@@ -68,6 +69,7 @@ public class EventScheduler {
            mEventsRemoved++;
            SchedulableEvent event = mFirst;
            mFirst = event.mNext;
            event.mNext = null;
            return event;
        }

@@ -87,7 +89,7 @@ public class EventScheduler {
     */
    public static class SchedulableEvent {
        private long mTimestamp;
        private SchedulableEvent mNext = null;
        volatile private SchedulableEvent mNext = null;

        /**
         * @param timestamp
@@ -235,6 +237,11 @@ public class EventScheduler {
        return event;
    }

    protected void flush() {
        // Replace our event buffer with a fresh empty one
        mEventBuffer = new TreeMap<Long, FastEventQueue>();
    }

    public void close() {
        synchronized (mLock) {
            mClosed = true;
+7 −0
Original line number Diff line number Diff line
@@ -83,4 +83,11 @@ public final class MidiDispatcher extends MidiReceiver {
            }
        }
    }

    @Override
    public void flush() throws IOException {
       for (MidiReceiver receiver : mReceivers) {
            receiver.flush();
       }
    }
}
+7 −30
Original line number Diff line number Diff line
@@ -28,16 +28,9 @@ public class MidiEventScheduler extends EventScheduler {
    // Maintain a pool of scheduled events to reduce memory allocation.
    // This pool increases performance by about 14%.
    private final static int POOL_EVENT_SIZE = 16;

    private final MidiReceiver[] mReceivers;
    private MidiReceiver mReceiver = new SchedulingReceiver();

    private class SchedulingReceiver extends MidiReceiver {
        private final int mPortNumber;

        public SchedulingReceiver(int portNumber) {
            mPortNumber = portNumber;
        }

        /**
         * Store these bytes in the EventScheduler to be delivered at the specified
         * time.
@@ -47,14 +40,17 @@ public class MidiEventScheduler extends EventScheduler {
                throws IOException {
            MidiEvent event = createScheduledEvent(msg, offset, count, timestamp);
            if (event != null) {
                event.portNumber = mPortNumber;
                add(event);
            }
        }

        @Override
        public void flush() {
            MidiEventScheduler.this.flush();
        }
    }

    public static class MidiEvent extends SchedulableEvent {
        public int portNumber;
        public int count = 0;
        public byte[] data;

@@ -80,17 +76,6 @@ public class MidiEventScheduler extends EventScheduler {
        }
    }

    public MidiEventScheduler() {
        this(0);
    }

    public MidiEventScheduler(int portCount) {
        mReceivers = new MidiReceiver[portCount];
        for (int i = 0; i < portCount; i++) {
            mReceivers[i] = new SchedulingReceiver(i);
        }
    }

    /**
     * Create an event that contains the message.
     */
@@ -132,15 +117,7 @@ public class MidiEventScheduler extends EventScheduler {
     * @return the MidiReceiver
     */
    public MidiReceiver getReceiver() {
        return mReceivers[0];
    }

    /**
     * This MidiReceiver will write date to the scheduling buffer.
     * @return the MidiReceiver
     */
    public MidiReceiver getReceiver(int portNumber) {
        return mReceivers[portNumber];
        return mReceiver;
    }

}
Loading