summaryrefslogtreecommitdiffstats
path: root/audio
diff options
context:
space:
mode:
authorChangoh.Heo <changoh.heo@samsung.com>2011-10-18 17:47:48 -0700
committerEric Laurent <elaurent@google.com>2011-10-19 10:01:53 -0700
commitc0854435fe08a3a15973c1e1e316766ac4c46b3b (patch)
treed46f896ccd90d2279f1ac8a4fe37a2071da3a983 /audio
parent13c42375e0eff345ec72b7111f811e3b089508de (diff)
downloaddevice_samsung_tuna-c0854435fe08a3a15973c1e1e316766ac4c46b3b.zip
device_samsung_tuna-c0854435fe08a3a15973c1e1e316766ac4c46b3b.tar.gz
device_samsung_tuna-c0854435fe08a3a15973c1e1e316766ac4c46b3b.tar.bz2
audio: use 4Khz LPF in DL1 while in voicecall
Some metalic noise is happened on headset, earpiece voicecall. Especially, The noise can be felt easily in woman voice. If we use 4Khz LPF, the noise is gone. Change-Id: I106efd89af2b84fad40314c8c07b5f0aa7901c8b Signed-off-by: Changoh.Heo <changoh.heo@samsung.com>
Diffstat (limited to 'audio')
-rwxr-xr-xaudio/audio_hw.c37
1 files changed, 30 insertions, 7 deletions
diff --git a/audio/audio_hw.c b/audio/audio_hw.c
index 322c189..e488b50 100755
--- a/audio/audio_hw.c
+++ b/audio/audio_hw.c
@@ -54,6 +54,7 @@
#define MIXER_EARPHONE_PLAYBACK_VOLUME "Earphone Playback Volume"
#define MIXER_BT_UL_VOLUME "BT UL Volume"
+#define MIXER_DL1_EQUALIZER "DL1 Equalizer"
#define MIXER_DL1_MIXER_MULTIMEDIA "DL1 Mixer Multimedia"
#define MIXER_DL1_MIXER_VOICE "DL1 Mixer Voice"
#define MIXER_DL2_MIXER_MULTIMEDIA "DL2 Mixer Multimedia"
@@ -94,6 +95,8 @@
#define MIXER_BT_LEFT "BT Left"
#define MIXER_BT_RIGHT "BT Right"
#define MIXER_450HZ_HIGH_PASS "450Hz High-pass"
+#define MIXER_FLAT_RESPONSE "Flat response"
+#define MIXER_4KHZ_LPF_0DB "4Khz LPF 0dB"
/* ALSA cards for OMAP4 */
@@ -438,6 +441,7 @@ struct route_setting vx_ul_bt[] = {
struct mixer_ctls
{
+ struct mixer_ctl *dl1_eq;
struct mixer_ctl *mm_dl1;
struct mixer_ctl *mm_dl2;
struct mixer_ctl *vx_dl1;
@@ -647,6 +651,20 @@ static void end_call(struct tuna_audio_device *adev)
adev->pcm_modem_ul = NULL;
}
+static void set_eq_filter(struct tuna_audio_device *adev)
+{
+ /* DL1_EQ can't be used for bt */
+ int dl1_eq_applicable = adev->devices & (AUDIO_DEVICE_OUT_WIRED_HEADSET |
+ AUDIO_DEVICE_OUT_WIRED_HEADPHONE | AUDIO_DEVICE_OUT_EARPIECE);
+
+ /* 4Khz LPF is used only in NB-AMR voicecall */
+ if ((adev->mode == AUDIO_MODE_IN_CALL) && dl1_eq_applicable &&
+ (adev->tty_mode == TTY_MODE_OFF) && !adev->wb_amr)
+ mixer_ctl_set_enum_by_string(adev->mixer_ctls.dl1_eq, MIXER_4KHZ_LPF_0DB);
+ else
+ mixer_ctl_set_enum_by_string(adev->mixer_ctls.dl1_eq, MIXER_FLAT_RESPONSE);
+}
+
void audio_set_wb_amr_callback(void *data, int enable)
{
struct tuna_audio_device *adev = (struct tuna_audio_device *)data;
@@ -658,6 +676,7 @@ void audio_set_wb_amr_callback(void *data, int enable)
/* reopen the modem PCMs at the new rate */
if (adev->in_call) {
end_call(adev);
+ set_eq_filter(adev);
start_call(adev);
}
}
@@ -909,6 +928,7 @@ static void select_output_device(struct tuna_audio_device *adev)
set_route_by_array(adev->mixer, hs_output, headset_on | headphone_on);
set_route_by_array(adev->mixer, hf_output, speaker_on);
+ set_eq_filter(adev);
set_output_volumes(adev, tty_volume);
/* Special case: select input path if in a call, otherwise
@@ -2462,6 +2482,8 @@ static int adev_open(const hw_module_t* module, const char* name,
return -EINVAL;
}
+ adev->mixer_ctls.dl1_eq = mixer_get_ctl_by_name(adev->mixer,
+ MIXER_DL1_EQUALIZER);
adev->mixer_ctls.mm_dl1 = mixer_get_ctl_by_name(adev->mixer,
MIXER_DL1_MIXER_MULTIMEDIA);
adev->mixer_ctls.vx_dl1 = mixer_get_ctl_by_name(adev->mixer,
@@ -2491,13 +2513,14 @@ static int adev_open(const hw_module_t* module, const char* name,
adev->mixer_ctls.earpiece_volume = mixer_get_ctl_by_name(adev->mixer,
MIXER_EARPHONE_PLAYBACK_VOLUME);
- if (!adev->mixer_ctls.mm_dl1 || !adev->mixer_ctls.vx_dl1 ||
- !adev->mixer_ctls.mm_dl2 || !adev->mixer_ctls.vx_dl2 ||
- !adev->mixer_ctls.dl1_headset || !adev->mixer_ctls.dl1_bt ||
- !adev->mixer_ctls.earpiece_enable || !adev->mixer_ctls.left_capture ||
- !adev->mixer_ctls.right_capture || !adev->mixer_ctls.amic_ul_volume ||
- !adev->mixer_ctls.sidetone_capture || !adev->mixer_ctls.headset_volume ||
- !adev->mixer_ctls.speaker_volume || !adev->mixer_ctls.earpiece_volume) {
+ if (!adev->mixer_ctls.dl1_eq || !adev->mixer_ctls.mm_dl1 ||
+ !adev->mixer_ctls.vx_dl1 || !adev->mixer_ctls.mm_dl2 ||
+ !adev->mixer_ctls.vx_dl2 || !adev->mixer_ctls.dl1_headset ||
+ !adev->mixer_ctls.dl1_bt || !adev->mixer_ctls.earpiece_enable ||
+ !adev->mixer_ctls.left_capture || !adev->mixer_ctls.right_capture ||
+ !adev->mixer_ctls.amic_ul_volume || !adev->mixer_ctls.sidetone_capture ||
+ !adev->mixer_ctls.headset_volume || !adev->mixer_ctls.speaker_volume ||
+ !adev->mixer_ctls.earpiece_volume) {
mixer_close(adev->mixer);
free(adev);
LOGE("Unable to locate all mixer controls, aborting.");