summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/proto/android/service/usb.proto37
-rw-r--r--services/usb/java/com/android/server/usb/UsbDirectMidiDevice.java23
-rw-r--r--services/usb/java/com/android/server/usb/UsbHostManager.java6
-rw-r--r--services/usb/java/com/android/server/usb/descriptors/UsbMidiBlockParser.java53
4 files changed, 118 insertions, 1 deletions
diff --git a/core/proto/android/service/usb.proto b/core/proto/android/service/usb.proto
index c5eaf42784ab..df5e0a942ca7 100644
--- a/core/proto/android/service/usb.proto
+++ b/core/proto/android/service/usb.proto
@@ -110,6 +110,7 @@ message UsbHostManagerProto {
repeated UsbDeviceProto devices = 2;
optional int32 num_connects = 3;
repeated UsbConnectionRecordProto connections = 4;
+ repeated UsbDirectMidiDeviceProto midi_devices = 5;
}
message UsbDeviceProto {
@@ -305,6 +306,42 @@ message UsbMidiDeviceProto {
optional string device_address = 3;
}
+message UsbDirectMidiDeviceProto {
+ option (android.msg_privacy).dest = DEST_AUTOMATIC;
+
+ optional int32 num_inputs = 1;
+ optional int32 num_outputs = 2;
+ optional bool is_universal = 3;
+ optional string name = 4;
+ optional UsbMidiBlockParserProto block_parser = 5;
+}
+
+message UsbMidiBlockParserProto {
+ option (android.msg_privacy).dest = DEST_AUTOMATIC;
+
+ optional int32 length = 1;
+ optional int32 descriptor_type = 2;
+ optional int32 descriptor_subtype = 3;
+ optional int32 total_length = 4;
+ repeated UsbGroupTerminalBlockProto block = 5;
+}
+
+message UsbGroupTerminalBlockProto {
+ option (android.msg_privacy).dest = DEST_AUTOMATIC;
+
+ optional int32 length = 1;
+ optional int32 descriptor_type = 2;
+ optional int32 descriptor_subtype = 3;
+ optional int32 group_block_id = 4;
+ optional int32 group_terminal_block_type = 5;
+ optional int32 group_terminal = 6;
+ optional int32 num_group_terminals = 7;
+ optional int32 block_item = 8;
+ optional int32 midi_protocol = 9;
+ optional int32 max_input_bandwidth = 10;
+ optional int32 max_output_bandwidth = 11;
+}
+
message UsbSettingsManagerProto {
option (android.msg_privacy).dest = DEST_AUTOMATIC;
diff --git a/services/usb/java/com/android/server/usb/UsbDirectMidiDevice.java b/services/usb/java/com/android/server/usb/UsbDirectMidiDevice.java
index 0fa79df3e008..f3c8be382230 100644
--- a/services/usb/java/com/android/server/usb/UsbDirectMidiDevice.java
+++ b/services/usb/java/com/android/server/usb/UsbDirectMidiDevice.java
@@ -16,6 +16,7 @@
package com.android.server.usb;
+import android.annotation.NonNull;
import android.content.Context;
import android.hardware.usb.UsbDevice;
import android.hardware.usb.UsbDeviceConnection;
@@ -28,10 +29,12 @@ import android.media.midi.MidiDeviceStatus;
import android.media.midi.MidiManager;
import android.media.midi.MidiReceiver;
import android.os.Bundle;
+import android.service.usb.UsbDirectMidiDeviceProto;
import android.util.Log;
import com.android.internal.midi.MidiEventScheduler;
import com.android.internal.midi.MidiEventScheduler.MidiEvent;
+import com.android.internal.util.dump.DualDumpOutputStream;
import com.android.server.usb.descriptors.UsbDescriptorParser;
import com.android.server.usb.descriptors.UsbEndpointDescriptor;
import com.android.server.usb.descriptors.UsbInterfaceDescriptor;
@@ -52,6 +55,7 @@ public final class UsbDirectMidiDevice implements Closeable {
private static final boolean DEBUG = false;
private Context mContext;
+ private String mName;
private UsbDevice mUsbDevice;
private UsbDescriptorParser mParser;
private ArrayList<UsbInterfaceDescriptor> mUsbInterfaces;
@@ -472,7 +476,7 @@ public final class UsbDirectMidiDevice implements Closeable {
} else {
name += " MIDI 1.0";
}
- Log.e(TAG, name);
+ mName = name;
properties.putString(MidiDeviceInfo.PROPERTY_NAME, name);
properties.putString(MidiDeviceInfo.PROPERTY_MANUFACTURER, manufacturer);
properties.putString(MidiDeviceInfo.PROPERTY_PRODUCT, product);
@@ -566,4 +570,21 @@ public final class UsbDirectMidiDevice implements Closeable {
}
return true;
}
+
+ /**
+ * Write a description of the device to a dump stream.
+ */
+ public void dump(@NonNull DualDumpOutputStream dump, @NonNull String idName, long id) {
+ long token = dump.start(idName, id);
+
+ dump.write("num_inputs", UsbDirectMidiDeviceProto.NUM_INPUTS, mNumInputs);
+ dump.write("num_outputs", UsbDirectMidiDeviceProto.NUM_OUTPUTS, mNumOutputs);
+ dump.write("is_universal", UsbDirectMidiDeviceProto.IS_UNIVERSAL, mIsUniversalMidiDevice);
+ dump.write("name", UsbDirectMidiDeviceProto.NAME, mName);
+ if (mIsUniversalMidiDevice) {
+ mMidiBlockParser.dump(dump, "block_parser", UsbDirectMidiDeviceProto.BLOCK_PARSER);
+ }
+
+ dump.end(token);
+ }
}
diff --git a/services/usb/java/com/android/server/usb/UsbHostManager.java b/services/usb/java/com/android/server/usb/UsbHostManager.java
index dd58d3879bb2..b1c85fe043ec 100644
--- a/services/usb/java/com/android/server/usb/UsbHostManager.java
+++ b/services/usb/java/com/android/server/usb/UsbHostManager.java
@@ -588,6 +588,12 @@ public class UsbHostManager {
for (ConnectionRecord rec : mConnections) {
rec.dump(dump, "connections", UsbHostManagerProto.CONNECTIONS);
}
+
+ for (ArrayList<UsbDirectMidiDevice> directMidiDevices : mMidiDevices.values()) {
+ for (UsbDirectMidiDevice directMidiDevice : directMidiDevices) {
+ directMidiDevice.dump(dump, "midi_devices", UsbHostManagerProto.MIDI_DEVICES);
+ }
+ }
}
dump.end(token);
diff --git a/services/usb/java/com/android/server/usb/descriptors/UsbMidiBlockParser.java b/services/usb/java/com/android/server/usb/descriptors/UsbMidiBlockParser.java
index 37bd0f8f6f7b..eb083044c782 100644
--- a/services/usb/java/com/android/server/usb/descriptors/UsbMidiBlockParser.java
+++ b/services/usb/java/com/android/server/usb/descriptors/UsbMidiBlockParser.java
@@ -15,10 +15,15 @@
*/
package com.android.server.usb.descriptors;
+import android.annotation.NonNull;
import android.hardware.usb.UsbConstants;
import android.hardware.usb.UsbDeviceConnection;
+import android.service.usb.UsbGroupTerminalBlockProto;
+import android.service.usb.UsbMidiBlockParserProto;
import android.util.Log;
+import com.android.internal.util.dump.DualDumpOutputStream;
+
import java.util.ArrayList;
/**
@@ -70,6 +75,34 @@ public class UsbMidiBlockParser {
mMaxOutputBandwidth = stream.unpackUsbShort();
return mLength;
}
+
+ /**
+ * Write the state of the block to a dump stream.
+ */
+ public void dump(@NonNull DualDumpOutputStream dump, @NonNull String idName, long id) {
+ long token = dump.start(idName, id);
+
+ dump.write("length", UsbGroupTerminalBlockProto.LENGTH, mLength);
+ dump.write("descriptor_type", UsbGroupTerminalBlockProto.DESCRIPTOR_TYPE,
+ mDescriptorType);
+ dump.write("descriptor_subtype", UsbGroupTerminalBlockProto.DESCRIPTOR_SUBTYPE,
+ mDescriptorSubtype);
+ dump.write("group_block_id", UsbGroupTerminalBlockProto.GROUP_BLOCK_ID, mGroupBlockId);
+ dump.write("group_terminal_block_type",
+ UsbGroupTerminalBlockProto.GROUP_TERMINAL_BLOCK_TYPE, mGroupTerminalBlockType);
+ dump.write("group_terminal", UsbGroupTerminalBlockProto.GROUP_TERMINAL,
+ mGroupTerminal);
+ dump.write("num_group_terminals", UsbGroupTerminalBlockProto.NUM_GROUP_TERMINALS,
+ mNumGroupTerminals);
+ dump.write("block_item", UsbGroupTerminalBlockProto.BLOCK_ITEM, mBlockItem);
+ dump.write("midi_protocol", UsbGroupTerminalBlockProto.MIDI_PROTOCOL, mMidiProtocol);
+ dump.write("max_input_bandwidth", UsbGroupTerminalBlockProto.MAX_INPUT_BANDWIDTH,
+ mMaxInputBandwidth);
+ dump.write("max_output_bandwidth", UsbGroupTerminalBlockProto.MAX_OUTPUT_BANDWIDTH,
+ mMaxOutputBandwidth);
+
+ dump.end(token);
+ }
}
private ArrayList<GroupTerminalBlock> mGroupTerminalBlocks =
@@ -170,4 +203,24 @@ public class UsbMidiBlockParser {
}
return DEFAULT_MIDI_TYPE;
}
+
+ /**
+ * Write the state of the parser to a dump stream.
+ */
+ public void dump(@NonNull DualDumpOutputStream dump, @NonNull String idName, long id) {
+ long token = dump.start(idName, id);
+
+ dump.write("length", UsbMidiBlockParserProto.LENGTH, mHeaderLength);
+ dump.write("descriptor_type", UsbMidiBlockParserProto.DESCRIPTOR_TYPE,
+ mHeaderDescriptorType);
+ dump.write("descriptor_subtype", UsbMidiBlockParserProto.DESCRIPTOR_SUBTYPE,
+ mHeaderDescriptorSubtype);
+ dump.write("total_length", UsbMidiBlockParserProto.TOTAL_LENGTH, mTotalLength);
+ for (GroupTerminalBlock groupTerminalBlock : mGroupTerminalBlocks) {
+ groupTerminalBlock.dump(dump, "block", UsbMidiBlockParserProto.BLOCK);
+ }
+
+ dump.end(token);
+ }
+
}