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
2333603ae9c52fe60ff7e19703b88599a227788189Mikhail Naganovimport android.util.Log;
2433603ae9c52fe60ff7e19703b88599a227788189Mikhail Naganov
2567f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood/**
2667f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood * This class contains information to describe a MIDI device.
2767f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood * For now we only have information that can be retrieved easily for USB devices,
2867f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood * but we will probably expand this in the future.
2967f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood *
3067f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood * This class is just an immutable object to encapsulate the MIDI device description.
3167f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood * Use the MidiDevice class to actually communicate with devices.
3267f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood */
33be215dd57282888b05b234c39bba44cc0a864b8aMike Lockwoodpublic final class MidiDeviceInfo implements Parcelable {
3467f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood
3567f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood    private static final String TAG = "MidiDeviceInfo";
3667f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood
3784b674079db819963b227df4dadb0fb5180527e6Mikhail Naganov    /*
3884b674079db819963b227df4dadb0fb5180527e6Mikhail Naganov     * Please note that constants and (un)marshalling code need to be kept in sync
3984b674079db819963b227df4dadb0fb5180527e6Mikhail Naganov     * with the native implementation (MidiDeviceInfo.h|cpp)
4084b674079db819963b227df4dadb0fb5180527e6Mikhail Naganov     */
4184b674079db819963b227df4dadb0fb5180527e6Mikhail Naganov
4278beecffc3ea477b55b65d530e4868dd44b5e71bMike Lockwood    /**
4378beecffc3ea477b55b65d530e4868dd44b5e71bMike Lockwood     * Constant representing USB MIDI devices for {@link #getType}
4478beecffc3ea477b55b65d530e4868dd44b5e71bMike Lockwood     */
4567f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood    public static final int TYPE_USB = 1;
4678beecffc3ea477b55b65d530e4868dd44b5e71bMike Lockwood
4778beecffc3ea477b55b65d530e4868dd44b5e71bMike Lockwood    /**
4878beecffc3ea477b55b65d530e4868dd44b5e71bMike Lockwood     * Constant representing virtual (software based) MIDI devices for {@link #getType}
4978beecffc3ea477b55b65d530e4868dd44b5e71bMike Lockwood     */
5067f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood    public static final int TYPE_VIRTUAL = 2;
5167f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood
52f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood    /**
533f5acc6d48337da1609f672d4385b1f170ec7f3eMike Lockwood     * Constant representing Bluetooth MIDI devices for {@link #getType}
543f5acc6d48337da1609f672d4385b1f170ec7f3eMike Lockwood     */
553f5acc6d48337da1609f672d4385b1f170ec7f3eMike Lockwood    public static final int TYPE_BLUETOOTH = 3;
563f5acc6d48337da1609f672d4385b1f170ec7f3eMike Lockwood
573f5acc6d48337da1609f672d4385b1f170ec7f3eMike Lockwood    /**
58f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood     * Bundle key for the device's user visible name property.
597eb441cb4abcd3230a4d243469c5044f49e707c8Mike Lockwood     * The value for this property is of type {@link java.lang.String}.
60f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood     * Used with the {@link android.os.Bundle} returned by {@link #getProperties}.
61f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood     * For USB devices, this is a concatenation of the manufacturer and product names.
62f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood     */
63f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood    public static final String PROPERTY_NAME = "name";
6467f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood
6567f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood    /**
6667f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood     * Bundle key for the device's manufacturer name property.
677eb441cb4abcd3230a4d243469c5044f49e707c8Mike Lockwood     * The value for this property is of type {@link java.lang.String}.
6867f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood     * Used with the {@link android.os.Bundle} returned by {@link #getProperties}.
6967f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood     * Matches the USB device manufacturer name string for USB MIDI devices.
7067f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood     */
7167f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood    public static final String PROPERTY_MANUFACTURER = "manufacturer";
7267f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood
7367f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood    /**
74f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood     * Bundle key for the device's product name property.
757eb441cb4abcd3230a4d243469c5044f49e707c8Mike Lockwood     * The value for this property is of type {@link java.lang.String}.
7667f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood     * Used with the {@link android.os.Bundle} returned by {@link #getProperties}
7767f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood     * Matches the USB device product name string for USB MIDI devices.
7867f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood     */
79f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood    public static final String PROPERTY_PRODUCT = "product";
8067f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood
8167f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood    /**
8202868b1625f0b1fa6ce1fb2529186f155904dd03Mike Lockwood     * Bundle key for the device's version property.
837eb441cb4abcd3230a4d243469c5044f49e707c8Mike Lockwood     * The value for this property is of type {@link java.lang.String}.
8402868b1625f0b1fa6ce1fb2529186f155904dd03Mike Lockwood     * Used with the {@link android.os.Bundle} returned by {@link #getProperties}
8502868b1625f0b1fa6ce1fb2529186f155904dd03Mike Lockwood     * Matches the USB device version number for USB MIDI devices.
8602868b1625f0b1fa6ce1fb2529186f155904dd03Mike Lockwood     */
8702868b1625f0b1fa6ce1fb2529186f155904dd03Mike Lockwood    public static final String PROPERTY_VERSION = "version";
8802868b1625f0b1fa6ce1fb2529186f155904dd03Mike Lockwood
8902868b1625f0b1fa6ce1fb2529186f155904dd03Mike Lockwood    /**
9067f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood     * Bundle key for the device's serial number property.
917eb441cb4abcd3230a4d243469c5044f49e707c8Mike Lockwood     * The value for this property is of type {@link java.lang.String}.
9267f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood     * Used with the {@link android.os.Bundle} returned by {@link #getProperties}
9367f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood     * Matches the USB device serial number for USB MIDI devices.
9467f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood     */
9567f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood    public static final String PROPERTY_SERIAL_NUMBER = "serial_number";
9667f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood
9767f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood    /**
987eb441cb4abcd3230a4d243469c5044f49e707c8Mike Lockwood     * Bundle key for the device's corresponding USB device.
997eb441cb4abcd3230a4d243469c5044f49e707c8Mike Lockwood     * The value for this property is of type {@link android.hardware.usb.UsbDevice}.
10067f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood     * Only set for USB MIDI devices.
10167f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood     * Used with the {@link android.os.Bundle} returned by {@link #getProperties}
10267f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood     */
10367f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood    public static final String PROPERTY_USB_DEVICE = "usb_device";
10467f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood
10567f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood    /**
1067eb441cb4abcd3230a4d243469c5044f49e707c8Mike Lockwood     * Bundle key for the device's corresponding Bluetooth device.
1077eb441cb4abcd3230a4d243469c5044f49e707c8Mike Lockwood     * The value for this property is of type {@link android.bluetooth.BluetoothDevice}.
1083f5acc6d48337da1609f672d4385b1f170ec7f3eMike Lockwood     * Only set for Bluetooth MIDI devices.
1093f5acc6d48337da1609f672d4385b1f170ec7f3eMike Lockwood     * Used with the {@link android.os.Bundle} returned by {@link #getProperties}
1103f5acc6d48337da1609f672d4385b1f170ec7f3eMike Lockwood     */
1113f5acc6d48337da1609f672d4385b1f170ec7f3eMike Lockwood    public static final String PROPERTY_BLUETOOTH_DEVICE = "bluetooth_device";
1123f5acc6d48337da1609f672d4385b1f170ec7f3eMike Lockwood
1133f5acc6d48337da1609f672d4385b1f170ec7f3eMike Lockwood    /**
11410024b3dc12a8552c1547b67810c77b865045cc8Mike Lockwood     * Bundle key for the device's ALSA card number.
1157eb441cb4abcd3230a4d243469c5044f49e707c8Mike Lockwood     * The value for this property is an integer.
11610024b3dc12a8552c1547b67810c77b865045cc8Mike Lockwood     * Only set for USB MIDI devices.
11710024b3dc12a8552c1547b67810c77b865045cc8Mike Lockwood     * Used with the {@link android.os.Bundle} returned by {@link #getProperties}
11811fd96d6ff25bc1d710448eab545fe09da55a5f5Mike Lockwood     *
11911fd96d6ff25bc1d710448eab545fe09da55a5f5Mike Lockwood     * @hide
12067f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood     */
12110024b3dc12a8552c1547b67810c77b865045cc8Mike Lockwood    public static final String PROPERTY_ALSA_CARD = "alsa_card";
12210024b3dc12a8552c1547b67810c77b865045cc8Mike Lockwood
12310024b3dc12a8552c1547b67810c77b865045cc8Mike Lockwood    /**
12410024b3dc12a8552c1547b67810c77b865045cc8Mike Lockwood     * Bundle key for the device's ALSA device number.
1257eb441cb4abcd3230a4d243469c5044f49e707c8Mike Lockwood     * The value for this property is an integer.
12610024b3dc12a8552c1547b67810c77b865045cc8Mike Lockwood     * Only set for USB MIDI devices.
12710024b3dc12a8552c1547b67810c77b865045cc8Mike Lockwood     * Used with the {@link android.os.Bundle} returned by {@link #getProperties}
12811fd96d6ff25bc1d710448eab545fe09da55a5f5Mike Lockwood     *
12911fd96d6ff25bc1d710448eab545fe09da55a5f5Mike Lockwood     * @hide
13010024b3dc12a8552c1547b67810c77b865045cc8Mike Lockwood     */
13110024b3dc12a8552c1547b67810c77b865045cc8Mike Lockwood    public static final String PROPERTY_ALSA_DEVICE = "alsa_device";
13267f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood
13367f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood    /**
1347eb441cb4abcd3230a4d243469c5044f49e707c8Mike Lockwood     * ServiceInfo for the service hosting the device implementation.
1357eb441cb4abcd3230a4d243469c5044f49e707c8Mike Lockwood     * The value for this property is of type {@link android.content.pm.ServiceInfo}.
13611fd96d6ff25bc1d710448eab545fe09da55a5f5Mike Lockwood     * Only set for Virtual MIDI devices.
13711fd96d6ff25bc1d710448eab545fe09da55a5f5Mike Lockwood     * Used with the {@link android.os.Bundle} returned by {@link #getProperties}
13811fd96d6ff25bc1d710448eab545fe09da55a5f5Mike Lockwood     *
13911fd96d6ff25bc1d710448eab545fe09da55a5f5Mike Lockwood     * @hide
14011fd96d6ff25bc1d710448eab545fe09da55a5f5Mike Lockwood     */
14111fd96d6ff25bc1d710448eab545fe09da55a5f5Mike Lockwood    public static final String PROPERTY_SERVICE_INFO = "service_info";
14211fd96d6ff25bc1d710448eab545fe09da55a5f5Mike Lockwood
14311fd96d6ff25bc1d710448eab545fe09da55a5f5Mike Lockwood    /**
144f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood     * Contains information about an input or output port.
145f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood     */
146f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood    public static final class PortInfo {
147f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood        /**
148f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood         * Port type for input ports
149f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood         */
150f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood        public static final int TYPE_INPUT = 1;
151f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood
152f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood        /**
153f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood         * Port type for output ports
154f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood         */
155f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood        public static final int TYPE_OUTPUT = 2;
156f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood
157f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood        private final int mPortType;
158f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood        private final int mPortNumber;
159f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood        private final String mName;
160f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood
161f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood        PortInfo(int type, int portNumber, String name) {
162f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood            mPortType = type;
163f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood            mPortNumber = portNumber;
164f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood            mName = (name == null ? "" : name);
165f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood        }
166f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood
167f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood        /**
168f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood         * Returns the port type of the port (either {@link #TYPE_INPUT} or {@link #TYPE_OUTPUT})
169f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood         * @return the port type
170f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood         */
171f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood        public int getType() {
172f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood            return mPortType;
173f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood        }
174f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood
175f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood        /**
176f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood         * Returns the port number of the port
177f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood         * @return the port number
178f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood         */
179f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood        public int getPortNumber() {
180f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood            return mPortNumber;
181f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood        }
182f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood
183f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood        /**
184f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood         * Returns the name of the port, or empty string if the port has no name
185f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood         * @return the port name
186f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood         */
187f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood        public String getName() {
188f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood            return mName;
189f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood        }
190f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood    }
191f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood
192f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood    private final int mType;    // USB or virtual
193f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood    private final int mId;      // unique ID generated by MidiService
194f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood    private final int mInputPortCount;
195f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood    private final int mOutputPortCount;
196f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood    private final String[] mInputPortNames;
197f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood    private final String[] mOutputPortNames;
198f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood    private final Bundle mProperties;
199f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood    private final boolean mIsPrivate;
200f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood
201f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood    /**
20267f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood     * MidiDeviceInfo should only be instantiated by MidiService implementation
20367f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood     * @hide
20467f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood     */
205b6b9a91c02b7a44cf56943e5358cee68fa4aece5Mike Lockwood    public MidiDeviceInfo(int type, int id, int numInputPorts, int numOutputPorts,
206f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood            String[] inputPortNames, String[] outputPortNames, Bundle properties,
207f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood            boolean isPrivate) {
20867f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood        mType = type;
20967f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood        mId = id;
210b6b9a91c02b7a44cf56943e5358cee68fa4aece5Mike Lockwood        mInputPortCount = numInputPorts;
211b6b9a91c02b7a44cf56943e5358cee68fa4aece5Mike Lockwood        mOutputPortCount = numOutputPorts;
2120caf689ab4a47ad6741a3d1021743d4cb4281f6aMike Lockwood        if (inputPortNames == null) {
2130caf689ab4a47ad6741a3d1021743d4cb4281f6aMike Lockwood            mInputPortNames = new String[numInputPorts];
2140caf689ab4a47ad6741a3d1021743d4cb4281f6aMike Lockwood        } else {
2150caf689ab4a47ad6741a3d1021743d4cb4281f6aMike Lockwood            mInputPortNames = inputPortNames;
2160caf689ab4a47ad6741a3d1021743d4cb4281f6aMike Lockwood        }
2170caf689ab4a47ad6741a3d1021743d4cb4281f6aMike Lockwood        if (outputPortNames == null) {
2180caf689ab4a47ad6741a3d1021743d4cb4281f6aMike Lockwood            mOutputPortNames = new String[numOutputPorts];
2190caf689ab4a47ad6741a3d1021743d4cb4281f6aMike Lockwood        } else {
2200caf689ab4a47ad6741a3d1021743d4cb4281f6aMike Lockwood            mOutputPortNames = outputPortNames;
2210caf689ab4a47ad6741a3d1021743d4cb4281f6aMike Lockwood        }
22267f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood        mProperties = properties;
22311fd96d6ff25bc1d710448eab545fe09da55a5f5Mike Lockwood        mIsPrivate = isPrivate;
22467f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood    }
22567f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood
22667f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood    /**
22767f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood     * Returns the type of the device.
22867f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood     *
22967f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood     * @return the device's type
23067f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood     */
23167f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood    public int getType() {
23267f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood        return mType;
23367f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood    }
23467f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood
23567f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood    /**
23667f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood     * Returns the ID of the device.
23767f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood     * This ID is generated by the MIDI service and is not persistent across device unplugs.
23867f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood     *
23967f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood     * @return the device's ID
24067f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood     */
24167f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood    public int getId() {
24267f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood        return mId;
24367f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood    }
24467f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood
24567f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood    /**
246b6b9a91c02b7a44cf56943e5358cee68fa4aece5Mike Lockwood     * Returns the device's number of input ports.
247b6b9a91c02b7a44cf56943e5358cee68fa4aece5Mike Lockwood     *
248b6b9a91c02b7a44cf56943e5358cee68fa4aece5Mike Lockwood     * @return the number of input ports
249b6b9a91c02b7a44cf56943e5358cee68fa4aece5Mike Lockwood     */
250b6b9a91c02b7a44cf56943e5358cee68fa4aece5Mike Lockwood    public int getInputPortCount() {
251b6b9a91c02b7a44cf56943e5358cee68fa4aece5Mike Lockwood        return mInputPortCount;
252b6b9a91c02b7a44cf56943e5358cee68fa4aece5Mike Lockwood    }
253b6b9a91c02b7a44cf56943e5358cee68fa4aece5Mike Lockwood
254b6b9a91c02b7a44cf56943e5358cee68fa4aece5Mike Lockwood    /**
255b6b9a91c02b7a44cf56943e5358cee68fa4aece5Mike Lockwood     * Returns the device's number of output ports.
256b6b9a91c02b7a44cf56943e5358cee68fa4aece5Mike Lockwood     *
257b6b9a91c02b7a44cf56943e5358cee68fa4aece5Mike Lockwood     * @return the number of output ports
258b6b9a91c02b7a44cf56943e5358cee68fa4aece5Mike Lockwood     */
259b6b9a91c02b7a44cf56943e5358cee68fa4aece5Mike Lockwood    public int getOutputPortCount() {
260b6b9a91c02b7a44cf56943e5358cee68fa4aece5Mike Lockwood        return mOutputPortCount;
261b6b9a91c02b7a44cf56943e5358cee68fa4aece5Mike Lockwood    }
262b6b9a91c02b7a44cf56943e5358cee68fa4aece5Mike Lockwood
263b6b9a91c02b7a44cf56943e5358cee68fa4aece5Mike Lockwood    /**
2649189f5f0252e1ef3e7d00978ef12e964565dd6f1Mike Lockwood     * Returns information about the device's ports.
2659189f5f0252e1ef3e7d00978ef12e964565dd6f1Mike Lockwood     * The ports are in unspecified order.
266f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood     *
2679189f5f0252e1ef3e7d00978ef12e964565dd6f1Mike Lockwood     * @return array of {@link PortInfo}
268f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood     */
2697eb441cb4abcd3230a4d243469c5044f49e707c8Mike Lockwood    public PortInfo[] getPorts() {
2707eb441cb4abcd3230a4d243469c5044f49e707c8Mike Lockwood        PortInfo[] ports = new PortInfo[mInputPortCount + mOutputPortCount];
271f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood
2729189f5f0252e1ef3e7d00978ef12e964565dd6f1Mike Lockwood        int index = 0;
2739189f5f0252e1ef3e7d00978ef12e964565dd6f1Mike Lockwood        for (int i = 0; i < mInputPortCount; i++) {
2747eb441cb4abcd3230a4d243469c5044f49e707c8Mike Lockwood            ports[index++] = new PortInfo(PortInfo.TYPE_INPUT, i, mInputPortNames[i]);
2759189f5f0252e1ef3e7d00978ef12e964565dd6f1Mike Lockwood        }
2769189f5f0252e1ef3e7d00978ef12e964565dd6f1Mike Lockwood        for (int i = 0; i < mOutputPortCount; i++) {
2777eb441cb4abcd3230a4d243469c5044f49e707c8Mike Lockwood            ports[index++] = new PortInfo(PortInfo.TYPE_OUTPUT, i, mOutputPortNames[i]);
278f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood        }
2799189f5f0252e1ef3e7d00978ef12e964565dd6f1Mike Lockwood
2807eb441cb4abcd3230a4d243469c5044f49e707c8Mike Lockwood        return ports;
281f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood    }
282f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood
283f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood    /**
28467f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood     * Returns the {@link android.os.Bundle} containing the device's properties.
28567f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood     *
28667f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood     * @return the device's properties
28767f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood     */
28867f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood    public Bundle getProperties() {
28967f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood        return mProperties;
29067f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood    }
29167f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood
29211fd96d6ff25bc1d710448eab545fe09da55a5f5Mike Lockwood    /**
29311fd96d6ff25bc1d710448eab545fe09da55a5f5Mike Lockwood     * Returns true if the device is private.  Private devices are only visible and accessible
29411fd96d6ff25bc1d710448eab545fe09da55a5f5Mike Lockwood     * to clients with the same UID as the application that is hosting the device.
29511fd96d6ff25bc1d710448eab545fe09da55a5f5Mike Lockwood     *
29611fd96d6ff25bc1d710448eab545fe09da55a5f5Mike Lockwood     * @return true if the device is private
29711fd96d6ff25bc1d710448eab545fe09da55a5f5Mike Lockwood     */
29811fd96d6ff25bc1d710448eab545fe09da55a5f5Mike Lockwood    public boolean isPrivate() {
29911fd96d6ff25bc1d710448eab545fe09da55a5f5Mike Lockwood        return mIsPrivate;
30011fd96d6ff25bc1d710448eab545fe09da55a5f5Mike Lockwood    }
30111fd96d6ff25bc1d710448eab545fe09da55a5f5Mike Lockwood
30267f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood    @Override
30367f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood    public boolean equals(Object o) {
30467f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood        if (o instanceof MidiDeviceInfo) {
30567f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood            return (((MidiDeviceInfo)o).mId == mId);
30667f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood        } else {
30767f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood            return false;
30867f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood        }
30967f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood    }
31067f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood
31167f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood    @Override
31267f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood    public int hashCode() {
31367f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood        return mId;
31467f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood    }
31567f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood
31667f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood    @Override
31767f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood    public String toString() {
318fd5637fcce18adf44421389bf97a9da546f08940Mike Lockwood        // This is a hack to force the mProperties Bundle to unparcel so we can
319fd5637fcce18adf44421389bf97a9da546f08940Mike Lockwood        // print all the names and values.
320fd5637fcce18adf44421389bf97a9da546f08940Mike Lockwood        mProperties.getString(PROPERTY_NAME);
32167f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood        return ("MidiDeviceInfo[mType=" + mType +
322b6b9a91c02b7a44cf56943e5358cee68fa4aece5Mike Lockwood                ",mInputPortCount=" + mInputPortCount +
323b6b9a91c02b7a44cf56943e5358cee68fa4aece5Mike Lockwood                ",mOutputPortCount=" + mOutputPortCount +
32411fd96d6ff25bc1d710448eab545fe09da55a5f5Mike Lockwood                ",mProperties=" + mProperties +
32511fd96d6ff25bc1d710448eab545fe09da55a5f5Mike Lockwood                ",mIsPrivate=" + mIsPrivate);
32667f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood    }
32767f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood
32867f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood    public static final Parcelable.Creator<MidiDeviceInfo> CREATOR =
32967f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood        new Parcelable.Creator<MidiDeviceInfo>() {
33067f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood        public MidiDeviceInfo createFromParcel(Parcel in) {
33184b674079db819963b227df4dadb0fb5180527e6Mikhail Naganov            // Needs to be kept in sync with code in MidiDeviceInfo.cpp
33267f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood            int type = in.readInt();
33367f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood            int id = in.readInt();
33484b674079db819963b227df4dadb0fb5180527e6Mikhail Naganov            int inputPortCount = in.readInt();
33584b674079db819963b227df4dadb0fb5180527e6Mikhail Naganov            int outputPortCount = in.readInt();
336f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood            String[] inputPortNames = in.createStringArray();
337f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood            String[] outputPortNames = in.createStringArray();
33811fd96d6ff25bc1d710448eab545fe09da55a5f5Mike Lockwood            boolean isPrivate = (in.readInt() == 1);
33984b674079db819963b227df4dadb0fb5180527e6Mikhail Naganov            Bundle basicPropertiesIgnored = in.readBundle();
34084b674079db819963b227df4dadb0fb5180527e6Mikhail Naganov            Bundle properties = in.readBundle();
34184b674079db819963b227df4dadb0fb5180527e6Mikhail Naganov            return new MidiDeviceInfo(type, id, inputPortCount, outputPortCount,
342f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood                    inputPortNames, outputPortNames, properties, isPrivate);
34367f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood        }
34467f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood
34567f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood        public MidiDeviceInfo[] newArray(int size) {
34667f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood            return new MidiDeviceInfo[size];
34767f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood        }
34867f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood    };
34967f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood
35067f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood    public int describeContents() {
35167f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood        return 0;
35267f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood    }
35367f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood
35484b674079db819963b227df4dadb0fb5180527e6Mikhail Naganov    private Bundle getBasicProperties(String[] keys) {
35584b674079db819963b227df4dadb0fb5180527e6Mikhail Naganov        Bundle basicProperties = new Bundle();
35684b674079db819963b227df4dadb0fb5180527e6Mikhail Naganov        for (String key : keys) {
35733603ae9c52fe60ff7e19703b88599a227788189Mikhail Naganov            Object val = mProperties.get(key);
35884b674079db819963b227df4dadb0fb5180527e6Mikhail Naganov            if (val != null) {
35933603ae9c52fe60ff7e19703b88599a227788189Mikhail Naganov                if (val instanceof String) {
36033603ae9c52fe60ff7e19703b88599a227788189Mikhail Naganov                    basicProperties.putString(key, (String) val);
36133603ae9c52fe60ff7e19703b88599a227788189Mikhail Naganov                } else if (val instanceof Integer) {
36233603ae9c52fe60ff7e19703b88599a227788189Mikhail Naganov                    basicProperties.putInt(key, (Integer) val);
36333603ae9c52fe60ff7e19703b88599a227788189Mikhail Naganov                } else {
36433603ae9c52fe60ff7e19703b88599a227788189Mikhail Naganov                    Log.w(TAG, "Unsupported property type: " + val.getClass().getName());
36533603ae9c52fe60ff7e19703b88599a227788189Mikhail Naganov                }
36684b674079db819963b227df4dadb0fb5180527e6Mikhail Naganov            }
36784b674079db819963b227df4dadb0fb5180527e6Mikhail Naganov        }
36884b674079db819963b227df4dadb0fb5180527e6Mikhail Naganov        return basicProperties;
36984b674079db819963b227df4dadb0fb5180527e6Mikhail Naganov    }
37084b674079db819963b227df4dadb0fb5180527e6Mikhail Naganov
37167f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood    public void writeToParcel(Parcel parcel, int flags) {
37284b674079db819963b227df4dadb0fb5180527e6Mikhail Naganov        // Needs to be kept in sync with code in MidiDeviceInfo.cpp
37367f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood        parcel.writeInt(mType);
37467f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood        parcel.writeInt(mId);
375b6b9a91c02b7a44cf56943e5358cee68fa4aece5Mike Lockwood        parcel.writeInt(mInputPortCount);
376b6b9a91c02b7a44cf56943e5358cee68fa4aece5Mike Lockwood        parcel.writeInt(mOutputPortCount);
377f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood        parcel.writeStringArray(mInputPortNames);
378f2cd8024028f602a5e4c27f3d9222e872e4e84f2Mike Lockwood        parcel.writeStringArray(mOutputPortNames);
37911fd96d6ff25bc1d710448eab545fe09da55a5f5Mike Lockwood        parcel.writeInt(mIsPrivate ? 1 : 0);
38084b674079db819963b227df4dadb0fb5180527e6Mikhail Naganov        // "Basic" properties only contain properties of primitive types
38184b674079db819963b227df4dadb0fb5180527e6Mikhail Naganov        // and thus can be read back by native code. "Extra" properties is
38284b674079db819963b227df4dadb0fb5180527e6Mikhail Naganov        // a superset that contains all properties.
38384b674079db819963b227df4dadb0fb5180527e6Mikhail Naganov        parcel.writeBundle(getBasicProperties(new String[] {
38484b674079db819963b227df4dadb0fb5180527e6Mikhail Naganov            PROPERTY_NAME, PROPERTY_MANUFACTURER, PROPERTY_PRODUCT, PROPERTY_VERSION,
38584b674079db819963b227df4dadb0fb5180527e6Mikhail Naganov            PROPERTY_SERIAL_NUMBER, PROPERTY_ALSA_CARD, PROPERTY_ALSA_DEVICE
38684b674079db819963b227df4dadb0fb5180527e6Mikhail Naganov        }));
38784b674079db819963b227df4dadb0fb5180527e6Mikhail Naganov        // Must be serialized last so native code can safely ignore it.
38884b674079db819963b227df4dadb0fb5180527e6Mikhail Naganov        parcel.writeBundle(mProperties);
38967f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood   }
39067f8e8bd8927f24147d7a1edd6ec3db1a54233b2Mike Lockwood}
391