summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorvincenttew <vincenttew@google.com>2023-04-20 17:40:33 +0800
committerVincent Tew <vincenttew@google.com>2023-09-22 03:51:20 +0000
commitd3425b0706928e225eba561154450e3be9aa6a96 (patch)
tree75ceaafe52a360ae4e563010f1b6007d3c7d2c15
parent2b2c76e6a96043a484c571e4a2843c1791ced7c6 (diff)
downloadaoc-d3425b0706928e225eba561154450e3be9aa6a96.tar.gz
alsa: add mel process control
add alsa control to config AoC mel value Bug: 269221858 Change-Id: I15a236ba2471457f3ce06c42c8cc3c71ce655617 Signed-off-by: vincenttew <vincenttew@google.com>
-rw-r--r--alsa/aoc_alsa.h4
-rw-r--r--alsa/aoc_alsa_ctl.c74
-rw-r--r--alsa/aoc_alsa_hw.c53
3 files changed, 131 insertions, 0 deletions
diff --git a/alsa/aoc_alsa.h b/alsa/aoc_alsa.h
index f5c2894..9c383ba 100644
--- a/alsa/aoc_alsa.h
+++ b/alsa/aoc_alsa.h
@@ -305,6 +305,7 @@ struct aoc_chip {
int usb_card;
int usb_device;
int usb_direction;
+ int mel_enable;
struct AUDIO_OUTPUT_BT_A2DP_ENC_CFG a2dp_encoder_cfg;
struct CMD_AUDIO_OUTPUT_USB_CONFIG usb_sink_cfg;
@@ -448,6 +449,9 @@ int aoc_lvm_enable_set(struct aoc_chip *chip, long enable);
int aoc_decoder_ref_enable_get(struct aoc_chip *chip, long*enable);
int aoc_decoder_ref_enable_set(struct aoc_chip *chip, long enable);
+int aoc_mel_enable(struct aoc_chip *chip, int enable);
+int aoc_mel_rs2_set(struct aoc_chip *chip, long *rs2);
+int aoc_mel_rs2_get(struct aoc_chip *chip, long *rs2);
int aoc_sidetone_enable(struct aoc_chip *chip, int enable);
int aoc_sidetone_cfg_get(struct aoc_chip *chip, int param, long *val);
diff --git a/alsa/aoc_alsa_ctl.c b/alsa/aoc_alsa_ctl.c
index 024015a..2ac32ca 100644
--- a/alsa/aoc_alsa_ctl.c
+++ b/alsa/aoc_alsa_ctl.c
@@ -1124,6 +1124,75 @@ static int voice_pcm_wait_time_set(struct snd_kcontrol *kcontrol,
return 0;
}
+static int audio_mel_enable_ctl_get(struct snd_kcontrol *kcontrol,
+ struct snd_ctl_elem_value *ucontrol)
+{
+ struct aoc_chip *chip = snd_kcontrol_chip(kcontrol);
+
+ if (mutex_lock_interruptible(&chip->audio_mutex))
+ return -EINTR;
+
+ ucontrol->value.integer.value[0] = chip->mel_enable;
+
+ mutex_unlock(&chip->audio_mutex);
+
+ return 0;
+}
+
+static int audio_mel_enable_ctl_set(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;
+
+ chip->mel_enable = ucontrol->value.integer.value[0];
+ err = aoc_mel_enable(chip, chip->mel_enable);
+ if (err < 0)
+ pr_err("ERR:%d set:%d mel fail\n", err, chip->mel_enable);
+
+ mutex_unlock(&chip->audio_mutex);
+ return err;
+}
+
+static int audio_mel_rs2_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_mel_rs2_get(chip, &ucontrol->value.integer.value[0]);
+ if (err < 0)
+ pr_err("ERR:%d mel rs2 get fail\n", err);
+
+ mutex_unlock(&chip->audio_mutex);
+
+ return 0;
+}
+
+static int audio_mel_rs2_ctl_set(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_mel_rs2_set(chip, &ucontrol->value.integer.value[0]);
+ if (err < 0)
+ pr_err("ERR:%d mel rs2 set %ld fail\n", err,
+ ucontrol->value.integer.value[0]);
+
+ mutex_unlock(&chip->audio_mutex);
+ return err;
+}
+
static int audio_capture_mic_source_get(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol)
{
@@ -2515,6 +2584,11 @@ static struct snd_kcontrol_new snd_aoc_ctl[] = {
MAX_DP_START_THRESHOLD, 0,
dp_start_threshold_get, dp_start_threshold_set),
+ SOC_SINGLE_EXT("Mel Processor Enable", SND_SOC_NOPM, 0, 1, 0,
+ audio_mel_enable_ctl_get, audio_mel_enable_ctl_set),
+ SOC_SINGLE_EXT("Mel Processor RS2", SND_SOC_NOPM, 0, INT_MAX, 0,
+ audio_mel_rs2_ctl_get, audio_mel_rs2_ctl_set),
+
{
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
.name = "A2DP Encoder Parameters",
diff --git a/alsa/aoc_alsa_hw.c b/alsa/aoc_alsa_hw.c
index d0df643..82d49ae 100644
--- a/alsa/aoc_alsa_hw.c
+++ b/alsa/aoc_alsa_hw.c
@@ -2430,6 +2430,59 @@ int aoc_compr_offload_linear_gain_set(struct aoc_chip *chip, long *val)
return 0;
}
+int aoc_mel_enable(struct aoc_chip *chip, int enable)
+{
+ int err = 0;
+ struct CMD_AUDIO_OUTPUT_MEL_STATE cmd;
+
+ AocCmdHdrSet(&(cmd.parent), CMD_AUDIO_OUTPUT_MEL_STATE_ID, sizeof(cmd));
+
+ cmd.enable = enable ? true : false;
+
+ err = aoc_audio_control(CMD_OUTPUT_CHANNEL, (uint8_t *)&cmd, sizeof(cmd), (uint8_t *)&cmd,
+ chip);
+ if (err < 0)
+ pr_err("ERR:%d in mel enable\n", err);
+
+ return err;
+}
+
+int aoc_mel_rs2_set(struct aoc_chip *chip, long *rs2)
+{
+ int err = 0;
+ struct CMD_AUDIO_OUTPUT_MEL_RS2 cmd;
+ uint32_t tmp;
+
+ AocCmdHdrSet(&(cmd.parent), CMD_AUDIO_OUTPUT_MEL_SET_RS2_ID, sizeof(cmd));
+
+ tmp = (uint32_t)rs2[0];
+ cmd.rs2_value = *(float *)(&tmp);
+
+ err = aoc_audio_control(CMD_OUTPUT_CHANNEL, (uint8_t *)&cmd, sizeof(cmd), (uint8_t *)&cmd,
+ chip);
+ if (err < 0)
+ pr_err("ERR:%d in mel rs2 set\n", err);
+
+ return err;
+}
+
+int aoc_mel_rs2_get(struct aoc_chip *chip, long *rs2)
+{
+ int err = 0;
+ struct CMD_AUDIO_OUTPUT_MEL_RS2 cmd;
+
+ AocCmdHdrSet(&(cmd.parent), CMD_AUDIO_OUTPUT_MEL_GET_RS2_ID, sizeof(cmd));
+
+ err = aoc_audio_control(CMD_OUTPUT_CHANNEL, (uint8_t *)&cmd, sizeof(cmd), (uint8_t *)&cmd,
+ chip);
+ if (err < 0)
+ pr_err("ERR:%d in mel rs2 get\n", err);
+ else
+ *rs2 = *(uint32_t *)&cmd.rs2_value;
+
+ return err;
+}
+
int aoc_sidetone_enable(struct aoc_chip *chip, int enable)
{
int err = 0;