private void checkthingsforrecoder() { int audioSessionId = getAudioSessionId(); if(NoiseSuppressor.isAvailable()) { // NoiseSuppressor.create(audioSessionId); } if(AutomaticGainControl.isAvailable()) { // AutomaticGainControl.create(audioSessionId); } if(AcousticEchoCanceler.isAvailable()){ // AcousticEchoCanceler.create(audioSessionId); } }
@CalledByNative public static boolean shouldUseAcousticEchoCanceler() { // AcousticEchoCanceler was added in API level 16 (Jelly Bean). if (!runningOnJellyBeanOrHigher()) { return false; } // Next is a list of device models which have been vetted for good // quality platform echo cancellation. if (!Build.MODEL.equals("SM-T310R") && // Galaxy Tab 3 7.0 !Build.MODEL.equals("GT-I9300") && // Galaxy S3 !Build.MODEL.equals("GT-I9500") && // Galaxy S4 !Build.MODEL.equals("GT-N7105") && // Galaxy Note 2 !Build.MODEL.equals("SM-N9005") && // Galaxy Note 3 !Build.MODEL.equals("Nexus 4") && !Build.MODEL.equals("Nexus 5") && !Build.MODEL.equals("Nexus 7")) { return false; } // As a final check, verify that the device supports acoustic echo // cancellation. return AcousticEchoCanceler.isAvailable(); }
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 = ApplicationLoader.applicationContext.getSharedPreferences("mainconfig", Activity.MODE_PRIVATE); boolean dump = preferences.getBoolean("dbg_dump_call_stats", false); nativeSetConfig(nativeInst, recvTimeout, initTimeout, dataSavingOption, Build.VERSION.SDK_INT<Build.VERSION_CODES.JELLY_BEAN || !(sysAecAvailable && VoIPServerConfig.getBoolean("use_system_aec", true)), Build.VERSION.SDK_INT<Build.VERSION_CODES.JELLY_BEAN || !(sysNsAvailable && VoIPServerConfig.getBoolean("use_system_ns", true)), true, BuildConfig.DEBUG ? getLogFilePath("voip") : getLogFilePath(callID), BuildConfig.DEBUG && dump ? getLogFilePath("voipStats") : null); }
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"); } }
public SpeechRecord(int audioSource, int sampleRateInHz, int channelConfig, int audioFormat, int bufferSizeInBytes, boolean noise, boolean gain, boolean echo) throws IllegalArgumentException { super(audioSource, sampleRateInHz, channelConfig, audioFormat, bufferSizeInBytes); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { Log.i("Trying to enhance audio because running on SDK " + Build.VERSION.SDK_INT); int audioSessionId = getAudioSessionId(); if (noise) { if (NoiseSuppressor.create(audioSessionId) == null) { Log.i("NoiseSuppressor: failed"); } else { Log.i("NoiseSuppressor: ON"); } } else { Log.i("NoiseSuppressor: OFF"); } if (gain) { if (AutomaticGainControl.create(audioSessionId) == null) { Log.i("AutomaticGainControl: failed"); } else { Log.i("AutomaticGainControl: ON"); } } else { Log.i("AutomaticGainControl: OFF"); } if (echo) { if (AcousticEchoCanceler.create(audioSessionId) == null) { Log.i("AcousticEchoCanceler: failed"); } else { Log.i("AcousticEchoCanceler: ON"); } } else { Log.i("AcousticEchoCanceler: OFF"); } } }
@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(); }
/** * Attempt to set enhancers available on modern devices. * <p/> * These are hardware dependent, not build version. Although the APIs weren't available to * devices until API Level 16 */ @SuppressWarnings("NewApi") private void setEnhancers(final int sessionId) { if (!DEBUG) { NoiseSuppressor.create(sessionId); AcousticEchoCanceler.create(sessionId); AutomaticGainControl.create(sessionId); } else { if (NoiseSuppressor.create(sessionId) == null) { MyLog.i(CLS_NAME, "NoiseSuppressor null"); } else { MyLog.i(CLS_NAME, "NoiseSuppressor success"); } if (AcousticEchoCanceler.create(sessionId) == null) { MyLog.i(CLS_NAME, "AcousticEchoCanceler null"); } else { MyLog.i(CLS_NAME, "AcousticEchoCanceler success"); } if (AutomaticGainControl.create(sessionId) == null) { MyLog.i(CLS_NAME, "AutomaticGainControl null"); } else { MyLog.i(CLS_NAME, "AutomaticGainControl success"); } } }
@Override public boolean initCapturer() { // initalize audio mode audioManagerMode.acquireMode(audioManager); // get the minimum buffer size that can be used int minRecBufSize = AudioRecord.getMinBufferSize( captureSettings.getSampleRate(), NUM_CHANNELS_CAPTURING == 1 ? AudioFormat.CHANNEL_IN_MONO : AudioFormat.CHANNEL_IN_STEREO, AudioFormat.ENCODING_PCM_16BIT ); // double size to be more safe int recBufSize = minRecBufSize * 2; // release the object if (noiseSuppressor != null) { noiseSuppressor.release(); noiseSuppressor = null; } if (echoCanceler != null) { echoCanceler.release(); echoCanceler = null; } if (audioRecord != null) { audioRecord.release(); audioRecord = null; } try { audioRecord = new AudioRecord(AudioSource.VOICE_COMMUNICATION, captureSettings.getSampleRate(), NUM_CHANNELS_CAPTURING == 1 ? AudioFormat.CHANNEL_IN_MONO : AudioFormat.CHANNEL_IN_STEREO, AudioFormat.ENCODING_PCM_16BIT, recBufSize); if (NoiseSuppressor.isAvailable()) { noiseSuppressor = NoiseSuppressor.create(audioRecord.getAudioSessionId()); } if (AcousticEchoCanceler.isAvailable()) { echoCanceler = AcousticEchoCanceler.create(audioRecord.getAudioSessionId()); } } catch (Exception e) { throw new RuntimeException(e.getMessage()); } // check that the audioRecord is ready to be used if (audioRecord.getState() != AudioRecord.STATE_INITIALIZED) { throw new RuntimeException("Audio capture is not initialized " + captureSettings.getSampleRate()); } shutdownCaptureThread = false; new Thread(captureThread).start(); return true; }