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