diff options
author | vincenttew <vincenttew@google.com> | 2023-04-20 17:40:33 +0800 |
---|---|---|
committer | Vincent Tew <vincenttew@google.com> | 2023-09-22 03:51:20 +0000 |
commit | d3425b0706928e225eba561154450e3be9aa6a96 (patch) | |
tree | 75ceaafe52a360ae4e563010f1b6007d3c7d2c15 | |
parent | 2b2c76e6a96043a484c571e4a2843c1791ced7c6 (diff) | |
download | aoc-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.h | 4 | ||||
-rw-r--r-- | alsa/aoc_alsa_ctl.c | 74 | ||||
-rw-r--r-- | alsa/aoc_alsa_hw.c | 53 |
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; |