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