summaryrefslogtreecommitdiffstats
path: root/audio
diff options
context:
space:
mode:
Diffstat (limited to 'audio')
-rw-r--r--audio/audio_hw.c40
-rw-r--r--audio/ril_interface.c14
-rw-r--r--audio/ril_interface.h6
3 files changed, 43 insertions, 17 deletions
diff --git a/audio/audio_hw.c b/audio/audio_hw.c
index ef13114..f266c35 100644
--- a/audio/audio_hw.c
+++ b/audio/audio_hw.c
@@ -200,6 +200,7 @@ struct m0_dev_cfg {
static void select_output_device(struct m0_audio_device *adev);
static void select_input_device(struct m0_audio_device *adev);
+static void set_noise_supression(struct m0_audio_device *adev, int enable);
static int adev_set_voice_volume(struct audio_hw_device *dev, float volume);
static int do_input_standby(struct m0_stream_in *in);
static int do_output_standby(struct m0_stream_out *out);
@@ -593,6 +594,7 @@ static void select_mode(struct m0_audio_device *adev)
set_bigroute_by_array(adev->mixer, voicecall_default_disable, 1);
ALOGD("%s: set voicecall route: default_input_disable", __func__);
set_bigroute_by_array(adev->mixer, default_input_disable, 1);
+ set_noise_supression(adev, 0);
ALOGD("%s: set voicecall route: headset_input_disable", __func__);
set_bigroute_by_array(adev->mixer, headset_input_disable, 1);
ALOGD("%s: set voicecall route: bt_disable", __func__);
@@ -671,9 +673,11 @@ static void select_output_device(struct m0_audio_device *adev)
if (speaker_on || earpiece_on || headphone_on) {
ALOGD("%s: set voicecall route: default_input", __func__);
set_bigroute_by_array(adev->mixer, default_input, 1);
+ set_noise_supression(adev, 1);
} else {
ALOGD("%s: set voicecall route: default_input_disable", __func__);
set_bigroute_by_array(adev->mixer, default_input_disable, 1);
+ set_noise_supression(adev, 0);
}
if (headset_on) {
@@ -693,6 +697,9 @@ static void select_output_device(struct m0_audio_device *adev)
ALOGD("%s: set voicecall route: bt_disable", __func__);
set_bigroute_by_array(adev->mixer, bt_disable, 1);
}
+ // this is needed to mute the current device when output devices are switched, but mute is set
+ adev->hw_device.set_mic_mute(&adev->hw_device, adev->mic_mute);
+
set_incall_device(adev);
}
}
@@ -723,6 +730,21 @@ static void select_input_device(struct m0_audio_device *adev)
select_devices(adev);
}
+static void set_noise_supression(struct m0_audio_device *adev, int enable)
+{
+ if (enable) {
+ // Enable Noise suppression for builtin microphone
+ ALOGE("%s: enabling two mic control", __func__);
+ ril_set_two_mic_control(&adev->ril, AUDIENCE, TWO_MIC_SOLUTION_ON);
+ set_bigroute_by_array(adev->mixer, noise_suppression, 1);
+ } else {
+ // Disable Noise suppression for builtin microphone
+ ALOGE("%s: disabling two mic control", __func__);
+ ril_set_two_mic_control(&adev->ril, AUDIENCE, TWO_MIC_SOLUTION_OFF);
+ set_bigroute_by_array(adev->mixer, noise_suppression_disable, 1);
+ }
+}
+
/* must be called with hw device and output stream mutexes locked */
static int start_output_stream_low_latency(struct m0_stream_out *out)
{
@@ -2540,21 +2562,6 @@ static int adev_set_parameters(struct audio_hw_device *dev, const char *kvpairs)
adev->screen_off = true;
}
- ret = str_parms_get_str(parms, "noise_suppression", value, sizeof(value));
- if (ret >= 0) {
- if (strcmp(value, "on") == 0) {
- ALOGE("%s: enabling two mic control", __func__);
- ril_set_two_mic_control(&adev->ril, AUDIENCE, TWO_MIC_SOLUTION_ON);
- /* sub mic */
- set_bigroute_by_array(adev->mixer, noise_suppression, 1);
- } else {
- ALOGE("%s: disabling two mic control", __func__);
- ril_set_two_mic_control(&adev->ril, AUDIENCE, TWO_MIC_SOLUTION_OFF);
- /* sub mic */
- set_bigroute_by_array(adev->mixer, noise_suppression_disable, 1);
- }
- }
-
str_parms_destroy(parms);
return ret;
}
@@ -2605,6 +2612,9 @@ static int adev_set_mic_mute(struct audio_hw_device *dev, bool state)
{
struct m0_audio_device *adev = (struct m0_audio_device *)dev;
+ if (adev->mode == AUDIO_MODE_IN_CALL)
+ ril_set_mic_mute(&adev->ril, state);
+
adev->mic_mute = state;
return 0;
diff --git a/audio/ril_interface.c b/audio/ril_interface.c
index a77efc0..493e438 100644
--- a/audio/ril_interface.c
+++ b/audio/ril_interface.c
@@ -38,6 +38,7 @@ int (*_ril_set_call_volume)(void *, enum ril_sound_type, int);
int (*_ril_set_call_audio_path)(void *, enum ril_audio_path);
int (*_ril_set_call_clock_sync)(void *, enum ril_clock_state);
int (*_ril_set_two_mic_control)(void *, enum ril_two_mic_device, enum ril_two_mic_state);
+int (*_ril_set_mic_mute)(void *, enum ril_mic_mute);
int (*_ril_register_unsolicited_handler)(void *, int, void *);
int (*_ril_get_wb_amr)(void *, void *);
@@ -108,6 +109,7 @@ int ril_open(struct ril_handle *ril)
_ril_set_call_audio_path = dlsym(ril->handle, "SetCallAudioPath");
_ril_set_call_clock_sync = dlsym(ril->handle, "SetCallClockSync");
_ril_set_two_mic_control = dlsym(ril->handle, "SetTwoMicControl");
+ _ril_set_mic_mute = dlsym(ril->handle, "SetMute");
_ril_register_unsolicited_handler = dlsym(ril->handle,
"RegisterUnsolicitedHandler");
/* since this function is not supported in all RILs, don't require it */
@@ -115,8 +117,8 @@ int ril_open(struct ril_handle *ril)
if (!_ril_open_client || !_ril_close_client || !_ril_connect ||
!_ril_is_connected || !_ril_disconnect || !_ril_set_call_volume ||
- !_ril_set_call_audio_path || !_ril_set_two_mic_control || !_ril_set_call_clock_sync ||
- !_ril_register_unsolicited_handler) {
+ !_ril_set_call_audio_path || !_ril_set_two_mic_control || !_ril_set_mic_mute ||
+ !_ril_set_call_clock_sync || !_ril_register_unsolicited_handler) {
ALOGE("Cannot get symbols from '%s'", RIL_CLIENT_LIBPATH);
dlclose(ril->handle);
return -1;
@@ -191,3 +193,11 @@ int ril_set_two_mic_control(struct ril_handle *ril, enum ril_two_mic_device devi
return _ril_set_two_mic_control(ril->client, device, state);
}
+
+int ril_set_mic_mute(struct ril_handle *ril, enum ril_mic_mute state)
+{
+ if (ril_connect_if_required(ril))
+ return 0;
+
+ return _ril_set_mic_mute(ril->client, state);
+}
diff --git a/audio/ril_interface.h b/audio/ril_interface.h
index 4b401aa..7d4b87e 100644
--- a/audio/ril_interface.h
+++ b/audio/ril_interface.h
@@ -70,6 +70,11 @@ enum ril_two_mic_state {
TWO_MIC_SOLUTION_ON
};
+enum ril_mic_mute {
+ MIC_UNMUTE,
+ MIC_MUTE
+};
+
/* Function prototypes */
int ril_open(struct ril_handle *ril);
int ril_close(struct ril_handle *ril);
@@ -79,5 +84,6 @@ int ril_set_call_audio_path(struct ril_handle *ril, enum ril_audio_path path);
int ril_set_call_clock_sync(struct ril_handle *ril, enum ril_clock_state state);
void ril_register_set_wb_amr_callback(void *function, void *data);
int ril_set_two_mic_control(struct ril_handle *ril, enum ril_two_mic_device device, enum ril_two_mic_state state);
+int ril_set_mic_mute(struct ril_handle *ril, enum ril_mic_mute state);
#endif