139 lines
4.0 KiB
C
139 lines
4.0 KiB
C
#include "audio_anc_fade_ctr.h"
|
||
#include "anc.h"
|
||
#include "audio_anc.h"
|
||
|
||
/*
|
||
****************************************************************
|
||
* AUDIO ANC
|
||
* File : audio_anc_fade_ctr.c
|
||
* By : Junhao
|
||
* Notes : ANC fade gain管理,支持多场景并行使用
|
||
*
|
||
****************************************************************
|
||
*/
|
||
|
||
#if 0
|
||
#define anc_fade_log printf
|
||
#else
|
||
#define anc_fade_log(...)
|
||
#endif/*log_en*/
|
||
|
||
//默认淡入增益,dB换算公式 fade_gain = 10^(dB/20) * 16384;
|
||
#define AUDIO_ANC_FADE_GAIN_DEFAULT 16384 //(0dB)
|
||
|
||
struct anc_fade_context {
|
||
struct list_head entry;
|
||
enum anc_fade_mode_t mode;
|
||
u8 ch;
|
||
u16 fade_gain;
|
||
};
|
||
|
||
static LIST_HEAD(anc_fade_head);
|
||
|
||
static OS_MUTEX fade_mutex;
|
||
|
||
static void anc_fade_ctr_list_del(enum anc_fade_mode_t mode)
|
||
{
|
||
struct anc_fade_context *ctx;
|
||
if (list_empty(&anc_fade_head)) {
|
||
return;
|
||
}
|
||
list_for_each_entry(ctx, &anc_fade_head, entry) {
|
||
if (!strcmp(ctx->mode, mode)) {
|
||
goto __fade_del;
|
||
}
|
||
}
|
||
return;
|
||
__fade_del:
|
||
list_del(&ctx->entry);
|
||
free(ctx);
|
||
}
|
||
|
||
static void anc_fade_ctr_list_add(enum anc_fade_mode_t mode, u8 ch, u16 gain)
|
||
{
|
||
struct anc_fade_context *new_ctx = malloc(sizeof(struct anc_fade_context));
|
||
new_ctx->mode = mode;
|
||
//通道检测,有些芯片 fade_gain 不区分通道
|
||
new_ctx->ch = anc_fade_ctr_ch_check(ch);
|
||
new_ctx->fade_gain = gain;
|
||
list_add_tail(&new_ctx->entry, &anc_fade_head);
|
||
}
|
||
|
||
static int anc_fade_ctr_update(enum anc_fade_mode_t mode, u8 ch, u16 gain)
|
||
{
|
||
struct anc_fade_context *ctx;
|
||
if (list_empty(&anc_fade_head)) {
|
||
return 1;
|
||
}
|
||
list_for_each_entry(ctx, &anc_fade_head, entry) {
|
||
if (ctx->mode == mode) {
|
||
if (ctx->ch != ch) {
|
||
printf("ERR!!!anc_fade_gain mode&ch is no \"one to one\" \n");
|
||
}
|
||
ctx->fade_gain = gain;
|
||
return 0;
|
||
}
|
||
}
|
||
return 1;
|
||
}
|
||
|
||
void audio_anc_fade_ctr_init(void)
|
||
{
|
||
os_mutex_create(&fade_mutex);
|
||
}
|
||
|
||
void audio_anc_fade_ctr_set(enum anc_fade_mode_t mode, u8 ch, u16 gain)
|
||
{
|
||
os_mutex_pend(&fade_mutex, 0);
|
||
u16 lff_gain, lfb_gain, rff_gain, rfb_gain;
|
||
struct anc_fade_context *ctx;
|
||
u8 fade_en = anc_api_get_fade_en();
|
||
/* anc_fade_log("fade in mode %d, gain %d\n", mode, gain); */
|
||
|
||
lff_gain = AUDIO_ANC_FADE_GAIN_DEFAULT;
|
||
lfb_gain = AUDIO_ANC_FADE_GAIN_DEFAULT;
|
||
rff_gain = AUDIO_ANC_FADE_GAIN_DEFAULT;
|
||
rfb_gain = AUDIO_ANC_FADE_GAIN_DEFAULT;
|
||
|
||
if (gain == AUDIO_ANC_FADE_GAIN_DEFAULT) {
|
||
anc_fade_ctr_list_del(mode); //删除
|
||
} else {
|
||
if (anc_fade_ctr_update(mode, ch, gain)) { //更新
|
||
anc_fade_ctr_list_add(mode, ch, gain); //新增
|
||
}
|
||
}
|
||
|
||
//遍历链表
|
||
if (!list_empty(&anc_fade_head)) {
|
||
list_for_each_entry(ctx, &anc_fade_head, entry) {
|
||
/* anc_fade_log("fade list : mode %d, gain %d\n", ctx->mode, ctx->fade_gain); */
|
||
if ((ctx->ch & AUDIO_ANC_FADE_CH_LFF) && (ctx->fade_gain < lff_gain)) {
|
||
lff_gain = ctx->fade_gain;
|
||
}
|
||
if ((ctx->ch & AUDIO_ANC_FADE_CH_LFB) && (ctx->fade_gain < lfb_gain)) {
|
||
lfb_gain = ctx->fade_gain;
|
||
}
|
||
if ((ctx->ch & AUDIO_ANC_FADE_CH_RFF) && (ctx->fade_gain < rff_gain)) {
|
||
rff_gain = ctx->fade_gain;
|
||
}
|
||
if ((ctx->ch & AUDIO_ANC_FADE_CH_RFB) && (ctx->fade_gain < rfb_gain)) {
|
||
rfb_gain = ctx->fade_gain;
|
||
}
|
||
}
|
||
}
|
||
anc_fade_log("fade lff %d, lfb %d, rff %d, rfb %d\n", lff_gain, lfb_gain, rff_gain, rfb_gain);
|
||
audio_anc_fade_cfg_set(fade_en, 1, 0);
|
||
audio_anc_fade(AUDIO_ANC_FADE_CH_LFF, lff_gain);
|
||
audio_anc_fade(AUDIO_ANC_FADE_CH_LFB, lfb_gain);
|
||
audio_anc_fade(AUDIO_ANC_FADE_CH_RFF, rff_gain);
|
||
audio_anc_fade(AUDIO_ANC_FADE_CH_RFB, rfb_gain);
|
||
os_mutex_post(&fade_mutex);
|
||
}
|
||
|
||
void audio_anc_fade_ctr_del(enum anc_fade_mode_t mode)
|
||
{
|
||
audio_anc_fade_ctr_set(mode, 0, AUDIO_ANC_FADE_GAIN_DEFAULT);
|
||
}
|
||
|
||
|