summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Mike Lockwood <lockwood@google.com> 2015-03-13 17:27:34 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2015-03-13 17:27:37 +0000
commit4011e209215d19a1633ed5d1643f3b7643001667 (patch)
tree40d870c628a34df729e8becb0feedf10b1acfc30
parent676fa348d04e3f2e6f315a913eb45c79ec6bb03c (diff)
parentf2cd8024028f602a5e4c27f3d9222e872e4e84f2 (diff)
Merge "MidiDeviceInfo meta-data improvements:"
-rw-r--r--media/java/android/media/midi/IMidiManager.aidl3
-rw-r--r--media/java/android/media/midi/MidiDeviceInfo.java112
-rw-r--r--media/java/android/media/midi/MidiManager.java6
-rw-r--r--services/core/java/com/android/server/MidiService.java54
-rw-r--r--services/usb/java/com/android/server/usb/UsbAlsaManager.java18
-rw-r--r--services/usb/java/com/android/server/usb/UsbMidiDevice.java2
6 files changed, 167 insertions, 28 deletions
diff --git a/media/java/android/media/midi/IMidiManager.aidl b/media/java/android/media/midi/IMidiManager.aidl
index a3b40d68b73e..74c63b426726 100644
--- a/media/java/android/media/midi/IMidiManager.aidl
+++ b/media/java/android/media/midi/IMidiManager.aidl
@@ -37,7 +37,8 @@ interface IMidiManager
// for registering built-in MIDI devices
MidiDeviceInfo registerDeviceServer(in IMidiDeviceServer server, int numInputPorts,
- int numOutputPorts, in Bundle properties, int type);
+ int numOutputPorts, in String[] inputPortNames, in String[] outputPortNames,
+ in Bundle properties, int type);
// for unregistering built-in MIDI devices
void unregisterDeviceServer(in IMidiDeviceServer server);
diff --git a/media/java/android/media/midi/MidiDeviceInfo.java b/media/java/android/media/midi/MidiDeviceInfo.java
index 1e97258fe37a..de1a091a36a2 100644
--- a/media/java/android/media/midi/MidiDeviceInfo.java
+++ b/media/java/android/media/midi/MidiDeviceInfo.java
@@ -45,12 +45,12 @@ public final class MidiDeviceInfo implements Parcelable {
*/
public static final int TYPE_VIRTUAL = 2;
- private final int mType; // USB or virtual
- private final int mId; // unique ID generated by MidiService
- private final int mInputPortCount;
- private final int mOutputPortCount;
- private final Bundle mProperties;
- private final boolean mIsPrivate;
+ /**
+ * Bundle key for the device's user visible name property.
+ * Used with the {@link android.os.Bundle} returned by {@link #getProperties}.
+ * For USB devices, this is a concatenation of the manufacturer and product names.
+ */
+ public static final String PROPERTY_NAME = "name";
/**
* Bundle key for the device's manufacturer name property.
@@ -60,11 +60,11 @@ public final class MidiDeviceInfo implements Parcelable {
public static final String PROPERTY_MANUFACTURER = "manufacturer";
/**
- * Bundle key for the device's model name property.
+ * Bundle key for the device's product name property.
* Used with the {@link android.os.Bundle} returned by {@link #getProperties}
* Matches the USB device product name string for USB MIDI devices.
*/
- public static final String PROPERTY_MODEL = "model";
+ public static final String PROPERTY_PRODUCT = "product";
/**
* Bundle key for the device's serial number property.
@@ -108,15 +108,76 @@ public final class MidiDeviceInfo implements Parcelable {
public static final String PROPERTY_SERVICE_INFO = "service_info";
/**
+ * Contains information about an input or output port.
+ */
+ public static final class PortInfo {
+ /**
+ * Port type for input ports
+ */
+ public static final int TYPE_INPUT = 1;
+
+ /**
+ * Port type for output ports
+ */
+ public static final int TYPE_OUTPUT = 2;
+
+ private final int mPortType;
+ private final int mPortNumber;
+ private final String mName;
+
+ PortInfo(int type, int portNumber, String name) {
+ mPortType = type;
+ mPortNumber = portNumber;
+ mName = (name == null ? "" : name);
+ }
+
+ /**
+ * Returns the port type of the port (either {@link #TYPE_INPUT} or {@link #TYPE_OUTPUT})
+ * @return the port type
+ */
+ public int getType() {
+ return mPortType;
+ }
+
+ /**
+ * Returns the port number of the port
+ * @return the port number
+ */
+ public int getPortNumber() {
+ return mPortNumber;
+ }
+
+ /**
+ * Returns the name of the port, or empty string if the port has no name
+ * @return the port name
+ */
+ public String getName() {
+ return mName;
+ }
+ }
+
+ private final int mType; // USB or virtual
+ private final int mId; // unique ID generated by MidiService
+ private final int mInputPortCount;
+ private final int mOutputPortCount;
+ private final String[] mInputPortNames;
+ private final String[] mOutputPortNames;
+ private final Bundle mProperties;
+ private final boolean mIsPrivate;
+
+ /**
* MidiDeviceInfo should only be instantiated by MidiService implementation
* @hide
*/
public MidiDeviceInfo(int type, int id, int numInputPorts, int numOutputPorts,
- Bundle properties, boolean isPrivate) {
+ String[] inputPortNames, String[] outputPortNames, Bundle properties,
+ boolean isPrivate) {
mType = type;
mId = id;
mInputPortCount = numInputPorts;
mOutputPortCount = numOutputPorts;
+ mInputPortNames = inputPortNames;
+ mOutputPortNames = outputPortNames;
mProperties = properties;
mIsPrivate = isPrivate;
}
@@ -159,6 +220,32 @@ public final class MidiDeviceInfo implements Parcelable {
}
/**
+ * Returns information about an input port.
+ *
+ * @param portNumber the number of the input port
+ * @return the input port's information object
+ */
+ public PortInfo getInputPortInfo(int portNumber) {
+ if (portNumber < 0 || portNumber >= mInputPortCount) {
+ throw new IllegalArgumentException("portNumber out of range");
+ }
+ return new PortInfo(PortInfo.TYPE_INPUT, portNumber, mInputPortNames[portNumber]);
+ }
+
+ /**
+ * Returns information about an output port.
+ *
+ * @param portNumber the number of the output port
+ * @return the output port's information object
+ */
+ public PortInfo getOutputPortInfo(int portNumber) {
+ if (portNumber < 0 || portNumber >= mOutputPortCount) {
+ throw new IllegalArgumentException("portNumber out of range");
+ }
+ return new PortInfo(PortInfo.TYPE_OUTPUT, portNumber, mOutputPortNames[portNumber]);
+ }
+
+ /**
* Returns the {@link android.os.Bundle} containing the device's properties.
*
* @return the device's properties
@@ -207,9 +294,12 @@ public final class MidiDeviceInfo implements Parcelable {
int id = in.readInt();
int inputPorts = in.readInt();
int outputPorts = in.readInt();
+ String[] inputPortNames = in.createStringArray();
+ String[] outputPortNames = in.createStringArray();
Bundle properties = in.readBundle();
boolean isPrivate = (in.readInt() == 1);
- return new MidiDeviceInfo(type, id, inputPorts, outputPorts, properties, isPrivate);
+ return new MidiDeviceInfo(type, id, inputPorts, outputPorts,
+ inputPortNames, outputPortNames, properties, isPrivate);
}
public MidiDeviceInfo[] newArray(int size) {
@@ -226,6 +316,8 @@ public final class MidiDeviceInfo implements Parcelable {
parcel.writeInt(mId);
parcel.writeInt(mInputPortCount);
parcel.writeInt(mOutputPortCount);
+ parcel.writeStringArray(mInputPortNames);
+ parcel.writeStringArray(mOutputPortNames);
parcel.writeBundle(mProperties);
parcel.writeInt(mIsPrivate ? 1 : 0);
}
diff --git a/media/java/android/media/midi/MidiManager.java b/media/java/android/media/midi/MidiManager.java
index bab906419e25..1b98ca50b789 100644
--- a/media/java/android/media/midi/MidiManager.java
+++ b/media/java/android/media/midi/MidiManager.java
@@ -277,12 +277,14 @@ public final class MidiManager {
/** @hide */
public MidiDeviceServer createDeviceServer(MidiReceiver[] inputPortReceivers,
- int numOutputPorts, Bundle properties, int type, MidiDeviceServer.Callback callback) {
+ int numOutputPorts, String[] inputPortNames, String[] outputPortNames,
+ Bundle properties, int type, MidiDeviceServer.Callback callback) {
try {
MidiDeviceServer server = new MidiDeviceServer(mService, inputPortReceivers,
numOutputPorts, callback);
MidiDeviceInfo deviceInfo = mService.registerDeviceServer(server.getBinderInterface(),
- inputPortReceivers.length, numOutputPorts, properties, type);
+ inputPortReceivers.length, numOutputPorts, inputPortNames, outputPortNames,
+ properties, type);
if (deviceInfo == null) {
Log.e(TAG, "registerVirtualDevice failed");
return null;
diff --git a/services/core/java/com/android/server/MidiService.java b/services/core/java/com/android/server/MidiService.java
index d534548d1dbc..3418930c3744 100644
--- a/services/core/java/com/android/server/MidiService.java
+++ b/services/core/java/com/android/server/MidiService.java
@@ -316,6 +316,8 @@ public class MidiService extends IMidiManager.Stub {
client.removeListener(listener);
}
+ private static final MidiDeviceInfo[] EMPTY_DEVICE_INFO_ARRAY = new MidiDeviceInfo[0];
+
public MidiDeviceInfo[] getDeviceList() {
ArrayList<MidiDeviceInfo> deviceInfos = new ArrayList<MidiDeviceInfo>();
int uid = Binder.getCallingUid();
@@ -328,7 +330,7 @@ public class MidiService extends IMidiManager.Stub {
}
}
- return deviceInfos.toArray(new MidiDeviceInfo[0]);
+ return deviceInfos.toArray(EMPTY_DEVICE_INFO_ARRAY);
}
@Override
@@ -348,15 +350,16 @@ public class MidiService extends IMidiManager.Stub {
@Override
public MidiDeviceInfo registerDeviceServer(IMidiDeviceServer server, int numInputPorts,
- int numOutputPorts, Bundle properties, int type) {
+ int numOutputPorts, String[] inputPortNames, String[] outputPortNames,
+ Bundle properties, int type) {
int uid = Binder.getCallingUid();
if (type != MidiDeviceInfo.TYPE_VIRTUAL && uid != Process.SYSTEM_UID) {
throw new SecurityException("only system can create non-virtual devices");
}
synchronized (mDevicesByInfo) {
- return addDeviceLocked(type, numInputPorts, numOutputPorts, properties,
- server, null, false, uid);
+ return addDeviceLocked(type, numInputPorts, numOutputPorts, inputPortNames,
+ outputPortNames, properties, server, null, false, uid);
}
}
@@ -420,12 +423,13 @@ public class MidiService extends IMidiManager.Stub {
// synchronize on mDevicesByInfo
private MidiDeviceInfo addDeviceLocked(int type, int numInputPorts, int numOutputPorts,
- Bundle properties, IMidiDeviceServer server, ServiceInfo serviceInfo,
+ String[] inputPortNames, String[] outputPortNames, Bundle properties,
+ IMidiDeviceServer server, ServiceInfo serviceInfo,
boolean isPrivate, int uid) {
int id = mNextDeviceId++;
MidiDeviceInfo deviceInfo = new MidiDeviceInfo(type, id, numInputPorts, numOutputPorts,
- properties, isPrivate);
+ inputPortNames, outputPortNames, properties, isPrivate);
Device device = new Device(server, deviceInfo, serviceInfo, uid);
if (server != null) {
@@ -482,6 +486,8 @@ public class MidiService extends IMidiManager.Stub {
}
}
+ private static final String[] EMPTY_STRING_ARRAY = new String[0];
+
private void addPackageDeviceServer(ServiceInfo serviceInfo) {
XmlResourceParser parser = null;
@@ -494,6 +500,8 @@ public class MidiService extends IMidiManager.Stub {
int numInputPorts = 0;
int numOutputPorts = 0;
boolean isPrivate = false;
+ ArrayList<String> inputPortNames = new ArrayList<String>();
+ ArrayList<String> outputPortNames = new ArrayList<String>();
while (true) {
int eventType = parser.next();
@@ -530,7 +538,18 @@ public class MidiService extends IMidiManager.Stub {
continue;
}
numInputPorts++;
- // TODO - add support for port properties
+
+ String portName = null;
+ int count = parser.getAttributeCount();
+ for (int i = 0; i < count; i++) {
+ String name = parser.getAttributeName(i);
+ String value = parser.getAttributeValue(i);
+ if ("name".equals(name)) {
+ portName = value;
+ break;
+ }
+ }
+ inputPortNames.add(portName);
} else if ("output-port".equals(tagName)) {
if (properties == null) {
Log.w(TAG, "<output-port> outside of <device> in metadata for "
@@ -538,7 +557,18 @@ public class MidiService extends IMidiManager.Stub {
continue;
}
numOutputPorts++;
- // TODO - add support for port properties
+
+ String portName = null;
+ int count = parser.getAttributeCount();
+ for (int i = 0; i < count; i++) {
+ String name = parser.getAttributeName(i);
+ String value = parser.getAttributeValue(i);
+ if ("name".equals(name)) {
+ portName = value;
+ break;
+ }
+ }
+ outputPortNames.add(portName);
}
} else if (eventType == XmlPullParser.END_TAG) {
String tagName = parser.getName();
@@ -563,12 +593,16 @@ public class MidiService extends IMidiManager.Stub {
synchronized (mDevicesByInfo) {
addDeviceLocked(MidiDeviceInfo.TYPE_VIRTUAL,
- numInputPorts, numOutputPorts, properties,
- null, serviceInfo, isPrivate, uid);
+ numInputPorts, numOutputPorts,
+ inputPortNames.toArray(EMPTY_STRING_ARRAY),
+ outputPortNames.toArray(EMPTY_STRING_ARRAY),
+ properties, null, serviceInfo, isPrivate, uid);
}
// setting properties to null signals that we are no longer
// processing a <device>
properties = null;
+ inputPortNames.clear();
+ outputPortNames.clear();
}
}
}
diff --git a/services/usb/java/com/android/server/usb/UsbAlsaManager.java b/services/usb/java/com/android/server/usb/UsbAlsaManager.java
index 78fbe16ddc36..23e19700b56d 100644
--- a/services/usb/java/com/android/server/usb/UsbAlsaManager.java
+++ b/services/usb/java/com/android/server/usb/UsbAlsaManager.java
@@ -394,9 +394,19 @@ public final class UsbAlsaManager {
AlsaDevice alsaDevice = waitForAlsaDevice(addedCard, device, AlsaDevice.TYPE_MIDI);
if (alsaDevice != null) {
Bundle properties = new Bundle();
- properties.putString(MidiDeviceInfo.PROPERTY_MANUFACTURER,
- usbDevice.getManufacturerName());
- properties.putString(MidiDeviceInfo.PROPERTY_MODEL, usbDevice.getProductName());
+ String manufacturer = usbDevice.getManufacturerName();
+ String product = usbDevice.getProductName();
+ String name;
+ if (manufacturer == null || manufacturer.isEmpty()) {
+ name = product;
+ } else if (product == null || product.isEmpty()) {
+ name = manufacturer;
+ } else {
+ name = manufacturer + " " + product;
+ }
+ properties.putString(MidiDeviceInfo.PROPERTY_NAME, name);
+ properties.putString(MidiDeviceInfo.PROPERTY_MANUFACTURER, manufacturer);
+ properties.putString(MidiDeviceInfo.PROPERTY_PRODUCT, product);
properties.putString(MidiDeviceInfo.PROPERTY_SERIAL_NUMBER,
usbDevice.getSerialNumber());
properties.putInt(MidiDeviceInfo.PROPERTY_ALSA_CARD, alsaDevice.mCard);
@@ -454,7 +464,7 @@ public final class UsbAlsaManager {
Resources r = mContext.getResources();
properties.putString(MidiDeviceInfo.PROPERTY_MANUFACTURER, r.getString(
com.android.internal.R.string.usb_midi_peripheral_manufacturer_name));
- properties.putString(MidiDeviceInfo.PROPERTY_MODEL, r.getString(
+ properties.putString(MidiDeviceInfo.PROPERTY_PRODUCT, r.getString(
com.android.internal.R.string.usb_midi_peripheral_model_name));
properties.putInt(MidiDeviceInfo.PROPERTY_ALSA_CARD, card);
properties.putInt(MidiDeviceInfo.PROPERTY_ALSA_DEVICE, device);
diff --git a/services/usb/java/com/android/server/usb/UsbMidiDevice.java b/services/usb/java/com/android/server/usb/UsbMidiDevice.java
index 725f39321eed..df6cfbf0440e 100644
--- a/services/usb/java/com/android/server/usb/UsbMidiDevice.java
+++ b/services/usb/java/com/android/server/usb/UsbMidiDevice.java
@@ -121,7 +121,7 @@ public final class UsbMidiDevice implements Closeable {
int outputCount = mOutputStreams.length;
mServer = midiManager.createDeviceServer(mInputPortReceivers, outputCount,
- properties, MidiDeviceInfo.TYPE_USB, null);
+ null, null, properties, MidiDeviceInfo.TYPE_USB, null);
if (mServer == null) {
return false;
}