1 /* 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 17 package android.media.midi; 18 19 import android.os.Parcel; 20 import android.os.Parcelable; 21 22 /** 23 * This is an immutable class that describes the current status of a MIDI device's ports. 24 */ 25 public final class MidiDeviceStatus implements Parcelable { 26 27 private static final String TAG = "MidiDeviceStatus"; 28 29 private final MidiDeviceInfo mDeviceInfo; 30 // true if input ports are open 31 private final boolean mInputPortOpen[]; 32 // open counts for output ports 33 private final int mOutputPortOpenCount[]; 34 35 /** 36 * @hide 37 */ MidiDeviceStatus(MidiDeviceInfo deviceInfo, boolean inputPortOpen[], int outputPortOpenCount[])38 public MidiDeviceStatus(MidiDeviceInfo deviceInfo, boolean inputPortOpen[], 39 int outputPortOpenCount[]) { 40 // MidiDeviceInfo is immutable so we can share references 41 mDeviceInfo = deviceInfo; 42 43 // make copies of the arrays 44 mInputPortOpen = new boolean[inputPortOpen.length]; 45 System.arraycopy(inputPortOpen, 0, mInputPortOpen, 0, inputPortOpen.length); 46 mOutputPortOpenCount = new int[outputPortOpenCount.length]; 47 System.arraycopy(outputPortOpenCount, 0, mOutputPortOpenCount, 0, 48 outputPortOpenCount.length); 49 } 50 51 /** 52 * Creates a MidiDeviceStatus with zero for all port open counts 53 * @hide 54 */ MidiDeviceStatus(MidiDeviceInfo deviceInfo)55 public MidiDeviceStatus(MidiDeviceInfo deviceInfo) { 56 mDeviceInfo = deviceInfo; 57 mInputPortOpen = new boolean[deviceInfo.getInputPortCount()]; 58 mOutputPortOpenCount = new int[deviceInfo.getOutputPortCount()]; 59 } 60 61 /** 62 * Returns the {@link MidiDeviceInfo} of the device. 63 * 64 * @return the device info 65 */ getDeviceInfo()66 public MidiDeviceInfo getDeviceInfo() { 67 return mDeviceInfo; 68 } 69 70 /** 71 * Returns true if an input port is open. 72 * An input port can only be opened by one client at a time. 73 * 74 * @param portNumber the input port's port number 75 * @return input port open status 76 */ isInputPortOpen(int portNumber)77 public boolean isInputPortOpen(int portNumber) { 78 return mInputPortOpen[portNumber]; 79 } 80 81 /** 82 * Returns the number of clients currently connected to the specified output port. 83 * Unlike input ports, an output port can be opened by multiple clients at the same time. 84 * 85 * @param portNumber the output port's port number 86 * @return output port open count 87 */ getOutputPortOpenCount(int portNumber)88 public int getOutputPortOpenCount(int portNumber) { 89 return mOutputPortOpenCount[portNumber]; 90 } 91 92 @Override toString()93 public String toString() { 94 int inputPortCount = mDeviceInfo.getInputPortCount(); 95 int outputPortCount = mDeviceInfo.getOutputPortCount(); 96 StringBuilder builder = new StringBuilder("mInputPortOpen=["); 97 for (int i = 0; i < inputPortCount; i++) { 98 builder.append(mInputPortOpen[i]); 99 if (i < inputPortCount -1) { 100 builder.append(","); 101 } 102 } 103 builder.append("] mOutputPortOpenCount=["); 104 for (int i = 0; i < outputPortCount; i++) { 105 builder.append(mOutputPortOpenCount[i]); 106 if (i < outputPortCount -1) { 107 builder.append(","); 108 } 109 } 110 builder.append("]"); 111 return builder.toString(); 112 } 113 114 public static final @android.annotation.NonNull Parcelable.Creator<MidiDeviceStatus> CREATOR = 115 new Parcelable.Creator<MidiDeviceStatus>() { 116 public MidiDeviceStatus createFromParcel(Parcel in) { 117 ClassLoader classLoader = MidiDeviceInfo.class.getClassLoader(); 118 MidiDeviceInfo deviceInfo = in.readParcelable(classLoader); 119 boolean[] inputPortOpen = in.createBooleanArray(); 120 int[] outputPortOpenCount = in.createIntArray(); 121 return new MidiDeviceStatus(deviceInfo, inputPortOpen, outputPortOpenCount); 122 } 123 124 public MidiDeviceStatus[] newArray(int size) { 125 return new MidiDeviceStatus[size]; 126 } 127 }; 128 describeContents()129 public int describeContents() { 130 return 0; 131 } 132 writeToParcel(Parcel parcel, int flags)133 public void writeToParcel(Parcel parcel, int flags) { 134 parcel.writeParcelable(mDeviceInfo, flags); 135 parcel.writeBooleanArray(mInputPortOpen); 136 parcel.writeIntArray(mOutputPortOpenCount); 137 } 138 } 139