summaryrefslogtreecommitdiffstats
path: root/core/java
diff options
context:
space:
mode:
Diffstat (limited to 'core/java')
-rw-r--r--core/java/com/android/internal/midi/EventScheduler.java24
-rw-r--r--core/java/com/android/internal/midi/MidiEventScheduler.java35
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];
}
}