/* * Copyright (c) Hisilicon Technologies Co., Ltd. 2019-2019. All rights reserved. * Description: adec volume function * Author: audio * Create: 2019-12-30 */ #include "adec_volume.h" #include "adec_core.h" #include "mpi_adec_assembly.h" #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ static td_void adec_process16bit_volume(td_s16 *pcm_buf, td_s32 in_samps, td_s32 channels, td_s16 volume) { td_s32 n; td_s32 sum; for (n = 0; n < in_samps * channels; n++) { sum = mulf32_16b((td_s32)pcm_buf[n], volume); pcm_buf[n] = (td_s16)sum; } } static td_void adec_process32bit_volume(td_s32 *pcm_buf, td_s32 in_samps, td_s32 channels, td_s16 volume) { td_s32 n; td_s32 sum; for (n = 0; n < (in_samps * channels); n++) { sum = mulf32_16b((td_s32)pcm_buf[n], volume); pcm_buf[n] = (td_s32)sum; } } td_void adec_process_volume(td_s32 *pcm_buf, td_s32 samples, td_s32 bit_per_sample, td_s32 channels, td_s16 volume) { td_s32 pcm_sample = samples; if (((td_u32)pcm_sample & 0xffff0000) != 0) { pcm_sample = (td_u32)pcm_sample & 0xffff; } if (bit_per_sample == EXT_BIT_DEPTH_16) { adec_process16bit_volume((td_s16 *)pcm_buf, pcm_sample, channels, volume); } else { adec_process32bit_volume((td_s32 *)pcm_buf, pcm_sample, channels, volume); } } td_void adec_set_volume(adec_chan *adec, td_u32 volume) { if (adec == TD_NULL) { return; } adec->volume = volume; if (adec->adec_info != TD_NULL) { adec->adec_info->volume = volume; } adec->volume_frac = (td_s16)((volume * 0x7fffL) / ADEC_MAX_VOLUME); } #ifdef __cplusplus } #endif /* __cplusplus */