diff options
author | yixuanjiang <yixuanjiang@google.com> | 2022-05-06 13:53:19 +0800 |
---|---|---|
committer | Yixuan Jiang <yixuanjiang@google.com> | 2022-05-06 08:27:37 +0000 |
commit | 70ef8bd84edaeb09585134eb505d32f01ee9ec47 (patch) | |
tree | 07eff5d4304f3d5ef9bcf408de35d9e0c21274f5 | |
parent | c8978623faf7f3644bccfc0c487933c5b35ca53b (diff) | |
download | aoc-70ef8bd84edaeb09585134eb505d32f01ee9ec47.tar.gz |
aoc/alsa: add mixer control to mmap record gain
Usage example (range: -300 to 0 dB):
tinymix 'Mmap Record Gain' -- 0
tinymix 'Mmap Record Gain' -- -300
Bug: 231630423
Signed-off-by: yixuanjiang <yixuanjiang@google.com>
Change-Id: I71dfe83bf75b84b21b131d842bd7920e1e0940d4
-rwxr-xr-x | alsa/aoc_alsa.h | 2 | ||||
-rwxr-xr-x | alsa/aoc_alsa_ctl.c | 44 | ||||
-rwxr-xr-x | alsa/aoc_alsa_hw.c | 44 |
3 files changed, 90 insertions, 0 deletions
diff --git a/alsa/aoc_alsa.h b/alsa/aoc_alsa.h index 707fff3..cfe58d0 100755 --- a/alsa/aoc_alsa.h +++ b/alsa/aoc_alsa.h @@ -339,6 +339,8 @@ int aoc_mic_dc_blocker_set(struct aoc_chip *chip, int enable); int aoc_mic_record_gain_get(struct aoc_chip *chip, long *val); int aoc_mic_record_gain_set(struct aoc_chip *chip, long val); +int aoc_mmap_record_gain_get(struct aoc_chip *chip, long *val); +int aoc_mmap_record_gain_set(struct aoc_chip *chip, long val); int aoc_audio_capture_mic_prepare(struct aoc_chip *chip); int aoc_audio_capture_mic_close(struct aoc_chip *chip); int aoc_audio_capture_active_stream_num(struct aoc_chip *chip); diff --git a/alsa/aoc_alsa_ctl.c b/alsa/aoc_alsa_ctl.c index 1eecffd..368e213 100755 --- a/alsa/aoc_alsa_ctl.c +++ b/alsa/aoc_alsa_ctl.c @@ -17,6 +17,9 @@ #define AOC_MIC_RECORD_GAIN_IN_DB_MIN -40 #define AOC_MIC_RECORD_GAIN_IN_DB_MAX 30 +#define MMAP_MIC_RECORD_GAIN_IN_DB_MIN -300 +#define MMAP_MIC_RECORD_GAIN_IN_DB_MAX 0 + #define COMPRE_OFFLOAD_GAIN_MIN 0 #define COMPRE_OFFLOAD_GAIN_MAX 8388608 /* 2^23 = 8388608 */ @@ -510,6 +513,41 @@ static int mic_record_gain_ctl_get(struct snd_kcontrol *kcontrol, return err; } +static int mmap_record_gain_ctl_set(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct aoc_chip *chip = snd_kcontrol_chip(kcontrol); + int val, err = 0; + + if (mutex_lock_interruptible(&chip->audio_mutex)) + return -EINTR; + + val = ucontrol->value.integer.value[0]; + err = aoc_mmap_record_gain_set(chip, val); + if (err < 0) + pr_err("ERR:%d mmap record gain set to %d fail\n", err, val); + + mutex_unlock(&chip->audio_mutex); + return err; +} + +static int mmap_record_gain_ctl_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct aoc_chip *chip = snd_kcontrol_chip(kcontrol); + int err = 0; + + if (mutex_lock_interruptible(&chip->audio_mutex)) + return -EINTR; + + err = aoc_mmap_record_gain_get(chip, &ucontrol->value.integer.value[0]); + if (err < 0) + pr_err("ERR:%d mmap record gain get fail\n", err); + + mutex_unlock(&chip->audio_mutex); + return err; +} + static int lvm_enable_ctl_set(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { struct aoc_chip *chip = snd_kcontrol_chip(kcontrol); @@ -1937,6 +1975,12 @@ static struct snd_kcontrol_new snd_aoc_ctl[] = { AOC_MIC_RECORD_GAIN_IN_DB_MAX, 1, mic_record_gain_ctl_get, mic_record_gain_ctl_set, NULL), + SOC_SINGLE_RANGE_EXT_TLV_modified("Mmap Record Gain", SND_SOC_NOPM, 0, + MMAP_MIC_RECORD_GAIN_IN_DB_MIN, + MMAP_MIC_RECORD_GAIN_IN_DB_MAX, 1, + mmap_record_gain_ctl_get, + mmap_record_gain_ctl_set, NULL), + SOC_SINGLE_EXT("Compress Offload Volume", SND_SOC_NOPM, 0, 100, 0, compr_offload_volume_get, compr_offload_volume_set), diff --git a/alsa/aoc_alsa_hw.c b/alsa/aoc_alsa_hw.c index 5ac2987..8aaf307 100755 --- a/alsa/aoc_alsa_hw.c +++ b/alsa/aoc_alsa_hw.c @@ -2078,6 +2078,50 @@ int aoc_mic_record_gain_set(struct aoc_chip *chip, long val) return 0; } +int aoc_mmap_record_gain_get(struct aoc_chip *chip, long *val) +{ + int err; + int cmd_id, block, component, key, value; + + cmd_id = CMD_AUDIO_INPUT_GET_PARAMETER_ID; + block = 136; + component = 0; + key = 16; /* for dB */ + + /* Send cmd to AOC */ + err = aoc_audio_get_parameters(cmd_id, block, component, key, &value, chip); + if (err < 0) { + pr_err("ERR:%d mmap mic record gain get\n", err); + return err; + } + + if (val) + *val = value; + + return 0; +} + +int aoc_mmap_record_gain_set(struct aoc_chip *chip, long val) +{ + int err; + int cmd_id, block, component, key, value; + + cmd_id = CMD_AUDIO_INPUT_SET_PARAMETER_ID; + block = 136; + component = 0; + key = 16; /* for dB */ + value = val; + + /* Send cmd to AOC */ + err = aoc_audio_set_parameters(cmd_id, block, component, key, value, chip); + if (err < 0) { + pr_err("ERR:%d mmap record gain set\n", err); + return err; + } + + return 0; +} + int aoc_audio_capture_eraser_enable(struct aoc_chip *chip, long enable) { int cmd_id, err = 0; |