From db7ba6939a4e9ab369e2cc0d3ee7d0690f26b11b Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Tue, 10 Mar 2015 12:11:56 +0100 Subject: [PATCH] Changes regarding mic gain + changes for echo cancelation on Android --- coreapi/linphonecall.c | 4 +-- coreapi/linphonecore.c | 8 ++++-- coreapi/linphonecore_jni.cc | 26 +++++++++++++++---- .../org/linphone/core/LinphoneCore.java | 6 +++++ .../org/linphone/core/LinphoneCoreImpl.java | 5 ++++ mediastreamer2 | 2 +- 6 files changed, 40 insertions(+), 11 deletions(-) diff --git a/coreapi/linphonecall.c b/coreapi/linphonecall.c index 67290d46e..258e756a3 100644 --- a/coreapi/linphonecall.c +++ b/coreapi/linphonecall.c @@ -2091,9 +2091,7 @@ static void parametrize_equalizer(LinphoneCore *lc, AudioStream *st){ } void set_mic_gain_db(AudioStream *st, float gain){ - if (st->volsend){ - ms_filter_call_method(st->volsend,MS_VOLUME_SET_DB_GAIN,&gain); - }else ms_warning("Could not apply mic gain: gain control wasn't activated."); + audio_stream_set_mic_gain_db(st, gain); } void set_playback_gain_db(AudioStream *st, float gain){ diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index d710f451c..acc5b9580 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -4771,8 +4771,12 @@ bool_t linphone_core_echo_limiter_enabled(const LinphoneCore *lc){ } static void linphone_core_mute_audio_stream(LinphoneCore *lc, AudioStream *st, bool_t val) { - audio_stream_set_mic_gain(st, - (val==TRUE) ? 0 : pow(10,lc->sound_conf.soft_mic_lev/10)); + if (val) { + audio_stream_set_mic_gain(st, 0); + } else { + audio_stream_set_mic_gain_db(st, lc->sound_conf.soft_mic_lev); + } + if ( linphone_core_get_rtp_no_xmit_on_audio_mute(lc) ){ audio_stream_mute_rtp(st,val); } diff --git a/coreapi/linphonecore_jni.cc b/coreapi/linphonecore_jni.cc index 2642451fa..a1ddbf2ca 100644 --- a/coreapi/linphonecore_jni.cc +++ b/coreapi/linphonecore_jni.cc @@ -1965,15 +1965,31 @@ extern "C" jint Java_org_linphone_core_LinphoneCoreImpl_startEchoCalibration(JNI } -extern "C" jboolean Java_org_linphone_core_LinphoneCoreImpl_needsEchoCalibration(JNIEnv *env, jobject thiz, jlong lc){ +extern "C" jboolean Java_org_linphone_core_LinphoneCoreImpl_needsEchoCalibration(JNIEnv *env, jobject thiz, jlong lc) { MSSndCard *sndcard; - MSSndCardManager *m=ms_snd_card_manager_get(); - const char *card=linphone_core_get_capture_device((LinphoneCore*)lc); - sndcard=ms_snd_card_manager_get_card(m,card); - if (sndcard == NULL){ + MSSndCardManager *m = ms_snd_card_manager_get(); + const char *card = linphone_core_get_capture_device((LinphoneCore*)lc); + sndcard = ms_snd_card_manager_get_card(m, card); + if (sndcard == NULL) { ms_error("Could not get soundcard %s", card); return TRUE; } + + if (ms_snd_card_get_capabilities(sndcard) & MS_SND_CARD_CAP_BUILTIN_ECHO_CANCELLER) return FALSE; + if (ms_snd_card_get_minimal_latency(sndcard) != 0) return FALSE; + return TRUE; +} + +extern "C" jboolean Java_org_linphone_core_LinphoneCoreImpl_needsEchoCanceler(JNIEnv *env, jobject thiz, jlong lc) { + MSSndCard *sndcard; + MSSndCardManager *m = ms_snd_card_manager_get(); + const char *card = linphone_core_get_capture_device((LinphoneCore*)lc); + sndcard = ms_snd_card_manager_get_card(m, card); + if (sndcard == NULL) { + ms_error("Could not get soundcard %s", card); + return TRUE; + } + if (ms_snd_card_get_capabilities(sndcard) & MS_SND_CARD_CAP_BUILTIN_ECHO_CANCELLER) return FALSE; return TRUE; } diff --git a/java/common/org/linphone/core/LinphoneCore.java b/java/common/org/linphone/core/LinphoneCore.java index 62d6de6e8..2c4616dd8 100644 --- a/java/common/org/linphone/core/LinphoneCore.java +++ b/java/common/org/linphone/core/LinphoneCore.java @@ -1164,6 +1164,12 @@ public interface LinphoneCore { * If the device has a builtin echo canceller or calibration value is already known, it will return false. */ boolean needsEchoCalibration(); + + /** + * Returns true if the software echo canceler needs to be turned on. + * If the device has a builtin echo canceller, it will return false. + */ + boolean needsEchoCanceler(); void enableIpv6(boolean enable); diff --git a/java/impl/org/linphone/core/LinphoneCoreImpl.java b/java/impl/org/linphone/core/LinphoneCoreImpl.java index 9586ea371..80d007172 100644 --- a/java/impl/org/linphone/core/LinphoneCoreImpl.java +++ b/java/impl/org/linphone/core/LinphoneCoreImpl.java @@ -1045,6 +1045,11 @@ class LinphoneCoreImpl implements LinphoneCore { public synchronized boolean needsEchoCalibration() { return needsEchoCalibration(nativePtr); } + private native boolean needsEchoCanceler(long ptr); + @Override + public synchronized boolean needsEchoCanceler() { + return needsEchoCanceler(nativePtr); + } private native void declineCall(long coreptr, long callptr, int reason); @Override public synchronized void declineCall(LinphoneCall aCall, Reason reason) { diff --git a/mediastreamer2 b/mediastreamer2 index 8dc83083e..2f4497778 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 8dc83083e8f78ff7466a2611487366af6d00c5f7 +Subproject commit 2f4497778b9c106837eb8f2b948be5532224b618