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