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 * @hide
22fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean * An audio class-specific Mixer Interface.
23fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean * see audio10.pdf section 4.3.2.3
24fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean */
25fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLeanpublic final class Usb10ACMixerUnit extends UsbACMixerUnit {
26fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    private static final String TAG = "Usb10ACMixerUnit";
27fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean
28fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    private int mChannelConfig; // Spatial location of output channels
29fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    private byte mChanNameID;   // First channel name string descriptor ID
30fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    private byte[] mControls;   // bitmasks of which controls are present for each channel
31fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    private byte mNameID;       // string descriptor ID of mixer name
32fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean
33558ff9d3f5f0a70d745b72d1d2d84f4e91850b8bPaul McLean    public Usb10ACMixerUnit(int length, byte type, byte subtype, int subClass) {
34fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean        super(length, type, subtype, subClass);
35fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    }
36fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean
37fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    public int getChannelConfig() {
38fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean        return mChannelConfig;
39fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    }
40fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean
41fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    public byte getChanNameID() {
42fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean        return mChanNameID;
43fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    }
44fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean
45fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    public byte[] getControls() {
46fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean        return mControls;
47fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    }
48fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean
49fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    public byte getNameID() {
50fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean        return mNameID;
51fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    }
52fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean
53fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    @Override
54fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    public int parseRawDescriptors(ByteStream stream) {
55fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean        super.parseRawDescriptors(stream);
56fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean
57fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean        mChannelConfig = stream.unpackUsbShort();
58fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean        mChanNameID = stream.getByte();
59fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean
60fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean        int controlArraySize = calcControlArraySize(mNumInputs, mNumOutputs);
61fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean        mControls = new byte[controlArraySize];
62fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean        for (int index = 0; index < controlArraySize; index++) {
63fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean            mControls[index] = stream.getByte();
64fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean        }
65fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean
66fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean        mNameID = stream.getByte();
67fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean
68fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean        return mLength;
69fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    }
70fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean
71fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    @Override
72fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    public void report(ReportCanvas canvas) {
73fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean        super.report(canvas);
74fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean
75fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean        canvas.writeParagraph("Mixer Unit", false);
76fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean        canvas.openList();
77fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean
78fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean        canvas.writeListItem("Unit ID: " + ReportCanvas.getHexString(getUnitID()));
79fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean        byte numInputs = getNumInputs();
80fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean        byte[] inputIDs = getInputIDs();
81fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean        canvas.openListItem();
82fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean        canvas.write("Num Inputs: " + numInputs + " [");
83fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean        for (int input = 0; input < numInputs; input++) {
84fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean            canvas.write("" + ReportCanvas.getHexString(inputIDs[input]));
85fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean            if (input < numInputs - 1) {
86fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean                canvas.write(" ");
87fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean            }
88fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean        }
89fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean        canvas.write("]");
90fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean        canvas.closeListItem();
91fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean
92fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean        canvas.writeListItem("Num Outputs: " + getNumOutputs());
93fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean        canvas.writeListItem("Channel Config: " + ReportCanvas.getHexString(getChannelConfig()));
94fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean
95fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean        byte[] controls = getControls();
96fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean        canvas.openListItem();
97fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean        canvas.write("Controls: " + controls.length + " [");
98fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean        for (int ctrl = 0; ctrl < controls.length; ctrl++) {
99fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean            canvas.write("" + controls[ctrl]);
100fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean            if (ctrl < controls.length - 1) {
101fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean                canvas.write(" ");
102fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean            }
103fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean        }
104fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean        canvas.write("]");
105fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean        canvas.closeListItem();
106fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean        canvas.closeList();
107fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    }
108fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean}
109