2. AUDIO ADC(AD14N / AC104N)

AD14N / AC104N内置应用于语音场合的ADC,外接驻极体MIC,用于录制外界声音。此ADC支持16bit精度,单声道,支持8k/12k/16k/24k四种采样率;同时支持最多2路ADC编码输入。 本章介绍ADC相关结构体以及接口。Audio ADC涉及两个文件,分别是app/lib/adc_api.c和include_lib/audio/audio_adc.h。

Audio ADC有以下结构体:

typedef struct _AUDIO_ADC_MANAGE {
sound_out_obj *sound[ADC_CHANNEL_NUMBER];
void (*kick[ADC_CHANNEL_NUMBER])(void *);   //kick函数
u8 flag;                                    //标志位
} AUDIO_ADC_MANAGE;

Audio ADC主要有以下函数接口:

void audio_adc_mode_init(void);
u32 audio_adc_init_api(u32 sr, ADC_MODE mode, u32 ch);
void audio_adc_off_api(void);
bool regist_audio_adc_channel(void *psound, void *kick);
bool unregist_audio_adc_channel(void *psound);

2.1. 1 AUDIO ADC接口介绍

2.1.1. 1.1 函数void audio_adc_mode_init(void)

此函数实现对ADC管理结构体和相关编码参数进行初始化,开机初始化调用一次即可。

2.1.2. 1.2 函数u32 audio_adc_init_api(u32 sr, ADC_MODE mode, u32 ch)

此函数实现对ADC硬件资源和相关寄存器进行初始化,此处会根据mode的值来选择ADC模式,其中参数:

1、sr:采样率,默认选择为24000;
    ① 8000;
    ② 12000;
    ③ 16000;
    ④ 24000;
2、mode:ADC模式,默认选择为ADC_MIC;
    ① ADC_MIC;
    ② ADC_LINE_IN;
3、ch:选择的ADC通道;
    该参数仅对LINE_IN模式有效,MIC模式下传入0即可:
4、返回值:成功 0;

2.1.3. 1.3 函数void audio_adc_off_api(void)

此函数实现关闭所有ADC模块。

2.1.4. 1.4 函数bool regist_audio_adc_channel(void *psound, void *kick)

此函数实现将sound_out_obj注册到ADC中,AD140中一共有2路ADC,其中参数:

1、psound:sound_out_obj指向的sound结构体;
2、kick:kick函数;
3、返回值:
    成功 true;
    失败 false;

2.1.5. 1.5 函数bool unregist_audio_adc_channel(void *psound)

此函数实现将ADC注册列表中指定的sound_out_obj移除,其中参数:

1、psound:sound_out_obj指向的sound结构体;
2、返回值:
    成功 true;
    失败 false;

2.1.6. 1.6 函数void fill_audio_adc_fill(u8 *buf, u32 len)

此函数在ADC中断中被调用,用于将ADC转换出来放在buf里的缓存数据推到指定的空间保存,其中参数:

1、buf:ADC转换后样点存放的缓存buf;
2、len:该buf的大小,默认为64个byte,存有32个样点;

该接口实现将ADC转换完成的数据样点写到相应的空间(存放于audio_adc_mge.sound[i]->p_obuf)中,其具体操作如下:

① ADC转换一次后,会在中断结束后调用该接口将转换的数据样点取走存放于相应的空间;
② 该接口首先会选择正在编码播放的通道,并找到存放样点数据的buf;
③ 一次性将buf中的数据写入注册了该ADC通道的audio_adc_mge.sound[i]->p_obuf里;
④ 启动kick继续下一轮编码;