content: /*
   * Copyright (C) 2011 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.audiofx;
  
  import android.util.Log;
  
  /**
   * Acoustic Echo Canceler (AEC).
   * <p>Acoustic Echo Canceler (AEC) is an audio pre-processor which removes the contribution of the
   * signal received from the remote party from the captured audio signal.
   * <p>AEC is used by voice communication applications (voice chat, video conferencing, SIP calls)
   * where the presence of echo with significant delay in the signal received from the remote party
   * is highly disturbing. AEC is often used in conjunction with noise suppression (NS).
   * <p>An application creates an AcousticEchoCanceler object to instantiate and control an AEC
   * engine in the audio capture path.
   * <p>To attach the AcousticEchoCanceler to a particular {@link android.media.AudioRecord},
   * specify the audio session ID of this AudioRecord when creating the AcousticEchoCanceler.
   * The audio session is retrieved by calling
   * {@link android.media.AudioRecord#getAudioSessionId()} on the AudioRecord instance.
   * <p>On some devices, an AEC can be inserted by default in the capture path by the platform
   * according to the {@link android.media.MediaRecorder.AudioSource} used. The application should
   * call AcousticEchoCanceler.getEnable() after creating the AEC to check the default AEC activation
   * state on a particular AudioRecord session.
   * <p>See {@link android.media.audiofx.AudioEffect} class for more details on
   * controlling audio effects.
   */
  
  public class AcousticEchoCanceler extends AudioEffect {
  
      private final static String TAG = "AcousticEchoCanceler";
  
      /**
       * Checks if the device implements acoustic echo cancellation.
       * @return true if the device implements acoustic echo cancellation, false otherwise.
       */
      public static boolean isAvailable() {
          return AudioEffect.isEffectTypeAvailable(AudioEffect.EFFECT_TYPE_AEC);
      }
  
      /**
       * Creates an AcousticEchoCanceler and attaches it to the AudioRecord on the audio
       * session specified.
       * @param audioSession system wide unique audio session identifier. The AcousticEchoCanceler
       * will be applied to the AudioRecord with the same audio session.
       * @return AcousticEchoCanceler created or null if the device does not implement AEC.
       */
      public static AcousticEchoCanceler create(int audioSession) {
          AcousticEchoCanceler aec = null;
          try {
              aec = new AcousticEchoCanceler(audioSession);
          } catch (IllegalArgumentException e) {
              Log.w(TAG, "not implemented on this device"+ aec);
          } catch (UnsupportedOperationException e) {
              Log.w(TAG, "not enough resources");
          } catch (RuntimeException e) {
              Log.w(TAG, "not enough memory");
          }
          return aec;
      }
  
      /**
       * Class constructor.
       * <p> The constructor is not guarantied to succeed and throws the following exceptions:
       * <ul>
       *  <li>IllegalArgumentException is thrown if the device does not implement an AEC</li>
       *  <li>UnsupportedOperationException is thrown is the resources allocated to audio
       *  pre-procesing are currently exceeded.</li>
       *  <li>RuntimeException is thrown if a memory allocation error occurs.</li>
       * </ul>
       *
       * @param audioSession system wide unique audio session identifier. The AcousticEchoCanceler
       * will be applied to the AudioRecord with the same audio session.
       *
       * @throws java.lang.IllegalArgumentException
       * @throws java.lang.UnsupportedOperationException
       * @throws java.lang.RuntimeException
       */
      private AcousticEchoCanceler(int audioSession)
              throws IllegalArgumentException, UnsupportedOperationException, RuntimeException {
          super(EFFECT_TYPE_AEC, EFFECT_TYPE_NULL, 0, audioSession);
      }
  }
  