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