167f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood/*
267f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood * Copyright (C) 2014 The Android Open Source Project
367f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood *
467f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood * Licensed under the Apache License, Version 2.0 (the "License");
567f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood * you may not use this file except in compliance with the License.
667f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood * You may obtain a copy of the License at
767f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood *
867f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood *      http://www.apache.org/licenses/LICENSE-2.0
967f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood *
1067f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood * Unless required by applicable law or agreed to in writing, software
1167f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood * distributed under the License is distributed on an "AS IS" BASIS,
1267f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1367f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood * See the License for the specific language governing permissions and
1467f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood * limitations under the License.
1567f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood */
1667f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood
17b673770f7172d4fca9bc05de1f36bc53e93eb247Mike Lockwoodpackage android.media.midi;
1867f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood
1967f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwoodimport android.os.Bundle;
2067f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwoodimport android.os.Parcel;
2167f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwoodimport android.os.Parcelable;
2267f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood
2367f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood/**
2467f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood * This class contains information to describe a MIDI device.
2567f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood * For now we only have information that can be retrieved easily for USB devices,
2667f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood * but we will probably expand this in the future.
2767f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood *
2867f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood * This class is just an immutable object to encapsulate the MIDI device description.
2967f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood * Use the MidiDevice class to actually communicate with devices.
3067f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood */
31be215dd57282888b05b234c39bba44cc0a864b8aMike Lockwoodpublic final class MidiDeviceInfo implements Parcelable {
3267f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood
3367f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood    private static final String TAG = "MidiDeviceInfo";
3467f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood
3578beecffc3ea477b55b65d530e4868dd44b5e71bMike Lockwood    /**
3678beecffc3ea477b55b65d530e4868dd44b5e71bMike Lockwood     * Constant representing USB MIDI devices for {@link #getType}
3778beecffc3ea477b55b65d530e4868dd44b5e71bMike Lockwood     */
3867f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood    public static final int TYPE_USB = 1;
3978beecffc3ea477b55b65d530e4868dd44b5e71bMike Lockwood
4078beecffc3ea477b55b65d530e4868dd44b5e71bMike Lockwood    /**
4178beecffc3ea477b55b65d530e4868dd44b5e71bMike Lockwood     * Constant representing virtual (software based) MIDI devices for {@link #getType}
4278beecffc3ea477b55b65d530e4868dd44b5e71bMike Lockwood     */
4367f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood    public static final int TYPE_VIRTUAL = 2;
4467f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood
45f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood    /**
463f5acc6d48337da1609f672d4385b1f170ec7f3eMike Lockwood     * Constant representing Bluetooth MIDI devices for {@link #getType}
473f5acc6d48337da1609f672d4385b1f170ec7f3eMike Lockwood     */
483f5acc6d48337da1609f672d4385b1f170ec7f3eMike Lockwood    public static final int TYPE_BLUETOOTH = 3;
493f5acc6d48337da1609f672d4385b1f170ec7f3eMike Lockwood
503f5acc6d48337da1609f672d4385b1f170ec7f3eMike Lockwood    /**
51f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood     * Bundle key for the device's user visible name property.
527eb441cb4abcd3230a4d243469c5044f49e707c8Mike Lockwood     * The value for this property is of type {@link java.lang.String}.
53f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood     * Used with the {@link android.os.Bundle} returned by {@link #getProperties}.
54f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood     * For USB devices, this is a concatenation of the manufacturer and product names.
55f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood     */
56f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood    public static final String PROPERTY_NAME = "name";
5767f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood
5867f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood    /**
5967f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood     * Bundle key for the device's manufacturer name property.
607eb441cb4abcd3230a4d243469c5044f49e707c8Mike Lockwood     * The value for this property is of type {@link java.lang.String}.
6167f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood     * Used with the {@link android.os.Bundle} returned by {@link #getProperties}.
6267f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood     * Matches the USB device manufacturer name string for USB MIDI devices.
6367f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood     */
6467f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood    public static final String PROPERTY_MANUFACTURER = "manufacturer";
6567f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood
6667f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood    /**
67f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood     * Bundle key for the device's product name property.
687eb441cb4abcd3230a4d243469c5044f49e707c8Mike Lockwood     * The value for this property is of type {@link java.lang.String}.
6967f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood     * Used with the {@link android.os.Bundle} returned by {@link #getProperties}
7067f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood     * Matches the USB device product name string for USB MIDI devices.
7167f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood     */
72f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood    public static final String PROPERTY_PRODUCT = "product";
7367f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood
7467f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood    /**
7502868b1625f0b1fa6ce1fb2529186f155904dd03Mike Lockwood     * Bundle key for the device's version property.
767eb441cb4abcd3230a4d243469c5044f49e707c8Mike Lockwood     * The value for this property is of type {@link java.lang.String}.
7702868b1625f0b1fa6ce1fb2529186f155904dd03Mike Lockwood     * Used with the {@link android.os.Bundle} returned by {@link #getProperties}
7802868b1625f0b1fa6ce1fb2529186f155904dd03Mike Lockwood     * Matches the USB device version number for USB MIDI devices.
7902868b1625f0b1fa6ce1fb2529186f155904dd03Mike Lockwood     */
8002868b1625f0b1fa6ce1fb2529186f155904dd03Mike Lockwood    public static final String PROPERTY_VERSION = "version";
8102868b1625f0b1fa6ce1fb2529186f155904dd03Mike Lockwood
8202868b1625f0b1fa6ce1fb2529186f155904dd03Mike Lockwood    /**
8367f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood     * Bundle key for the device's serial number property.
847eb441cb4abcd3230a4d243469c5044f49e707c8Mike Lockwood     * The value for this property is of type {@link java.lang.String}.
8567f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood     * Used with the {@link android.os.Bundle} returned by {@link #getProperties}
8667f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood     * Matches the USB device serial number for USB MIDI devices.
8767f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood     */
8867f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood    public static final String PROPERTY_SERIAL_NUMBER = "serial_number";
8967f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood
9067f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood    /**
917eb441cb4abcd3230a4d243469c5044f49e707c8Mike Lockwood     * Bundle key for the device's corresponding USB device.
927eb441cb4abcd3230a4d243469c5044f49e707c8Mike Lockwood     * The value for this property is of type {@link android.hardware.usb.UsbDevice}.
9367f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood     * Only set for USB MIDI devices.
9467f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood     * Used with the {@link android.os.Bundle} returned by {@link #getProperties}
9567f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood     */
9667f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood    public static final String PROPERTY_USB_DEVICE = "usb_device";
9767f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood
9867f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood    /**
997eb441cb4abcd3230a4d243469c5044f49e707c8Mike Lockwood     * Bundle key for the device's corresponding Bluetooth device.
1007eb441cb4abcd3230a4d243469c5044f49e707c8Mike Lockwood     * The value for this property is of type {@link android.bluetooth.BluetoothDevice}.
1013f5acc6d48337da1609f672d4385b1f170ec7f3eMike Lockwood     * Only set for Bluetooth MIDI devices.
1023f5acc6d48337da1609f672d4385b1f170ec7f3eMike Lockwood     * Used with the {@link android.os.Bundle} returned by {@link #getProperties}
1033f5acc6d48337da1609f672d4385b1f170ec7f3eMike Lockwood     */
1043f5acc6d48337da1609f672d4385b1f170ec7f3eMike Lockwood    public static final String PROPERTY_BLUETOOTH_DEVICE = "bluetooth_device";
1053f5acc6d48337da1609f672d4385b1f170ec7f3eMike Lockwood
1063f5acc6d48337da1609f672d4385b1f170ec7f3eMike Lockwood    /**
10710024b3dc12a8552c1547b67810c77b865045cc8Mike Lockwood     * Bundle key for the device's ALSA card number.
1087eb441cb4abcd3230a4d243469c5044f49e707c8Mike Lockwood     * The value for this property is an integer.
10910024b3dc12a8552c1547b67810c77b865045cc8Mike Lockwood     * Only set for USB MIDI devices.
11010024b3dc12a8552c1547b67810c77b865045cc8Mike Lockwood     * Used with the {@link android.os.Bundle} returned by {@link #getProperties}
11111fd96d6ff25bc1d710448eab545fe09da55a5f5Mike Lockwood     *
11211fd96d6ff25bc1d710448eab545fe09da55a5f5Mike Lockwood     * @hide
11367f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood     */
11410024b3dc12a8552c1547b67810c77b865045cc8Mike Lockwood    public static final String PROPERTY_ALSA_CARD = "alsa_card";
11510024b3dc12a8552c1547b67810c77b865045cc8Mike Lockwood
11610024b3dc12a8552c1547b67810c77b865045cc8Mike Lockwood    /**
11710024b3dc12a8552c1547b67810c77b865045cc8Mike Lockwood     * Bundle key for the device's ALSA device number.
1187eb441cb4abcd3230a4d243469c5044f49e707c8Mike Lockwood     * The value for this property is an integer.
11910024b3dc12a8552c1547b67810c77b865045cc8Mike Lockwood     * Only set for USB MIDI devices.
12010024b3dc12a8552c1547b67810c77b865045cc8Mike Lockwood     * Used with the {@link android.os.Bundle} returned by {@link #getProperties}
12111fd96d6ff25bc1d710448eab545fe09da55a5f5Mike Lockwood     *
12211fd96d6ff25bc1d710448eab545fe09da55a5f5Mike Lockwood     * @hide
12310024b3dc12a8552c1547b67810c77b865045cc8Mike Lockwood     */
12410024b3dc12a8552c1547b67810c77b865045cc8Mike Lockwood    public static final String PROPERTY_ALSA_DEVICE = "alsa_device";
12567f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood
12667f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood    /**
1277eb441cb4abcd3230a4d243469c5044f49e707c8Mike Lockwood     * ServiceInfo for the service hosting the device implementation.
1287eb441cb4abcd3230a4d243469c5044f49e707c8Mike Lockwood     * The value for this property is of type {@link android.content.pm.ServiceInfo}.
12911fd96d6ff25bc1d710448eab545fe09da55a5f5Mike Lockwood     * Only set for Virtual MIDI devices.
13011fd96d6ff25bc1d710448eab545fe09da55a5f5Mike Lockwood     * Used with the {@link android.os.Bundle} returned by {@link #getProperties}
13111fd96d6ff25bc1d710448eab545fe09da55a5f5Mike Lockwood     *
13211fd96d6ff25bc1d710448eab545fe09da55a5f5Mike Lockwood     * @hide
13311fd96d6ff25bc1d710448eab545fe09da55a5f5Mike Lockwood     */
13411fd96d6ff25bc1d710448eab545fe09da55a5f5Mike Lockwood    public static final String PROPERTY_SERVICE_INFO = "service_info";
13511fd96d6ff25bc1d710448eab545fe09da55a5f5Mike Lockwood
13611fd96d6ff25bc1d710448eab545fe09da55a5f5Mike Lockwood    /**
137f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood     * Contains information about an input or output port.
138f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood     */
139f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood    public static final class PortInfo {
140f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood        /**
141f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood         * Port type for input ports
142f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood         */
143f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood        public static final int TYPE_INPUT = 1;
144f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood
145f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood        /**
146f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood         * Port type for output ports
147f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood         */
148f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood        public static final int TYPE_OUTPUT = 2;
149f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood
150f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood        private final int mPortType;
151f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood        private final int mPortNumber;
152f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood        private final String mName;
153f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood
154f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood        PortInfo(int type, int portNumber, String name) {
155f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood            mPortType = type;
156f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood            mPortNumber = portNumber;
157f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood            mName = (name == null ? "" : name);
158f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood        }
159f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood
160f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood        /**
161f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood         * Returns the port type of the port (either {@link #TYPE_INPUT} or {@link #TYPE_OUTPUT})
162f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood         * @return the port type
163f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood         */
164f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood        public int getType() {
165f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood            return mPortType;
166f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood        }
167f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood
168f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood        /**
169f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood         * Returns the port number of the port
170f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood         * @return the port number
171f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood         */
172f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood        public int getPortNumber() {
173f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood            return mPortNumber;
174f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood        }
175f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood
176f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood        /**
177f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood         * Returns the name of the port, or empty string if the port has no name
178f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood         * @return the port name
179f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood         */
180f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood        public String getName() {
181f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood            return mName;
182f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood        }
183f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood    }
184f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood
185f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood    private final int mType;    // USB or virtual
186f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood    private final int mId;      // unique ID generated by MidiService
187f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood    private final int mInputPortCount;
188f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood    private final int mOutputPortCount;
189f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood    private final String[] mInputPortNames;
190f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood    private final String[] mOutputPortNames;
191f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood    private final Bundle mProperties;
192f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood    private final boolean mIsPrivate;
193f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood
194f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood    /**
19567f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood     * MidiDeviceInfo should only be instantiated by MidiService implementation
19667f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood     * @hide
19767f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood     */
198b6b9a91c02b7a44cf56943e5358cee68fa4aece5Mike Lockwood    public MidiDeviceInfo(int type, int id, int numInputPorts, int numOutputPorts,
199f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood            String[] inputPortNames, String[] outputPortNames, Bundle properties,
200f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood            boolean isPrivate) {
20167f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood        mType = type;
20267f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood        mId = id;
203b6b9a91c02b7a44cf56943e5358cee68fa4aece5Mike Lockwood        mInputPortCount = numInputPorts;
204b6b9a91c02b7a44cf56943e5358cee68fa4aece5Mike Lockwood        mOutputPortCount = numOutputPorts;
2050caf689ab4a47ad6741a3d1021743d4cb4281f6aMike Lockwood        if (inputPortNames == null) {
2060caf689ab4a47ad6741a3d1021743d4cb4281f6aMike Lockwood            mInputPortNames = new String[numInputPorts];
2070caf689ab4a47ad6741a3d1021743d4cb4281f6aMike Lockwood        } else {
2080caf689ab4a47ad6741a3d1021743d4cb4281f6aMike Lockwood            mInputPortNames = inputPortNames;
2090caf689ab4a47ad6741a3d1021743d4cb4281f6aMike Lockwood        }
2100caf689ab4a47ad6741a3d1021743d4cb4281f6aMike Lockwood        if (outputPortNames == null) {
2110caf689ab4a47ad6741a3d1021743d4cb4281f6aMike Lockwood            mOutputPortNames = new String[numOutputPorts];
2120caf689ab4a47ad6741a3d1021743d4cb4281f6aMike Lockwood        } else {
2130caf689ab4a47ad6741a3d1021743d4cb4281f6aMike Lockwood            mOutputPortNames = outputPortNames;
2140caf689ab4a47ad6741a3d1021743d4cb4281f6aMike Lockwood        }
21567f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood        mProperties = properties;
21611fd96d6ff25bc1d710448eab545fe09da55a5f5Mike Lockwood        mIsPrivate = isPrivate;
21767f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood    }
21867f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood
21967f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood    /**
22067f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood     * Returns the type of the device.
22167f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood     *
22267f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood     * @return the device's type
22367f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood     */
22467f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood    public int getType() {
22567f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood        return mType;
22667f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood    }
22767f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood
22867f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood    /**
22967f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood     * Returns the ID of the device.
23067f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood     * This ID is generated by the MIDI service and is not persistent across device unplugs.
23167f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood     *
23267f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood     * @return the device's ID
23367f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood     */
23467f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood    public int getId() {
23567f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood        return mId;
23667f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood    }
23767f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood
23867f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood    /**
239b6b9a91c02b7a44cf56943e5358cee68fa4aece5Mike Lockwood     * Returns the device's number of input ports.
240b6b9a91c02b7a44cf56943e5358cee68fa4aece5Mike Lockwood     *
241b6b9a91c02b7a44cf56943e5358cee68fa4aece5Mike Lockwood     * @return the number of input ports
242b6b9a91c02b7a44cf56943e5358cee68fa4aece5Mike Lockwood     */
243b6b9a91c02b7a44cf56943e5358cee68fa4aece5Mike Lockwood    public int getInputPortCount() {
244b6b9a91c02b7a44cf56943e5358cee68fa4aece5Mike Lockwood        return mInputPortCount;
245b6b9a91c02b7a44cf56943e5358cee68fa4aece5Mike Lockwood    }
246b6b9a91c02b7a44cf56943e5358cee68fa4aece5Mike Lockwood
247b6b9a91c02b7a44cf56943e5358cee68fa4aece5Mike Lockwood    /**
248b6b9a91c02b7a44cf56943e5358cee68fa4aece5Mike Lockwood     * Returns the device's number of output ports.
249b6b9a91c02b7a44cf56943e5358cee68fa4aece5Mike Lockwood     *
250b6b9a91c02b7a44cf56943e5358cee68fa4aece5Mike Lockwood     * @return the number of output ports
251b6b9a91c02b7a44cf56943e5358cee68fa4aece5Mike Lockwood     */
252b6b9a91c02b7a44cf56943e5358cee68fa4aece5Mike Lockwood    public int getOutputPortCount() {
253b6b9a91c02b7a44cf56943e5358cee68fa4aece5Mike Lockwood        return mOutputPortCount;
254b6b9a91c02b7a44cf56943e5358cee68fa4aece5Mike Lockwood    }
255b6b9a91c02b7a44cf56943e5358cee68fa4aece5Mike Lockwood
256b6b9a91c02b7a44cf56943e5358cee68fa4aece5Mike Lockwood    /**
2579189f5f0252e1ef3e7d00978ef12e964565dd6f1Mike Lockwood     * Returns information about the device's ports.
2589189f5f0252e1ef3e7d00978ef12e964565dd6f1Mike Lockwood     * The ports are in unspecified order.
259f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood     *
2609189f5f0252e1ef3e7d00978ef12e964565dd6f1Mike Lockwood     * @return array of {@link PortInfo}
261f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood     */
2627eb441cb4abcd3230a4d243469c5044f49e707c8Mike Lockwood    public PortInfo[] getPorts() {
2637eb441cb4abcd3230a4d243469c5044f49e707c8Mike Lockwood        PortInfo[] ports = new PortInfo[mInputPortCount + mOutputPortCount];
264f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood
2659189f5f0252e1ef3e7d00978ef12e964565dd6f1Mike Lockwood        int index = 0;
2669189f5f0252e1ef3e7d00978ef12e964565dd6f1Mike Lockwood        for (int i = 0; i < mInputPortCount; i++) {
2677eb441cb4abcd3230a4d243469c5044f49e707c8Mike Lockwood            ports[index++] = new PortInfo(PortInfo.TYPE_INPUT, i, mInputPortNames[i]);
2689189f5f0252e1ef3e7d00978ef12e964565dd6f1Mike Lockwood        }
2699189f5f0252e1ef3e7d00978ef12e964565dd6f1Mike Lockwood        for (int i = 0; i < mOutputPortCount; i++) {
2707eb441cb4abcd3230a4d243469c5044f49e707c8Mike Lockwood            ports[index++] = new PortInfo(PortInfo.TYPE_OUTPUT, i, mOutputPortNames[i]);
271f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood        }
2729189f5f0252e1ef3e7d00978ef12e964565dd6f1Mike Lockwood
2737eb441cb4abcd3230a4d243469c5044f49e707c8Mike Lockwood        return ports;
274f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood    }
275f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood
276f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood    /**
27767f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood     * Returns the {@link android.os.Bundle} containing the device's properties.
27867f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood     *
27967f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood     * @return the device's properties
28067f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood     */
28167f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood    public Bundle getProperties() {
28267f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood        return mProperties;
28367f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood    }
28467f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood
28511fd96d6ff25bc1d710448eab545fe09da55a5f5Mike Lockwood    /**
28611fd96d6ff25bc1d710448eab545fe09da55a5f5Mike Lockwood     * Returns true if the device is private.  Private devices are only visible and accessible
28711fd96d6ff25bc1d710448eab545fe09da55a5f5Mike Lockwood     * to clients with the same UID as the application that is hosting the device.
28811fd96d6ff25bc1d710448eab545fe09da55a5f5Mike Lockwood     *
28911fd96d6ff25bc1d710448eab545fe09da55a5f5Mike Lockwood     * @return true if the device is private
29011fd96d6ff25bc1d710448eab545fe09da55a5f5Mike Lockwood     */
29111fd96d6ff25bc1d710448eab545fe09da55a5f5Mike Lockwood    public boolean isPrivate() {
29211fd96d6ff25bc1d710448eab545fe09da55a5f5Mike Lockwood        return mIsPrivate;
29311fd96d6ff25bc1d710448eab545fe09da55a5f5Mike Lockwood    }
29411fd96d6ff25bc1d710448eab545fe09da55a5f5Mike Lockwood
29567f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood    @Override
29667f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood    public boolean equals(Object o) {
29767f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood        if (o instanceof MidiDeviceInfo) {
29867f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood            return (((MidiDeviceInfo)o).mId == mId);
29967f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood        } else {
30067f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood            return false;
30167f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood        }
30267f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood    }
30367f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood
30467f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood    @Override
30567f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood    public int hashCode() {
30667f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood        return mId;
30767f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood    }
30867f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood
30967f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood    @Override
31067f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood    public String toString() {
311fd5637fcce18adf44421389bf97a9da546f08940Mike Lockwood        // This is a hack to force the mProperties Bundle to unparcel so we can
312fd5637fcce18adf44421389bf97a9da546f08940Mike Lockwood        // print all the names and values.
313fd5637fcce18adf44421389bf97a9da546f08940Mike Lockwood        mProperties.getString(PROPERTY_NAME);
31467f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood        return ("MidiDeviceInfo[mType=" + mType +
315b6b9a91c02b7a44cf56943e5358cee68fa4aece5Mike Lockwood                ",mInputPortCount=" + mInputPortCount +
316b6b9a91c02b7a44cf56943e5358cee68fa4aece5Mike Lockwood                ",mOutputPortCount=" + mOutputPortCount +
31711fd96d6ff25bc1d710448eab545fe09da55a5f5Mike Lockwood                ",mProperties=" + mProperties +
31811fd96d6ff25bc1d710448eab545fe09da55a5f5Mike Lockwood                ",mIsPrivate=" + mIsPrivate);
31967f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood    }
32067f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood
32167f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood    public static final Parcelable.Creator<MidiDeviceInfo> CREATOR =
32267f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood        new Parcelable.Creator<MidiDeviceInfo>() {
32367f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood        public MidiDeviceInfo createFromParcel(Parcel in) {
32467f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood            int type = in.readInt();
32567f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood            int id = in.readInt();
326b6b9a91c02b7a44cf56943e5358cee68fa4aece5Mike Lockwood            int inputPorts = in.readInt();
327b6b9a91c02b7a44cf56943e5358cee68fa4aece5Mike Lockwood            int outputPorts = in.readInt();
328f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood            String[] inputPortNames = in.createStringArray();
329f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood            String[] outputPortNames = in.createStringArray();
33067f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood            Bundle properties = in.readBundle();
33111fd96d6ff25bc1d710448eab545fe09da55a5f5Mike Lockwood            boolean isPrivate = (in.readInt() == 1);
332f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood            return new MidiDeviceInfo(type, id, inputPorts, outputPorts,
333f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood                    inputPortNames, outputPortNames, properties, isPrivate);
33467f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood        }
33567f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood
33667f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood        public MidiDeviceInfo[] newArray(int size) {
33767f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood            return new MidiDeviceInfo[size];
33867f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood        }
33967f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood    };
34067f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood
34167f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood    public int describeContents() {
34267f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood        return 0;
34367f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood    }
34467f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood
34567f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood    public void writeToParcel(Parcel parcel, int flags) {
34667f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood        parcel.writeInt(mType);
34767f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood        parcel.writeInt(mId);
348b6b9a91c02b7a44cf56943e5358cee68fa4aece5Mike Lockwood        parcel.writeInt(mInputPortCount);
349b6b9a91c02b7a44cf56943e5358cee68fa4aece5Mike Lockwood        parcel.writeInt(mOutputPortCount);
350f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood        parcel.writeStringArray(mInputPortNames);
351f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood        parcel.writeStringArray(mOutputPortNames);
35267f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood        parcel.writeBundle(mProperties);
35311fd96d6ff25bc1d710448eab545fe09da55a5f5Mike Lockwood        parcel.writeInt(mIsPrivate ? 1 : 0);
35467f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood   }
35567f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood}
356