15ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood/*
25ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood * Copyright (C) 2015 The Android Open Source Project
35ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood *
45ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood * Licensed under the Apache License, Version 2.0 (the "License");
55ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood * you may not use this file except in compliance with the License.
65ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood * You may obtain a copy of the License at
75ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood *
85ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood *      http://www.apache.org/licenses/LICENSE-2.0
95ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood *
105ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood * Unless required by applicable law or agreed to in writing, software
115ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood * distributed under the License is distributed on an "AS IS" BASIS,
125ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood * See the License for the specific language governing permissions and
145ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood * limitations under the License.
155ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood */
165ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood
175ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwoodpackage android.media.midi;
185ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood
195ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwoodimport android.os.Parcel;
205ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwoodimport android.os.Parcelable;
215ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood
225ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood/**
235ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood * This is an immutable class that describes the current status of a MIDI device's ports.
245ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood */
255ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwoodpublic final class MidiDeviceStatus implements Parcelable {
265ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood
275ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood    private static final String TAG = "MidiDeviceStatus";
285ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood
295ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood    private final MidiDeviceInfo mDeviceInfo;
3081b9f7d325a552c54e793b51f571ae3d65b26e94Mike Lockwood    // true if input ports are open
3181b9f7d325a552c54e793b51f571ae3d65b26e94Mike Lockwood    private final boolean mInputPortOpen[];
325ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood    // open counts for output ports
335ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood    private final int mOutputPortOpenCount[];
345ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood
355ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood    /**
365ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood     * @hide
375ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood     */
3881b9f7d325a552c54e793b51f571ae3d65b26e94Mike Lockwood    public MidiDeviceStatus(MidiDeviceInfo deviceInfo, boolean inputPortOpen[],
395ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood            int outputPortOpenCount[]) {
405ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood        // MidiDeviceInfo is immutable so we can share references
415ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood        mDeviceInfo = deviceInfo;
425ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood
435ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood        // make copies of the arrays
4481b9f7d325a552c54e793b51f571ae3d65b26e94Mike Lockwood        mInputPortOpen = new boolean[inputPortOpen.length];
4581b9f7d325a552c54e793b51f571ae3d65b26e94Mike Lockwood        System.arraycopy(inputPortOpen, 0, mInputPortOpen, 0, inputPortOpen.length);
465ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood        mOutputPortOpenCount = new int[outputPortOpenCount.length];
475ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood        System.arraycopy(outputPortOpenCount, 0, mOutputPortOpenCount, 0,
485ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood                outputPortOpenCount.length);
495ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood    }
505ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood
515ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood    /**
5281b9f7d325a552c54e793b51f571ae3d65b26e94Mike Lockwood     * Creates a MidiDeviceStatus with zero for all port open counts
535ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood     * @hide
545ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood     */
555ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood    public MidiDeviceStatus(MidiDeviceInfo deviceInfo) {
565ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood        mDeviceInfo = deviceInfo;
5781b9f7d325a552c54e793b51f571ae3d65b26e94Mike Lockwood        mInputPortOpen = new boolean[deviceInfo.getInputPortCount()];
585ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood        mOutputPortOpenCount = new int[deviceInfo.getOutputPortCount()];
595ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood    }
605ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood
615ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood    /**
625ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood     * Returns the {@link MidiDeviceInfo} of the device.
635ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood     *
645ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood     * @return the device info
655ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood     */
665ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood    public MidiDeviceInfo getDeviceInfo() {
675ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood        return mDeviceInfo;
685ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood    }
695ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood
705ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood    /**
7181b9f7d325a552c54e793b51f571ae3d65b26e94Mike Lockwood     * Returns true if an input port is open.
727eb441cb4abcd3230a4d243469c5044f49e707c8Mike Lockwood     * An input port can only be opened by one client at a time.
735ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood     *
7481b9f7d325a552c54e793b51f571ae3d65b26e94Mike Lockwood     * @param portNumber the input port's port number
7581b9f7d325a552c54e793b51f571ae3d65b26e94Mike Lockwood     * @return input port open status
765ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood     */
7781b9f7d325a552c54e793b51f571ae3d65b26e94Mike Lockwood    public boolean isInputPortOpen(int portNumber) {
7881b9f7d325a552c54e793b51f571ae3d65b26e94Mike Lockwood        return mInputPortOpen[portNumber];
795ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood    }
805ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood
815ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood    /**
827eb441cb4abcd3230a4d243469c5044f49e707c8Mike Lockwood     * Returns the number of clients currently connected to the specified output port.
837eb441cb4abcd3230a4d243469c5044f49e707c8Mike Lockwood     * Unlike input ports, an output port can be opened by multiple clients at the same time.
845ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood     *
8581b9f7d325a552c54e793b51f571ae3d65b26e94Mike Lockwood     * @param portNumber the output port's port number
865ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood     * @return output port open count
875ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood     */
885ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood    public int getOutputPortOpenCount(int portNumber) {
895ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood        return mOutputPortOpenCount[portNumber];
905ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood    }
915ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood
925ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood    @Override
935ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood    public String toString() {
945ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood        int inputPortCount = mDeviceInfo.getInputPortCount();
955ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood        int outputPortCount = mDeviceInfo.getOutputPortCount();
96fd5637fcce18adf44421389bf97a9da546f08940Mike Lockwood        StringBuilder builder = new StringBuilder("mInputPortOpen=[");
975ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood        for (int i = 0; i < inputPortCount; i++) {
9881b9f7d325a552c54e793b51f571ae3d65b26e94Mike Lockwood            builder.append(mInputPortOpen[i]);
995ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood            if (i < inputPortCount -1) {
1005ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood                builder.append(",");
1015ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood            }
1025ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood        }
1035ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood        builder.append("] mOutputPortOpenCount=[");
1045ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood        for (int i = 0; i < outputPortCount; i++) {
1055ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood            builder.append(mOutputPortOpenCount[i]);
1065ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood            if (i < outputPortCount -1) {
1075ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood                builder.append(",");
1085ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood            }
1095ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood        }
1105ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood        builder.append("]");
1115ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood        return builder.toString();
1125ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood    }
1135ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood
1145ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood    public static final Parcelable.Creator<MidiDeviceStatus> CREATOR =
1155ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood        new Parcelable.Creator<MidiDeviceStatus>() {
1165ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood        public MidiDeviceStatus createFromParcel(Parcel in) {
1175ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood            ClassLoader classLoader = MidiDeviceInfo.class.getClassLoader();
1185ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood            MidiDeviceInfo deviceInfo = in.readParcelable(classLoader);
11981b9f7d325a552c54e793b51f571ae3d65b26e94Mike Lockwood            boolean[] inputPortOpen = in.createBooleanArray();
1205ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood            int[] outputPortOpenCount = in.createIntArray();
12181b9f7d325a552c54e793b51f571ae3d65b26e94Mike Lockwood            return new MidiDeviceStatus(deviceInfo, inputPortOpen, outputPortOpenCount);
1225ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood        }
1235ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood
1245ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood        public MidiDeviceStatus[] newArray(int size) {
1255ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood            return new MidiDeviceStatus[size];
1265ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood        }
1275ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood    };
1285ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood
1295ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood    public int describeContents() {
1305ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood        return 0;
1315ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood    }
1325ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood
1335ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood    public void writeToParcel(Parcel parcel, int flags) {
1345ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood        parcel.writeParcelable(mDeviceInfo, flags);
13581b9f7d325a552c54e793b51f571ae3d65b26e94Mike Lockwood        parcel.writeBooleanArray(mInputPortOpen);
1365ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood        parcel.writeIntArray(mOutputPortOpenCount);
1375ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood   }
1385ff9e2a1719f78cddc7a23d6572ab15ab595dafdMike Lockwood}
139