blob: 1a3c37c79cd2b0c8ac83454183611333a97d9e6a [file] [log] [blame]
Mike Lockwood11fd96d2015-03-02 12:07:49 -08001/*
2 * Copyright (C) 2015 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Mike Lockwoodd1b16fe2015-03-30 08:39:09 -070017package com.android.internal.midi;
18
19import android.media.midi.MidiReceiver;
20import android.media.midi.MidiSender;
Mike Lockwood11fd96d2015-03-02 12:07:49 -080021
22import java.io.IOException;
Mike Lockwoodbe215dd2015-03-07 11:04:59 -080023import java.util.concurrent.CopyOnWriteArrayList;
Mike Lockwood11fd96d2015-03-02 12:07:49 -080024
25/**
Mike Lockwoodd1b16fe2015-03-30 08:39:09 -070026 * Utility class for dispatching MIDI data to a list of {@link android.media.midi.MidiReceiver}s.
27 * This class subclasses {@link android.media.midi.MidiReceiver} and dispatches any data it receives
Mike Lockwood11fd96d2015-03-02 12:07:49 -080028 * to its receiver list. Any receivers that throw an exception upon receiving data will
29 * be automatically removed from the receiver list, but no IOException will be returned
Mike Lockwood7eb441c2015-05-12 13:32:16 -070030 * from the dispatcher's {@link android.media.midi.MidiReceiver#onSend} in that case.
Mike Lockwood11fd96d2015-03-02 12:07:49 -080031 */
Mike Lockwoodbe215dd2015-03-07 11:04:59 -080032public final class MidiDispatcher extends MidiReceiver {
Mike Lockwood11fd96d2015-03-02 12:07:49 -080033
Mike Lockwoodbe215dd2015-03-07 11:04:59 -080034 private final CopyOnWriteArrayList<MidiReceiver> mReceivers
35 = new CopyOnWriteArrayList<MidiReceiver>();
Mike Lockwood11fd96d2015-03-02 12:07:49 -080036
37 private final MidiSender mSender = new MidiSender() {
Mike Lockwood7eb441c2015-05-12 13:32:16 -070038 @Override
39 public void onConnect(MidiReceiver receiver) {
Mike Lockwood11fd96d2015-03-02 12:07:49 -080040 mReceivers.add(receiver);
41 }
42
Mike Lockwood7eb441c2015-05-12 13:32:16 -070043 @Override
44 public void onDisconnect(MidiReceiver receiver) {
Mike Lockwood11fd96d2015-03-02 12:07:49 -080045 mReceivers.remove(receiver);
46 }
47 };
48
49 /**
Mike Lockwoodd1b16fe2015-03-30 08:39:09 -070050 * Returns the number of {@link android.media.midi.MidiReceiver}s this dispatcher contains.
Mike Lockwood5ff9e2a2015-03-09 12:00:20 -070051 * @return the number of receivers
Mike Lockwood11fd96d2015-03-02 12:07:49 -080052 */
Mike Lockwood5ff9e2a2015-03-09 12:00:20 -070053 public int getReceiverCount() {
54 return mReceivers.size();
Mike Lockwood11fd96d2015-03-02 12:07:49 -080055 }
56
57 /**
Mike Lockwoodd1b16fe2015-03-30 08:39:09 -070058 * Returns a {@link android.media.midi.MidiSender} which is used to add and remove
59 * {@link android.media.midi.MidiReceiver}s
Mike Lockwood11fd96d2015-03-02 12:07:49 -080060 * to the dispatcher's receiver list.
61 * @return the dispatcher's MidiSender
62 */
63 public MidiSender getSender() {
64 return mSender;
65 }
66
67 @Override
Mike Lockwood7eb441c2015-05-12 13:32:16 -070068 public void onSend(byte[] msg, int offset, int count, long timestamp) throws IOException {
Mike Lockwoodbe215dd2015-03-07 11:04:59 -080069 for (MidiReceiver receiver : mReceivers) {
70 try {
Mike Lockwood7eb441c2015-05-12 13:32:16 -070071 receiver.send(msg, offset, count, timestamp);
Mike Lockwoodbe215dd2015-03-07 11:04:59 -080072 } catch (IOException e) {
Mike Lockwood0c7342f2015-03-09 15:03:11 -070073 // if the receiver fails we remove the receiver but do not propagate the exception
Mike Lockwoodbe215dd2015-03-07 11:04:59 -080074 mReceivers.remove(receiver);
Mike Lockwood11fd96d2015-03-02 12:07:49 -080075 }
76 }
77 }
Mike Lockwoodb6f50d32015-04-08 08:45:37 -070078
79 @Override
Mike Lockwood7eb441c2015-05-12 13:32:16 -070080 public void onFlush() throws IOException {
Mike Lockwoodb6f50d32015-04-08 08:45:37 -070081 for (MidiReceiver receiver : mReceivers) {
82 receiver.flush();
83 }
84 }
Mike Lockwood11fd96d2015-03-02 12:07:49 -080085}