Audio Q&A
Q1: 如何获取AI采集声音大小?
通过 MI_S32 MI_AI_GetVqeVolume(MI_AUDIO_DEV AiDevId, MI_AI_CHN AiChn, MI_S32*ps32VolumeDb) api获取。
Q2: 音频播放卡顿,并且log报:MI_AO_IMPL_SendFrame[2695]: Device 0 is empty
确定送数据的逻辑要足够快,另外尝试打开kernel的高精度时钟
Q3: 如何使用设备树配置audio speaker的功放使能引脚?
A: arch/arm/boot/dts/infinity2m.dtsi
中将sound节点中的 amp-gpio 项设置为<PAD_GPIO12 1> //PAD_GPIO12
为实际硬件使能pin脚
B:arch/arm/boot/dts/infinity2m-ssc011a-s01a-padmux-display.dtsi
中将对应pin脚的u32Puse改为MDRV_PUSE_AIO_AMP_PWR
(这里的*padmux-display.dtsi
根据实际文件的修改)
Q4:如何配置i2s pin脚设定?
-
在
infinity2m.dtsi
中将如下i2s-padmux配置成对应的mode,eg:对应的是mode 1,padmux就填1:
-
在对应的padmux文件配置成对应的i2s mode,eg:
<PAD_GPIO0 PINMUX_FOR_I2S_MODE_1 MDRV_PUSE_I2S_WCK >, <PAD_GPIO1 PINMUX_FOR_I2S_MODE_1 MDRV_PUSE_I2S_BCK >, <PAD_GPIO2 PINMUX_FOR_I2S_MODE_1 MDRV_PUSE_I2S_SDI >, <PAD_GPIO3 PINMUX_FOR_I2S_MODE_1 MDRV_PUSE_I2S_SDO >,
Q5:如何查看AO数据处理状态?
查询 AO 通道中当前的音频数据缓存状态。
MI_S32 MI_AO_QueryChnStat(MI_AUDIO_DEV AoDevId, MI_AO_CHN AoChn, MI_AO_ChnState_t*pstStatus);
u32ChnTotalNum:输出通道总的缓存字节数。
u32ChnFreeNum:可用的空闲缓存字节数。
u32ChnBusyNum:被占用缓存字节数。
EX:
MI_AO_QueryChnStat(pstAoInChn->AoDevId, pstAoInChn->AoChn,&pstStatus ); while(pstStatus.u32ChnFreeNum < s32RdSize ) { MI_AO_QueryChnStat(pstAoInChn->AoDevId, pstAoInChn->AoChn,&pstStatus ); WW_Usec_Sleep(1000); }
Q6:AO是否支持跨进程调用?
不支持跨进程。如果两个进程中都需要使用AO必须保证一个进程调用相关API Deinit AO Dev,另一个进程Init AO Dev,并重新配置AO相关参函数,AO才能正常使用。
Q7:[MI ERR ]: MI_AO_SendFrame[3995]: Need size[69760] > total Dma buffer size[65536]如何处理?
出现此错误的原因是调用MI_AO_SendFrame接口未设置阻塞时间或者阻塞时间太短,导致AO缓存的数据不断累积最终超过64K最大缓存大小。阻塞时间可根据每次送给AO的字节数、音频采样率、数据格式以及声道数估算,如每次送2048个字节,48K采样率,单声道,S16的PCM数据:
2048 / 48000 / 2 = 22ms,即阻塞时间设置大于22ms,MI_AO_SendFrame(AUDIO_DEV, AUDIO_CHN, &stAoSendFrame, 22);
...