diff options
| author | Mike Lockwood <lockwood@google.com> | 2015-03-31 16:23:23 +0000 |
|---|---|---|
| committer | Android (Google) Code Review <android-gerrit@google.com> | 2015-03-31 16:23:24 +0000 |
| commit | 63473869da8ea7f39a2b530dd6e026bedc5e6f07 (patch) | |
| tree | 7fbb80aea4b227a2015a44d3c5b37a74c5a040a0 /core/java | |
| parent | 3c0439bed6a59dfdf944ab773148b3b8c8739b01 (diff) | |
| parent | 2776133be7ac60dc8d6aea5b12e35449ca331836 (diff) | |
| download | frameworks_base-63473869da8ea7f39a2b530dd6e026bedc5e6f07.zip frameworks_base-63473869da8ea7f39a2b530dd6e026bedc5e6f07.tar.gz frameworks_base-63473869da8ea7f39a2b530dd6e026bedc5e6f07.tar.bz2 | |
Merge "Add event scheduling support to USB MIDI Manager code"
Diffstat (limited to 'core/java')
| -rw-r--r-- | core/java/com/android/internal/midi/EventScheduler.java | 24 | ||||
| -rw-r--r-- | core/java/com/android/internal/midi/MidiEventScheduler.java | 35 |
2 files changed, 47 insertions, 12 deletions
diff --git a/core/java/com/android/internal/midi/EventScheduler.java b/core/java/com/android/internal/midi/EventScheduler.java index 7526609..7b9a48c 100644 --- a/core/java/com/android/internal/midi/EventScheduler.java +++ b/core/java/com/android/internal/midi/EventScheduler.java @@ -27,10 +27,11 @@ import java.util.TreeMap; public class EventScheduler { private static final long NANOS_PER_MILLI = 1000000; - private final Object lock = new Object(); + private final Object mLock = new Object(); private SortedMap<Long, FastEventQueue> mEventBuffer; private FastEventQueue mEventPool = null; private int mMaxPoolSize = 200; + private boolean mClosed; public EventScheduler() { mEventBuffer = new TreeMap<Long, FastEventQueue>(); @@ -146,7 +147,7 @@ public class EventScheduler { * @param event */ public void add(SchedulableEvent event) { - synchronized (lock) { + synchronized (mLock) { FastEventQueue list = mEventBuffer.get(event.getTimestamp()); if (list == null) { long lowestTime = mEventBuffer.isEmpty() ? Long.MAX_VALUE @@ -156,7 +157,7 @@ public class EventScheduler { // If the event we added is earlier than the previous earliest // event then notify any threads waiting for the next event. if (event.getTimestamp() < lowestTime) { - lock.notify(); + mLock.notify(); } } else { list.add(event); @@ -183,7 +184,7 @@ public class EventScheduler { */ public SchedulableEvent getNextEvent(long time) { SchedulableEvent event = null; - synchronized (lock) { + synchronized (mLock) { if (!mEventBuffer.isEmpty()) { long lowestTime = mEventBuffer.firstKey(); // Is it time for this list to be processed? @@ -206,9 +207,9 @@ public class EventScheduler { */ public SchedulableEvent waitNextEvent() throws InterruptedException { SchedulableEvent event = null; - while (true) { - long millisToWait = Integer.MAX_VALUE; - synchronized (lock) { + synchronized (mLock) { + while (!mClosed) { + long millisToWait = Integer.MAX_VALUE; if (!mEventBuffer.isEmpty()) { long now = System.nanoTime(); long lowestTime = mEventBuffer.firstKey(); @@ -228,9 +229,16 @@ public class EventScheduler { } } } - lock.wait((int) millisToWait); + mLock.wait((int) millisToWait); } } return event; } + + public void close() { + synchronized (mLock) { + mClosed = true; + mLock.notify(); + } + } } diff --git a/core/java/com/android/internal/midi/MidiEventScheduler.java b/core/java/com/android/internal/midi/MidiEventScheduler.java index 3a1d3fc..42d70f6 100644 --- a/core/java/com/android/internal/midi/MidiEventScheduler.java +++ b/core/java/com/android/internal/midi/MidiEventScheduler.java @@ -28,10 +28,16 @@ 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 MidiReceiver mReceiver = new SchedulingReceiver(); - private class SchedulingReceiver extends MidiReceiver - { + private final MidiReceiver[] mReceivers; + + 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. @@ -41,12 +47,14 @@ public class MidiEventScheduler extends EventScheduler { throws IOException { MidiEvent event = createScheduledEvent(msg, offset, count, timestamp); if (event != null) { + event.portNumber = mPortNumber; add(event); } } } public static class MidiEvent extends SchedulableEvent { + public int portNumber; public int count = 0; public byte[] data; @@ -72,6 +80,17 @@ 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. */ @@ -113,7 +132,15 @@ public class MidiEventScheduler extends EventScheduler { * @return the MidiReceiver */ public MidiReceiver getReceiver() { - return mReceiver; + return mReceivers[0]; + } + + /** + * This MidiReceiver will write date to the scheduling buffer. + * @return the MidiReceiver + */ + public MidiReceiver getReceiver(int portNumber) { + return mReceivers[portNumber]; } } |
