Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b83ae06a authored by Robert Wu's avatar Robert Wu
Browse files

Add MIDI info to USB dumpsys

Adding MIDI info to USB dumpsys so developers can debug better.

Bug: 229122603
Test: adb shell dumpsys usb
Change-Id: Ic3c7ab21865457b1e1f0f97fdd1827bb0b442481
parent a4889a21
Loading
Loading
Loading
Loading
+37 −0
Original line number Diff line number Diff line
@@ -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;

+22 −1
Original line number Diff line number Diff line
@@ -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);
    }
}
+6 −0
Original line number Diff line number Diff line
@@ -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);
+53 −0
Original line number Diff line number Diff line
@@ -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);
    }

}