summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoryixuanjiang <yixuanjiang@google.com>2022-05-06 13:53:19 +0800
committerYixuan Jiang <yixuanjiang@google.com>2022-05-06 08:27:37 +0000
commit70ef8bd84edaeb09585134eb505d32f01ee9ec47 (patch)
tree07eff5d4304f3d5ef9bcf408de35d9e0c21274f5
parentc8978623faf7f3644bccfc0c487933c5b35ca53b (diff)
downloadaoc-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-xalsa/aoc_alsa.h2
-rwxr-xr-xalsa/aoc_alsa_ctl.c44
-rwxr-xr-xalsa/aoc_alsa_hw.c44
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;