2. AUDIO ADC(AD14N / AC104N)
本章介绍 AUDIO_ADC 的相关内容。AD14N / AC104N 内置应用于语音场合的 AUDIO_ADC ,可外接驻极体MIC来录制外界声音 或者 linein输入。此 AUDIO_ADC 支持16bit精度,单声道,支持8k/12k/16k/24k四种采样率;AUDIO_ADC 只支持1路输入,在SDK可设置为采集 MIC 或 LINEIN 的信号,此外在SDK软件里实现了最多两路分发(用户可修改)。Audio ADC 涉及两个文件,分别是1. app/lib/adc_api.c2. 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. AUDIO ADC 性能指标
详细芯片性能指标可参考 “AD14/AC104N Audio_AD2DA(RDAC输出)性能指标测试说明” 章节
2.2. AUDIO ADC接口介绍
2.2.1. 函数void audio_adc_mode_init(void)
此函数实现对 AUDIO_ADC 管理结构体和相关参数进行初始化,开机初始化调用一次即可。
2.2.2. 函数u32 audio_adc_init_api(u32 sr, ADC_MODE mode, u32 ch)
此函数实现对 AUDIO_ADC 硬件资源和相关寄存器进行初始化,此处会根据mode的值来选择AUDIO_ADC数据源,其中参数:
1、sr:采样率,默认选择为24000; ① 8000; ② 12000; ③ 16000; ④ 24000; 2、mode:ADC模式,默认选择为ADC_MIC; ① ADC_MIC : ADUIO_ADC数据来源为MIC采集回来 ② ADC_LINE_IN : AUDIO_ADC数据来源为LINEIN输入 3、ch:选择的ADC通道; 该参数仅对LINE_IN模式有效,MIC模式下传入0即可: BIT(0) : LINEIN 输入为 PA13; BIT(1) : LINEIN 输入为 PA14; 4、返回值:成功 0;
2.2.3. 函数void audio_adc_off_api(void)
此函数实现关闭所有 AUDIO_ADC 模块。
2.2.4. 函数bool regist_audio_adc_channel(void *psound, void *kick)
此函数实现将sound_out_obj注册到 AUDIO_ADC 中,用户可将采集到的数据最多分发两路处理,其中参数:
1、psound:sound_out_obj指向的sound结构体; 2、kick:kick函数; 3、返回值: 成功 true; 失败 false;
2.2.5. 函数bool unregist_audio_adc_channel(void *psound)
此函数实现将 AUDIO_ADC 注册列表中指定的sound_out_obj移除,其中参数:
1、psound:sound_out_obj指向的sound结构体; 2、返回值: 成功 true; 失败 false;
2.2.6. 函数void fill_audio_adc_fill(u8 *buf, u32 len)
此函数在 AUDIO_ADC 中断中被调用,用于将 AUDIO_ADC 转换出来放在buf里的缓存数据推到指定的空间保存,其中参数:
1、buf:AUDIO_ADC转换后样点存放的缓存buf; 2、len:该buf的大小,默认为64个byte,存有32个样点;该接口实现将 AUDIO_ADC 转换完成的数据样点写到相应的空间(存放于audio_adc_mge.sound[i]->p_obuf)中,其具体操作如下:
① AUDIO_ADC 转换一次后,会在中断结束后调用该接口将转换的数据样点取走存放于相应的空间; ② 该接口首先会选择正在编码播放的通道,并找到存放样点数据的buf; ③ 一次性将buf中的数据写入注册了该 AUDIO_ADC 通道的audio_adc_mge.sound[i]->p_obuf里; ④ 若kick函数存在则运行kick函数,为空则该AUDIO_ADC填数函数运行完毕。