97 lines
4.3 KiB
Java
97 lines
4.3 KiB
Java
/*
|
|
* 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);
|
|
}
|
|
}
|