]> sjero.net Git - linphone/commitdiff
Add mic gain db getter/setter
authorYann Diorcet <yann.diorcet@belledonne-communications.com>
Tue, 6 Nov 2012 13:44:16 +0000 (14:44 +0100)
committerYann Diorcet <yann.diorcet@belledonne-communications.com>
Tue, 6 Nov 2012 13:44:16 +0000 (14:44 +0100)
Save playback/mic at config uninit

coreapi/linphonecall.c
coreapi/linphonecore.c
coreapi/linphonecore.h
coreapi/private.h

index 70395841aa4c841a1838fa2cf32982e64de1b0a0..6f8c06ef2117e2ee17c65dd5f1e11c57f53d525b 100644 (file)
@@ -27,7 +27,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 #include "private.h"
 #include <ortp/event.h>
 #include <ortp/b64.h>
-
+#include <math.h>
 
 #include "mediastreamer2/mediastream.h"
 #include "mediastreamer2/msvolume.h"
@@ -1189,7 +1189,7 @@ static void parametrize_equalizer(LinphoneCore *lc, AudioStream *st){
 }
 
 void _post_configure_audio_stream(AudioStream *st, LinphoneCore *lc, bool_t muted){
-       float mic_gain=lp_config_get_float(lc->config,"sound","mic_gain",1);
+       float mic_gain=lc->sound_conf.soft_mic_lev;
        float thres = 0;
        float recv_gain;
        float ng_thres=lp_config_get_float(lc->config,"sound","ng_thres",0.05);
@@ -1197,7 +1197,7 @@ void _post_configure_audio_stream(AudioStream *st, LinphoneCore *lc, bool_t mute
        int dc_removal=lp_config_get_int(lc->config,"sound","dc_removal",0);
 
        if (!muted)
-               audio_stream_set_mic_gain(st,mic_gain);
+               linphone_core_set_mic_gain_db (lc, mic_gain);
        else
                audio_stream_set_mic_gain(st,0);
 
@@ -1231,7 +1231,7 @@ void _post_configure_audio_stream(AudioStream *st, LinphoneCore *lc, bool_t mute
        }
        if (st->volrecv){
                /* parameters for a limited noise-gate effect, using echo limiter threshold */
-               float floorgain = 1/mic_gain;
+               float floorgain = 1/pow(10,(mic_gain)/10);
                int spk_agc=lp_config_get_int(lc->config,"sound","speaker_agc_enabled",0);
                ms_filter_call_method(st->volrecv, MS_VOLUME_ENABLE_AGC, &spk_agc);
                ms_filter_call_method(st->volrecv,MS_VOLUME_SET_NOISE_GATE_THRESHOLD,&ng_thres);
index 8de92f23b94d0dac90bd431f54a0163481bc75f7..1af9b08ca3d20307c5e49dd1c2ab7e5e81aa0ff7 100644 (file)
@@ -24,6 +24,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 #include "lpconfig.h"
 #include "private.h"
 
+#include <math.h>
 #include <ortp/telephonyevents.h>
 #include <ortp/zrtp.h>
 #include "mediastreamer2/mediastream.h"
@@ -425,7 +426,6 @@ static void sound_config_read(LinphoneCore *lc)
        int tmp;
        const char *tmpbuf;
        const char *devid;
-       float gain=0;
 #ifdef __linux
        /*alsadev let the user use custom alsa device within linphone*/
        devid=lp_config_get_string(lc->config,"sound","alsadev",NULL);
@@ -497,8 +497,8 @@ static void sound_config_read(LinphoneCore *lc)
        linphone_core_enable_agc(lc,
                lp_config_get_int(lc->config,"sound","agc",0));
 
-       gain=lp_config_get_float(lc->config,"sound","playback_gain_db",0);
-       linphone_core_set_playback_gain_db (lc,gain);
+       linphone_core_set_playback_gain_db (lc,lp_config_get_float(lc->config,"sound","playback_gain_db",0));
+       linphone_core_set_mic_gain_db (lc,lp_config_get_float(lc->config,"sound","mic_gain_db",0));
 
        linphone_core_set_remote_ringback_tone (lc,lp_config_get_string(lc->config,"sound","ringback_tone",NULL));
 
@@ -3307,6 +3307,36 @@ void linphone_core_set_ring_level(LinphoneCore *lc, int level){
        if (sndcard) ms_snd_card_set_level(sndcard,MS_SND_CARD_PLAYBACK,level);
 }
 
+/**
+ * Allow to control microphone level:  gain in db
+ *
+ * @ingroup media_parameters
+**/
+void linphone_core_set_mic_gain_db (LinphoneCore *lc, float gaindb){
+       float gain=gaindb;
+       LinphoneCall *call=linphone_core_get_current_call (lc);
+       AudioStream *st;
+
+       lc->sound_conf.soft_mic_lev=gaindb;
+
+       if (call==NULL || (st=call->audiostream)==NULL){
+               ms_message("linphone_core_set_mic_gain_db(): no active call.");
+               return;
+       }
+       if (st->volrecv){
+               ms_filter_call_method(st->volsend,MS_VOLUME_SET_DB_GAIN,&gain);
+       }else ms_warning("Could not apply gain: gain control wasn't activated.");
+}
+
+/**
+ * Get microphone gain in db.
+ *
+ * @ingroup media_parameters
+**/
+float linphone_core_get_mic_gain_db(LinphoneCore *lc) {
+       return lc->sound_conf.soft_mic_lev;
+}
+
 /**
  * Allow to control play level before entering sound card:  gain in db
  *
@@ -3718,7 +3748,7 @@ void linphone_core_mute_mic(LinphoneCore *lc, bool_t val){
        }
        if (st!=NULL){
                audio_stream_set_mic_gain(st,
-                       (val==TRUE) ? 0 : lp_config_get_float(lc->config,"sound","mic_gain",1));
+                       (val==TRUE) ? 0 : pow(10,lc->sound_conf.soft_mic_lev/10));
                if ( linphone_core_get_rtp_no_xmit_on_audio_mute(lc) ){
                        audio_stream_mute_rtp(st,val);
                }
@@ -4704,6 +4734,8 @@ static void sound_config_uninit(LinphoneCore *lc)
        ms_free(config->cards);
 
        lp_config_set_string(lc->config,"sound","remote_ring",config->remote_ring);
+       lp_config_set_float(lc->config,"sound","playback_gain_db",config->soft_play_lev);
+       lp_config_set_float(lc->config,"sound","mic_gain_db",config->soft_mic_lev);
 
        if (config->local_ring) ms_free(config->local_ring);
        if (config->remote_ring) ms_free(config->remote_ring);
index 99ae480fcc4393446e447b64357bbd2a85823d90..306f6b70b42eeb469f271c7c62f0d7e2dca0bbfc 100644 (file)
@@ -1196,9 +1196,11 @@ int linphone_core_get_rec_level(LinphoneCore *lc);
 void linphone_core_set_ring_level(LinphoneCore *lc, int level);
 void linphone_core_set_play_level(LinphoneCore *lc, int level);
 
+void linphone_core_set_mic_gain_db(LinphoneCore *lc, float level);
+float linphone_core_get_mic_gain_db(LinphoneCore *lc);
 void linphone_core_set_playback_gain_db(LinphoneCore *lc, float level);
-
 float linphone_core_get_playback_gain_db(LinphoneCore *lc);
+
 void linphone_core_set_rec_level(LinphoneCore *lc, int level);
 const char * linphone_core_get_ringer_device(LinphoneCore *lc);
 const char * linphone_core_get_playback_device(LinphoneCore *lc);
index 12909190ffdd8e68c3449e29babdbd7e87b35e5b..60587dbcd8dc9524e598e9bf85f380401b345a99 100644 (file)
@@ -437,6 +437,7 @@ typedef struct sound_config
        const char **cards;
        int latency;    /* latency in samples of the current used sound device */
        float soft_play_lev; /*playback gain in db.*/
+       float soft_mic_lev; /*mic gain in db.*/
        char rec_lev;
        char play_lev;
        char ring_lev;