diff --git a/source/artinchip/aic-mpp/middle_media/base/render/aic_audio_render.c b/source/artinchip/aic-mpp/middle_media/base/render/aic_audio_render.c index 19af819e0..545628ca1 100644 --- a/source/artinchip/aic-mpp/middle_media/base/render/aic_audio_render.c +++ b/source/artinchip/aic-mpp/middle_media/base/render/aic_audio_render.c @@ -71,11 +71,10 @@ s32 asla_volum_init(struct aic_audio_render *render) elem = snd_mixer_find_selem(handle, sid); if (!elem){ loge("Can't find volume elem\n"); - return -1; + return -1; } snd_mixer_selem_get_playback_volume(elem,0,&vol); - logd("vol:[%ld]\n",vol); alsa_render->vol = vol; alsa_render->alsa_mixer_handle = handle; alsa_render->alsa_mixer_elem = elem; @@ -337,19 +336,23 @@ s32 alsa_audio_render_get_volume(struct aic_audio_render *render) return -1; } + /* 如果是最大值或异常值,使用默认值 9% */ + long vol = alsa_render->vol; + if(vol <= 0 || vol >= max){ + vol = max * 9 / 100; + alsa_render->vol = vol; + } logd("vol:[%ld,%ld]\n",min,max); - return (alsa_render->vol*100)/(max-min); //[min,max] ---> [0,100] + return (vol*100)/(max-min); //[min,max] ---> [0,100] } s32 alsa_audio_render_set_volume(struct aic_audio_render *render,s32 vol) { long min, max; struct aic_alsa_audio_render *alsa_render = (struct aic_alsa_audio_render*)render; - logd("alsa_audio_render_set_volume:%d\n",vol); if(alsa_render->alsa_mixer_handle && alsa_render->alsa_mixer_elem){ snd_mixer_selem_get_playback_volume_range(alsa_render->alsa_mixer_elem, &min, &max); vol = vol*(max-min)/100; //[0,100] ---> [min,max] - logd("vol:[%ld,%ld:%d]\n",min,max,vol); snd_mixer_selem_set_playback_volume_all(alsa_render->alsa_mixer_elem, vol); alsa_render->vol = vol; }else{ diff --git a/source/linux-5.10/sound/soc/artinchip/aic-codec.c b/source/linux-5.10/sound/soc/artinchip/aic-codec.c index e8334f956..7983c5564 100644 --- a/source/linux-5.10/sound/soc/artinchip/aic-codec.c +++ b/source/linux-5.10/sound/soc/artinchip/aic-codec.c @@ -234,8 +234,7 @@ static void aic_codec_start_playback(struct aic_codec *codec) { regmap_update_bits(codec->regmap, FADE_CTRL0_REG, FADE_CTRL0_STEP_MASK, FADE_CTRL0_STEP(0x80)); - regmap_update_bits(codec->regmap, FADE_CTRL1_REG, - FADE_CTRL1_TARGET_VOL_MASK, 0x7FFF); + /* 播放开始时不改变音量,保持用户设置 */ /* Enable AUDOUT DRQ */ regmap_update_bits(codec->regmap, FIFO_INT_EN_REG, FIFO_AUDOUT_DRQ_EN, FIFO_AUDOUT_DRQ_EN); @@ -248,6 +247,7 @@ static void aic_codec_stop_playback(struct aic_codec *codec) regmap_update_bits(codec->regmap, FADE_CTRL0_REG, FADE_CTRL0_STEP_MASK, FADE_CTRL0_STEP(0x3FFF)); + /* 驱动保持静音 */ regmap_update_bits(codec->regmap, FADE_CTRL1_REG, FADE_CTRL1_TARGET_VOL_MASK, 0);