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  */
16 package com.android.server.usb.descriptors;
17 
18 import com.android.server.usb.descriptors.report.ReportCanvas;
19 import com.android.server.usb.descriptors.report.UsbStrings;
20 
21 /**
22  * @hide
23  * An audio class-specific Format Interface.
24  *   Subclasses: UsbACFormatI and UsbACFormatII.
25  * see audio10.pdf section 4.5.3 & & Frmts10.pdf
26  */
27 public class UsbASFormat extends UsbACInterface {
28     private static final String TAG = "UsbASFormat";
29 
30     private final byte mFormatType;   // 3:1 FORMAT_TYPE_*
31 
32     public static final byte FORMAT_TYPE_I      = 1;
33     public static final byte FORMAT_TYPE_II     = 2;
34     // these showed up in USB 2.0
35     public static final byte FORMAT_TYPE_III    = 3;
36     public static final byte FORMAT_TYPE_IV     = 4;
37 
38     // "extended" formats
39     public static final byte EXT_FORMAT_TYPE_I      = (byte) 0x81;
40     public static final byte EXT_FORMAT_TYPE_II     = (byte) 0x82;
41     public static final byte EXT_FORMAT_TYPE_III    = (byte) 0x83;
42 
UsbASFormat(int length, byte type, byte subtype, byte formatType, int mSubclass)43     public UsbASFormat(int length, byte type, byte subtype, byte formatType, int mSubclass) {
44         super(length, type, subtype, mSubclass);
45         mFormatType = formatType;
46     }
47 
getFormatType()48     public byte getFormatType() {
49         return mFormatType;
50     }
51 
getSampleRates()52     public int[] getSampleRates() {
53         return null;
54     }
55 
getBitDepths()56     public int[] getBitDepths() {
57         return null;
58     }
59 
getChannelCounts()60     public int[] getChannelCounts() {
61         return null;
62     }
63 
64     /**
65      * Allocates the audio-class format subtype associated with the format type read from the
66      * stream.
67      */
allocDescriptor(UsbDescriptorParser parser, ByteStream stream, int length, byte type, byte subtype, int subclass)68     public static UsbDescriptor allocDescriptor(UsbDescriptorParser parser,
69             ByteStream stream, int length, byte type,
70             byte subtype, int subclass) {
71 
72         byte formatType = stream.getByte();
73         int acInterfaceSpec = parser.getACInterfaceSpec();
74 
75         switch (formatType) {
76             case FORMAT_TYPE_I:
77                 if (acInterfaceSpec == UsbDeviceDescriptor.USBSPEC_2_0) {
78                     return new Usb20ASFormatI(length, type, subtype, formatType, subclass);
79                 } else {
80                     return new Usb10ASFormatI(length, type, subtype, formatType, subclass);
81                 }
82 
83             case FORMAT_TYPE_II:
84                 if (acInterfaceSpec == UsbDeviceDescriptor.USBSPEC_2_0) {
85                     return new Usb20ASFormatII(length, type, subtype, formatType, subclass);
86                 } else {
87                     return new Usb10ASFormatII(length, type, subtype, formatType, subclass);
88                 }
89 
90             // USB 2.0 Exclusive Format Types
91             case FORMAT_TYPE_III:
92                 return new Usb20ASFormatIII(length, type, subtype, formatType, subclass);
93 
94             case FORMAT_TYPE_IV:
95                 //TODO - implement this type.
96             default:
97                 return new UsbASFormat(length, type, subtype, formatType, subclass);
98         }
99     }
100 
101     @Override
report(ReportCanvas canvas)102     public void report(ReportCanvas canvas) {
103         super.report(canvas);
104 
105         canvas.writeParagraph(UsbStrings.getFormatName(getFormatType()), /*emphasis*/false);
106     }
107 }
108