content: /*
   * Copyright (C) 2014 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 android.media;
  
  import android.annotation.UnsupportedAppUsage;
  import android.media.AudioSystem;
  
  /**
   * The AudioDevicePort is a specialized type of AudioPort
   * describing an input (e.g microphone) or output device (e.g speaker)
   * of the system.
   * An AudioDevicePort is an AudioPort controlled by the audio HAL, almost always a physical
   * device at the boundary of the audio system.
   * In addition to base audio port attributes, the device descriptor contains:
   * - the device type (e.g AudioManager.DEVICE_OUT_SPEAKER)
   * - the device address (e.g MAC adddress for AD2P sink).
   * @see AudioPort
   * @hide
   */
  
  public class AudioDevicePort extends AudioPort {
  
      private final int mType;
      private final String mAddress;
  
      @UnsupportedAppUsage
      AudioDevicePort(AudioHandle handle, String deviceName,
              int[] samplingRates, int[] channelMasks, int[] channelIndexMasks,
              int[] formats, AudioGain[] gains, int type, String address) {
          super(handle,
               (AudioManager.isInputDevice(type) == true)  ?
                          AudioPort.ROLE_SOURCE : AudioPort.ROLE_SINK,
               deviceName, samplingRates, channelMasks, channelIndexMasks, formats, gains);
          mType = type;
          mAddress = address;
      }
  
      /**
       * Get the device type (e.g AudioManager.DEVICE_OUT_SPEAKER)
       */
      @UnsupportedAppUsage
      public int type() {
          return mType;
      }
  
      /**
       * Get the device address. Address format varies with the device type.
       * - USB devices ({@link AudioManager#DEVICE_OUT_USB_DEVICE},
       * {@link AudioManager#DEVICE_IN_USB_DEVICE}) use an address composed of the ALSA card number
       * and device number: "card=2;device=1"
       * - Bluetooth devices ({@link AudioManager#DEVICE_OUT_BLUETOOTH_SCO},
       * {@link AudioManager#DEVICE_OUT_BLUETOOTH_SCO}, {@link AudioManager#DEVICE_OUT_BLUETOOTH_A2DP})
       * use the MAC address of the bluetooth device in the form "00:11:22:AA:BB:CC" as reported by
       * {@link BluetoothDevice#getAddress()}.
       * - Deivces that do not have an address will indicate an empty string "".
       */
      public String address() {
          return mAddress;
      }
  
      /**
       * Build a specific configuration of this audio device port for use by methods
       * like AudioManager.connectAudioPatch().
       */
      public AudioDevicePortConfig buildConfig(int samplingRate, int channelMask, int format,
                                            AudioGainConfig gain) {
          return new AudioDevicePortConfig(this, samplingRate, channelMask, format, gain);
      }
  
      @Override
      public boolean equals(Object o) {
          if (o == null || !(o instanceof AudioDevicePort)) {
              return false;
          }
          AudioDevicePort other = (AudioDevicePort)o;
          if (mType != other.type()) {
              return false;
          }
          if (mAddress == null && other.address() != null) {
              return false;
          }
          if (!mAddress.equals(other.address())) {
              return false;
          }
          return super.equals(o);
      }
  
      @Override
      public String toString() {
          String type = (mRole == ROLE_SOURCE ?
                              AudioSystem.getInputDeviceName(mType) :
                              AudioSystem.getOutputDeviceName(mType));
          return "{" + super.toString()
                  + ", mType: " + type
                  + ", mAddress: " + mAddress
                  + "}";
      }
  }
  