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脚设定?

  1. infinity2m.dtsi中将如下i2s-padmux配置成对应的mode,eg:

    对应的是mode 1,padmux就填1:

  2. 在对应的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);

...