content: /*
   * Copyright (C) 2017 The Android Open Source Project
   *
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
   *      http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   */
  package com.android.server.usb.descriptors;
  
  import com.android.server.usb.descriptors.report.ReportCanvas;
  import com.android.server.usb.descriptors.report.UsbStrings;
  
  /**
   * @hide
   * An audio class-specific Format Interface.
   *   Subclasses: UsbACFormatI and UsbACFormatII.
   * see audio10.pdf section 4.5.3 & & Frmts10.pdf
   */
  public class UsbASFormat extends UsbACInterface {
      private static final String TAG = "UsbASFormat";
  
      private final byte mFormatType;   // 3:1 FORMAT_TYPE_*
  
      public static final byte FORMAT_TYPE_I      = 1;
      public static final byte FORMAT_TYPE_II     = 2;
      // these showed up in USB 2.0
      public static final byte FORMAT_TYPE_III    = 3;
      public static final byte FORMAT_TYPE_IV     = 4;
  
      // "extended" formats
      public static final byte EXT_FORMAT_TYPE_I      = (byte) 0x81;
      public static final byte EXT_FORMAT_TYPE_II     = (byte) 0x82;
      public static final byte EXT_FORMAT_TYPE_III    = (byte) 0x83;
  
      public UsbASFormat(int length, byte type, byte subtype, byte formatType, int mSubclass) {
          super(length, type, subtype, mSubclass);
          mFormatType = formatType;
      }
  
      public byte getFormatType() {
          return mFormatType;
      }
  
      public int[] getSampleRates() {
          return null;
      }
  
      public int[] getBitDepths() {
          return null;
      }
  
      public int[] getChannelCounts() {
          return null;
      }
  
      /**
       * Allocates the audio-class format subtype associated with the format type read from the
       * stream.
       */
      public static UsbDescriptor allocDescriptor(UsbDescriptorParser parser,
              ByteStream stream, int length, byte type,
              byte subtype, int subclass) {
  
          byte formatType = stream.getByte();
          int acInterfaceSpec = parser.getACInterfaceSpec();
  
          switch (formatType) {
              case FORMAT_TYPE_I:
                  if (acInterfaceSpec == UsbDeviceDescriptor.USBSPEC_2_0) {
                      return new Usb20ASFormatI(length, type, subtype, formatType, subclass);
                  } else {
                      return new Usb10ASFormatI(length, type, subtype, formatType, subclass);
                  }
  
              case FORMAT_TYPE_II:
                  if (acInterfaceSpec == UsbDeviceDescriptor.USBSPEC_2_0) {
                      return new Usb20ASFormatII(length, type, subtype, formatType, subclass);
                  } else {
                      return new Usb10ASFormatII(length, type, subtype, formatType, subclass);
                  }
  
              // USB 2.0 Exclusive Format Types
              case FORMAT_TYPE_III:
                  return new Usb20ASFormatIII(length, type, subtype, formatType, subclass);
  
              case FORMAT_TYPE_IV:
                  //TODO - implement this type.
              default:
                  return new UsbASFormat(length, type, subtype, formatType, subclass);
          }
      }
  
      @Override
      public void report(ReportCanvas canvas) {
          super.report(canvas);
  
          canvas.writeParagraph(UsbStrings.getFormatName(getFormatType()), /*emphasis*/false);
      }
  }
  