1fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean/*
2fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean * Copyright (C) 2017 The Android Open Source Project
3fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean *
4fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean * Licensed under the Apache License, Version 2.0 (the "License");
5fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean * you may not use this file except in compliance with the License.
6fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean * You may obtain a copy of the License at
7fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean *
8fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean *      http://www.apache.org/licenses/LICENSE-2.0
9fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean *
10fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean * Unless required by applicable law or agreed to in writing, software
11fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean * distributed under the License is distributed on an "AS IS" BASIS,
12fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean * See the License for the specific language governing permissions and
14fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean * limitations under the License.
15fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean */
16fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLeanpackage com.android.server.usb.descriptors;
17fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean
18fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLeanimport com.android.server.usb.descriptors.report.ReportCanvas;
19fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean
20fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean/**
21fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean * Audio20.pdf - 4.9.2 Class-Specific AS Interface Descriptor
22fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean * 16 bytes
23fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean */
24fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLeanpublic final class Usb20ASGeneral extends UsbACInterface {
25fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    private static final String TAG = "Usb20ASGeneral";
26fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean
27fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    // Audio20.pdf - Table 4-27
28fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    private byte mTerminalLink; // 3:1 The Terminal ID of the Terminal to which
29fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean                                // this interface is connected.
30fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    private byte mControls;     // 4:1 see audio20.pdf Table 4-27
31fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    private byte mFormatType;   // 5:1 Constant identifying the Format Type the
32fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean                                // AudioStreaming interface is using.
33fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    private int mFormats;       // 6:4 The Audio Data Format(s) that can be
34fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean                                // used to communicate with this interface.
35fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean                                // See the USB Audio Data Formats
36fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean                                // document for further details.
37fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    private byte mNumChannels;  // 10:1 Number of physical channels in the AS
38fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean                                // Interface audio channel cluster.
39fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    private int mChannelConfig; // 11:4 Describes the spatial location of the
40fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean                                // physical channels.
41fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    private byte mChannelNames; // 15:1 Index of a string descriptor, describing the
42fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean                                // name of the first physical channel.
43fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean
44fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    public Usb20ASGeneral(int length, byte type, byte subtype, byte subclass) {
45fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean        super(length, type, subtype, subclass);
46fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    }
47fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean
48fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    public byte getTerminalLink() {
49fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean        return mTerminalLink;
50fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    }
51fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean
52fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    public byte getControls() {
53fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean        return mControls;
54fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    }
55fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean
56fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    public byte getFormatType() {
57fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean        return mFormatType;
58fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    }
59fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean
60fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    public int getFormats() {
61fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean        return mFormats;
62fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    }
63fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean
64fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    public byte getNumChannels() {
65fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean        return mNumChannels;
66fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    }
67fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean
68fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    public int getChannelConfig() {
69fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean        return mChannelConfig;
70fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    }
71fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean
72fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    public byte getChannelNames() {
73fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean        return mChannelNames;
74fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    }
75fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean
76fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    @Override
77fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    public int parseRawDescriptors(ByteStream stream) {
78fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean
79fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean        mTerminalLink = stream.getByte();
80fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean        mControls = stream.getByte();
81fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean        mFormatType = stream.getByte();
82fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean        mFormats = stream.unpackUsbInt();
83fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean        mNumChannels = stream.getByte();
84fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean        mChannelConfig = stream.unpackUsbInt();
85fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean        mChannelNames = stream.getByte();
86fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean
87fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean        return mLength;
88fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    }
89fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean
90fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    @Override
91fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    public void report(ReportCanvas canvas) {
92fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean        super.report(canvas);
93fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean
94fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean        canvas.openList();
95fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean        canvas.writeListItem("Terminal Link: " + getTerminalLink());
96fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean        canvas.writeListItem("Controls: " + ReportCanvas.getHexString(getControls()));
97fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean        canvas.writeListItem("Format Type: " + ReportCanvas.getHexString(getFormatType()));
98fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean        canvas.writeListItem("Formats: " + ReportCanvas.getHexString(getFormats()));
99fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean        canvas.writeListItem("Num Channels: " + getNumChannels());
100fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean        canvas.writeListItem("Channel Config: " + ReportCanvas.getHexString(getChannelConfig()));
101fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean        canvas.writeListItem("Channel Names String ID: " + getChannelNames());
102fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean        canvas.closeList();
103fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    }
104fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean}
105