diff options
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); + } + } |