You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

70 lines
1.7 KiB

/*
* 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 */