下面列出了android.media.audiofx.AcousticEchoCanceler#isAvailable ( ) 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。
public void setConfig(double recvTimeout, double initTimeout, int dataSavingOption, long callID){
ensureNativeInstance();
boolean sysAecAvailable=false, sysNsAvailable=false;
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN){
try{
sysAecAvailable=AcousticEchoCanceler.isAvailable();
sysNsAvailable=AcousticEchoCanceler.isAvailable();
}catch(Throwable x){
}
}
SharedPreferences preferences=MessagesController.getGlobalMainSettings();
boolean dump=preferences.getBoolean("dbg_dump_call_stats", false);
nativeSetConfig(nativeInst, recvTimeout, initTimeout, dataSavingOption,
!(sysAecAvailable && VoIPServerConfig.getBoolean("use_system_aec", true)),
!(sysNsAvailable && VoIPServerConfig.getBoolean("use_system_ns", true)),
true, BuildConfig.DEBUG ? getLogFilePath("voip"+callID) : getLogFilePath(callID), BuildConfig.DEBUG && dump ? getLogFilePath("voipStats") : null);
}
public void setConfig(double recvTimeout, double initTimeout, int dataSavingOption, long callID){
ensureNativeInstance();
boolean sysAecAvailable=false, sysNsAvailable=false;
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN){
try{
sysAecAvailable=AcousticEchoCanceler.isAvailable();
sysNsAvailable=AcousticEchoCanceler.isAvailable();
}catch(Throwable x){
}
}
SharedPreferences preferences=MessagesController.getGlobalMainSettings();
boolean dump=preferences.getBoolean("dbg_dump_call_stats", false);
nativeSetConfig(nativeInst, recvTimeout, initTimeout, dataSavingOption,
!(sysAecAvailable && VoIPServerConfig.getBoolean("use_system_aec", true)),
!(sysNsAvailable && VoIPServerConfig.getBoolean("use_system_ns", true)),
true, BuildConfig.DEBUG ? getLogFilePath("voip"+callID) : getLogFilePath(callID), BuildConfig.DEBUG && dump ? getLogFilePath("voipStats") : null);
}
public void setConfig(double recvTimeout, double initTimeout, int dataSavingOption, long callID){
ensureNativeInstance();
boolean sysAecAvailable=false, sysNsAvailable=false;
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN){
try{
sysAecAvailable=AcousticEchoCanceler.isAvailable();
sysNsAvailable=NoiseSuppressor.isAvailable();
}catch(Throwable x){
}
}
SharedPreferences preferences=MessagesController.getGlobalMainSettings();
boolean dump=preferences.getBoolean("dbg_dump_call_stats", false);
nativeSetConfig(nativeInst, recvTimeout, initTimeout, dataSavingOption,
!(sysAecAvailable && VoIPServerConfig.getBoolean("use_system_aec", true)),
!(sysNsAvailable && VoIPServerConfig.getBoolean("use_system_ns", true)),
true, BuildVars.DEBUG_VERSION ? getLogFilePath("voip"+callID) : getLogFilePath(callID), BuildVars.DEBUG_VERSION && dump ? getLogFilePath("voipStats") : null,
BuildVars.DEBUG_VERSION);
}
public void setConfig(double recvTimeout, double initTimeout, int dataSavingOption, long callID){
ensureNativeInstance();
boolean sysAecAvailable=false, sysNsAvailable=false;
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN){
try{
sysAecAvailable=AcousticEchoCanceler.isAvailable();
sysNsAvailable=NoiseSuppressor.isAvailable();
}catch(Throwable x){
}
}
SharedPreferences preferences=MessagesController.getGlobalMainSettings();
boolean dump=preferences.getBoolean("dbg_dump_call_stats", false);
nativeSetConfig(nativeInst, recvTimeout, initTimeout, dataSavingOption,
!(sysAecAvailable && VoIPServerConfig.getBoolean("use_system_aec", true)),
!(sysNsAvailable && VoIPServerConfig.getBoolean("use_system_ns", true)),
true, BuildVars.DEBUG_VERSION ? getLogFilePath("voip"+callID) : getLogFilePath(callID), BuildVars.DEBUG_VERSION && dump ? getLogFilePath("voipStats") : null,
BuildVars.DEBUG_VERSION);
}
private void checkthingsforrecoder() {
int audioSessionId = getAudioSessionId();
if(NoiseSuppressor.isAvailable())
{
// NoiseSuppressor.create(audioSessionId);
}
if(AutomaticGainControl.isAvailable())
{
// AutomaticGainControl.create(audioSessionId);
}
if(AcousticEchoCanceler.isAvailable()){
// AcousticEchoCanceler.create(audioSessionId);
}
}
public void enableEchoCanceler() {
if (AcousticEchoCanceler.isAvailable() && acousticEchoCanceler == null) {
acousticEchoCanceler = AcousticEchoCanceler.create(microphoneId);
acousticEchoCanceler.setEnabled(true);
Log.i(TAG, "EchoCanceler enabled");
} else {
Log.e(TAG, "This device don't support EchoCanceler");
}
}
/**
* エコーキャンセラーの使用状態を取得します.
*
* @return エコーキャンセラーを使用する場合はtrue、それ以外はfalse
*/
public boolean isUseAEC() {
if (AcousticEchoCanceler.isAvailable()) {
return mUseAEC;
}
return false;
}
@CalledByNative
private static boolean shouldUseAcousticEchoCanceler() {
// Verify that this device is among the supported/tested models.
List<String> supportedModels = Arrays.asList(SUPPORTED_AEC_MODELS);
if (!supportedModels.contains(Build.MODEL)) {
return false;
}
if (DEBUG && AcousticEchoCanceler.isAvailable()) {
logd("Approved for use of hardware acoustic echo canceler.");
}
// As a final check, verify that the device supports acoustic echo
// cancellation.
return AcousticEchoCanceler.isAvailable();
}
/**
* 音声をレコードして、MediaCodec に渡します.
*/
private void recordAudio() throws NativeInterfaceException {
int samplingRate = mSamplingRate.getValue();
int channels = mChannels == 1 ? AudioFormat.CHANNEL_IN_MONO : AudioFormat.CHANNEL_IN_STEREO;
int audioFormat = AudioFormat.ENCODING_PCM_16BIT;
int bufferSize = AudioRecord.getMinBufferSize(samplingRate, channels, audioFormat) * 4;
int oneFrameDataCount = mSamplingRate.getValue() / mFrameSize.getFps();
mAudioRecord = new AudioRecord(MediaRecorder.AudioSource.DEFAULT,
samplingRate,
channels,
audioFormat,
bufferSize);
if (mAudioRecord.getState() != AudioRecord.STATE_INITIALIZED) {
if (mAudioRecordCallback != null) {
mAudioRecordCallback.onEncoderError();
}
return;
}
if (mUseAEC && AcousticEchoCanceler.isAvailable()) {
// ノイズキャンセラー
mEchoCanceler = AcousticEchoCanceler.create(mAudioRecord.getAudioSessionId());
if (mEchoCanceler != null) {
int ret = mEchoCanceler.setEnabled(true);
if (ret != AudioEffect.SUCCESS) {
if (DEBUG) {
Log.w(TAG, "AcousticEchoCanceler is not supported.");
}
}
}
}
OpusEncoder opusEncoder = null;
try {
opusEncoder = new OpusEncoder(mSamplingRate, mChannels, mFrameSize, mBitRate, mApplication);
mAudioRecord.startRecording();
short[] emptyBuffer = new short[oneFrameDataCount];
short[] pcmBuffer = new short[oneFrameDataCount];
byte[] opusFrameBuffer = opusEncoder.bufferAllocate();
while (!mStopFlag) {
int readSize = mAudioRecord.read(pcmBuffer, 0, oneFrameDataCount);
if (readSize > 0) {
int opusFrameBufferLength;
if (isMute()) {
opusFrameBufferLength = opusEncoder.encode(emptyBuffer, readSize, opusFrameBuffer);
} else {
opusFrameBufferLength = opusEncoder.encode(pcmBuffer, readSize, opusFrameBuffer);
}
if (opusFrameBufferLength > 0 && mAudioRecordCallback != null) {
mAudioRecordCallback.onPeriodicNotification(opusFrameBuffer, opusFrameBufferLength);
}
} else if (readSize == AudioRecord.ERROR_INVALID_OPERATION) {
if (DEBUG) {
Log.e(TAG, "Invalid operation error.");
}
break;
} else if (readSize == AudioRecord.ERROR_BAD_VALUE) {
if (DEBUG) {
Log.e(TAG, "Bad value error.");
}
break;
} else if (readSize == AudioRecord.ERROR) {
if (DEBUG) {
Log.e(TAG, "Unknown error.");
}
break;
}
}
} finally {
if (mEchoCanceler != null) {
mEchoCanceler.release();
mEchoCanceler = null;
}
if (opusEncoder != null) {
opusEncoder.release();
}
}
}
/**
* AudioRecord を開始します.
*/
private void startAudioRecord() {
AudioQuality audioQuality = getAudioQuality();
mBufferSize = AudioRecord.getMinBufferSize(audioQuality.getSamplingRate(),
audioQuality.getChannel(), audioQuality.getFormat()) * 2;
if (DEBUG) {
Log.d(TAG, "AudioQuality: " + audioQuality);
}
mMuteBuffer = new byte[mBufferSize];
mAudioRecord = new AudioRecord(MediaRecorder.AudioSource.DEFAULT,
audioQuality.getSamplingRate(),
audioQuality.getChannel(),
audioQuality.getFormat(),
mBufferSize);
if (mAudioRecord.getState() != AudioRecord.STATE_INITIALIZED) {
postOnError(new MediaEncoderException("AudioRecord is already initialized."));
return;
}
if (mAudioQuality.isUseAEC() && AcousticEchoCanceler.isAvailable()) {
// ノイズキャンセラー
mEchoCanceler = AcousticEchoCanceler.create(mAudioRecord.getAudioSessionId());
if (mEchoCanceler != null) {
int ret = mEchoCanceler.setEnabled(true);
if (ret != AudioEffect.SUCCESS) {
if (DEBUG) {
Log.w(TAG, "AcousticEchoCanceler is not supported.");
}
}
}
}
mAudioRecord.startRecording();
mAudioThread = new AudioRecordThread();
mAudioThread.setName("MicAACLATMEncoder");
mAudioThread.start();
}