MI AI API
REVISION HISTORY¶
Revision No. | Description |
Date |
---|---|---|
3.50 | 12/04/2020 | |
3.51 | 07/19/2021 | |
08/25/2021 | ||
3.52 | 09/08/2021 | |
12/29/2021 | ||
3.53 | 02/17/2022 | |
3.54 | 03/29/2022 | |
05/19/2022 | ||
3.55 | 02/28/2023 | |
06/10/2023 | ||
07/03/2023 | ||
11/21/2023 | ||
12/06/2023 | ||
3.56 | 04/15/2024 | |
3.57 | 07/26/2024 |
1. 概述¶
1.1. 模块说明¶
音频输入(Audio Input, AI)主要实现配置及启用音频输入设备、读取音频数据、以及音量、静音设置等功能。
1.2. Audio Codec框图¶
1.2.1. Muffin系列¶
图1‑1:Muffin系列芯片
Muffin系列芯片的audio codec拥有如下资源:
-
WDMA * 5
-
RDMA * 3
-
DMIC接口 (可支持4Chn DMIC信号) * 1
-
ADC (可支持2Chn Amic/Linein) * 2
-
I2S-TDM RX * 4
-
I2S-TDM TX * 2
-
DAC (可支持2Chn Lineout) * 2
-
SRC * 1
-
HDMI TX * 1
1.2.2. Mochi系列¶
图1‑2:Mochi系列芯片
Mochi系列芯片的audio codec拥有如下资源:
-
WDMA * 3
-
RDMA * 2
-
DMIC接口 (可支持4Chn DMIC信号) * 1
-
ADC (可支持2Chn Amic/Linein) * 2
-
I2S-TDM RX (16 slot) * 1
-
I2S-TDM TX (16 slot,但只有2路有效数据) * 1
-
DAC (可支持2Chn Lineout) * 2
-
SRC * 1
-
HDMI TX * 1
1.2.3. Maruko系列¶
图1-3:Maruko系列芯片
Maruko系列芯片的audio codec拥有如下资源:
-
WDMA * 1
-
RDMA * 1
-
DMIC接口(可支持6Chn DMIC信号) * 1
-
ADC(可支持2Chn Amic/Linein) * 2
-
I2S RX(2 slot) * 2
-
I2S TX(2 slot) * 1
-
DAC(可支持2Chn Lineout) * 2
-
SRC * 1
1.2.4. Souffle系列¶
图1-4:Souffle系列芯片
Souffle系列芯片的audio codec拥有如下资源:
-
WDMA * 2
-
RDMA * 1
-
DMIC接口(可支持6Chn DMIC信号、DMIC CLK可与I2S_RX BCK共享) * 1
-
ADC(可支持3Chn Amic/Linein Differential Input) * 3
-
I2S RX(16 slot) * 1
-
I2S TX(16 slot) * 1
-
DAC(可支持2Chn Lineout Single Output) * 2
-
SRC(2路物理声道) * 1
1.2.5. Ifado系列¶
图1-5:Ifado系列芯片
Ifado系列芯片的audio codec拥有如下资源:
-
WDMA * 1
-
RDMA * 1
-
DMIC接口(可支持2Chn DMIC信号) * 1
-
ADC(可支持2Chn) * 1
-
I2S RX(1ch/2ch) * 1
-
I2S TX(1ch/2ch) * 1
-
DAC(可支持2Chn Lineout Single Output) * 1
-
SRC * 1
1.3. Audio Codec器件说明¶
-
DMA
DMA即Direct Memory Access直接存储器访问,DMA传输将数据从一个地址空间复制到另一个地址空间,提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。当CPU初始化这个传输动作,传输动作本身是由DMA控制器来实现和完成的。DMA传输方式无需CPU直接控制传输,也没有中断处理方式那样保留现场和恢复现场过程,通过硬件为RAM和IO设备开辟一条直接传输数据的通道,使得CPU的效率大大提高。
-
WDMA
WDMA即Direct Memory Access Writer直接存储器访问写入器。
-
RDMA
RDMA即Direct Memory Access Reader直接存储器访问读取器。
-
MUX
MUX即multiplexer 数据选择器,在多路数据传送过程中,能够根据需要将其中任意多路选出来的电路。WDMA前面的Mux为WDMA选择多个数据数据源,可支持选择1/ 2/ 4个数据源(数据源可以相同也可以不同,Souffle系列芯片最大支持选择8个数据源16Chn),每个数据源各有两声道,即选择2/ 4/ 8/ 16个声道的数据由WDMA写到DRAM(除了Souffle系列芯片支持16声道外,其他系列均最大支持8个声道),起到多路开关的作用。而接近输出外设接口(如I2S TX/HDMI/DAC等)的Mux实现的是多选一或一选多的作用。
-
DPGA
DPGA即Digital Programmable Gain Amplifier数字可编程增益放大器,是一种通用性很强的放大器,其放大倍数可以根据需要用程序进行控制。
-
DMIC
DMIC即Digital Microphone Interface 数字麦克风接口,audio codec仅仅提供DMIC接口,并非完整的DMIC。DMIC接口提供DMIC工作所需要的时钟信号,接收从DMIC来的PDM信号。
-
ADC
ADC即Analog Digital Conversion 模拟数字转换,将模拟信号转变为数字信号的电子元件。
-
I2S
I2S即Inter—IC Sound 集成电路内置音频总线,是飞利浦公司为数字音频设备之间的音频数据传输而制定的一种总线标准。Sigmastar的I2S总线仅支持标准I2S数据格式以及左对齐的I2S数据格式。同时也支持TDM即Time-Division Multiplexing 时分复用技术,将不同的信号相互交织在不同的时间段内,沿着同一个信道传输,可同时支持4/8/16通道数据传输。
-
DAC
DAC即Digital Analog Conversion 数字模拟转换,将数字信号转变为模拟信号的电子元件。
-
SRC
SRC即Sample Rate Convert 采样率转换,对语音数字信号进行采样率转换。
-
HDMI_TX
HDMI(High Definition Multimedia Interface,高清多媒体接口) TX,是一种全数字化视频和声音发送接口,可以发送未压缩的音频及视频信号。
1.4. Audio Codec差异说明¶
1.4.1. Muffin系列¶
Muffin系列芯片拥有I2S RX * 4,但I2S RX C和I2S RX D有两种模式,一种称为share mode,一种称为slave mode。share mode,I2S RX C和I2S RX A共享I2S Clock(Wck以及Bck),I2S RX D和I2S RX B共享I2S Clock(Wck以及Bck),当需要同时使用I2S RX A和I2S RX C时,两者的I2S 参数必须完全一致,与I2S RX C对接的Codec需要将I2S Clock引脚(Wck以及Bck)与I2S RX A的I2S Clock(Wck以及Bck)相接, Data引脚与I2S RX C的Data相接,硬件解法如下图所示。I2S RX D与I2S RX B的关系也如同I2S RX C和I2S RX A一般。slave mode,I2S RX C和I2S RX D拥有独立的时钟,但只能作为slave使用。这两种模式可以通过dts sound节点下的i2s-rx-mode来设置,0为slave mode,1为share mode。
1.4.2. Mochi系列¶
Mochi系列芯片I2S支持最大16slot,采样率新增支持96K/192K。注意:在I2S的使用场景中,I2S BCK最大不能超过30MHz(如:BCK=16bit * 16slots * 192K=49.152M 或者 BCK=32bit * 16slots * 192K=98.304M,BCK > 30MHz的使用情况不支持)。MUX目前最大支持8个声道,故若需使用I2S RX 16slot的情况,需要将16声道的数据attach到两个DMA上。
1.4.3. Maruko系列¶
Maruko系列芯片,虽然有两组I2S RX,但两组I2S RX无法同时使用。以下是两组I2S RX的使用场景:
I2S RX:
-
外接codec传输的为非I2S信号,需要对Wck、Bck做调整,比如接收PCM信号。
-
需要与Dmic share clock,以达到Dmic和I2S RX同步。
-
外接codec工作在master mode。
I2S TRX:
- 需要使用I2S TX。
两组I2S RX选用哪一组通过dts sound节点下的i2s-pcm来选择,1为I2S RX,0为I2S TRX。另外I2S RX是否与Dmic share clock通过dts中dmic-bck-share来进行配置,1为share clock,0为独立clock。
1.4.4. Souffle系列¶
BGA封装支持3Chn Amic/Linein Differential Input,QFN128封装仅支持2Chn Amic/Linein Differential Input(Mic1和Mic2),使用QFN128封装时需要修改dts节点“adc-out-sel = <1 2 1 2>”,参考Souffle系列芯片框图。
Souffle系列芯片I2S支持最大16slot,采样率支持96K/192K,支持1Chn PCM,但不支持32bit位宽收发, 相较于旧款SOC,支持输出更多频率的MCLK。
MUX目前最大支持16个声道,支持同时attach 16路音频数据到同一个DMA上。
I2S RX 'BCK'支持与Dmic 'CLK' share clock,I2S RX是否与Dmic share clock通过dmic-bck-share来进行配置,1为share clock,0为独立clock。
I2S支持short FF mode(通过dts中的节点i2s-rx-short-ff-mode/i2s-tx-short-ff-mode来配置),支持WS_DLY=1~3,其中WS_DLY=0即NO short FF mode,下图1-6、1-7分别为NO short-FF-mode和short-FF-mode对应的时序。
图1-6:I2S NO short-FF-mode
图1-7:I2S short-FF-mode
注意:在I2S的使用场景中,I2S BCK最大不能超过30MHz(如:BCK=16bit * 16slots * 192K=49.152M,BCK > 30MHz的使用情况不支持)。
1.4.5. Ifado系列¶
QFN128封装支持2 Chn I2S,2 Chn Line out,2 Chn Amic输入。
QFN88封装不支持I2S,只支持1 Chn Line out,支持2 Chn Amic输入。
I2S只支持I2S mode,不支持TDM mode,bit width只支持16 bit。I2S BCK不支持与DMIC share clk。
1.5. API关键字说明¶
-
Device (音频输入设备)
AI的Device指的是audio codec的WDMA。Device是audio3.0对audio codec中DMA的抽象,audio codec中的WDMA和AI Device为一一对应的关系。如AI Device0对应audio codec中的WDMA1,AI Device1对应audio codec中的WDMA2,以此类推。audio3.0的数据流均以DMA为中心进行串接。
-
Channel Group (音频输入通道组)
AI的Channel Group指的是多个物理通道道组成的集合。而集合具体包含多少个物理声道则由AI Device的Sound Mode来决定。Channel Group的意义是为了保证有关联的多个物理声道数据的同步。比如要做一个4Mic的beamforming算法,4个物理声道必须保证数据的同步性,解决方法就是把4个物理声道当成一个整体来操作。这便是Channel Group的意义。而AI Device共用多少个Channel Group,由AI Device上所接的物理声道数以及Sound Mode共同决定,Channel Group Number = (Device所接的物理声道数 - Device所接Echo的物理声道数) / Sound Mode。
-
Interface (音频输入外设)
AI的Interface是对audio codec音频输入外设接口的抽象,如Amic/Dmic/I2S/HDMI等接口。
-
Attach
AI的Attach指的是将Interface挂载到WDMA对应的MUX上,即将Device与Interface关联起来。对于AI Device而言,Attach是设定WDMA对应的MUX,选择哪些Interface的数据可以通过MUX,由WDMA做后续的数据搬移。AI Device不支持动态Attach Interface。
下图是将Dmic和ADC Attach到WDMA2的结果,MUX选择Dmic和ADC0/1作为两个数据源,并连接到WDMA2,这样WDMA2就能收到来自Dmic和ADC0/1的数据。
-
Echo (回声)
AI的Echo指的是audio codec提供的AEC参考数据。由audio codec框图可以看出,SRC的输入是RDMA输出并经过DPGA放大的信号,SRC的输出则是对输入进行重采样后的信号,可通过Multi Channel送进WDMA,作为AEC算法的回声参考数据。对于AI Device而言,Echo表示audio codec框图中SRC的输出信号。而对于AO Device而言,Echo表示将AO Device的输出连接到SRC的输入。下图以简单框图表示AI Device和AO Device同时使用Echo的数据流情况,应用即可获取到已经对齐的AEC far end和near end的数据。
-
Sound Mode (声音模式)
AI的Sound Mode表示一个通道组由多少个物理通道组成,而一个Device有多少个Channel Group取决于attach上的物理通道数和Sound Mode。
Channel Group Number = (attach上的物理通道数 – attach上的Echo通道数) / Sound Mode。
-
Gain
AI的Gain在audio3.0架构上分成两类,一类是与Device相关联的Gain,一般由DPGA实现,另一类则是Interface所独有的Gain,目前拥有Gain的Interface有ADC以及Dmic接口。对于AI而言,若Interface本身没有独立的Interface Gain且也不与Dpga相连,则没法做Gain的设定,具体见芯片Codec框图。
-
Format
Format,即用什么数据形式来表示一个音频采样样本,目前仅支持S16_LE格式(PCM Linear 16bit (Little Endian))。
-
Sample Rate
Sample Rate,即录音设备在单位时间内对模拟信号采样的次数,采样频率越高,机械波的波形越真实越自然。
-
Period Size
对于AI Device而言,Period Size表示每个AI buffer所包含的数据量(采样样本数)。
-
Interleave
对于AI Device而言,Interleave打开与否决定了MI_AI 如何存放Channel Group的数据,若Interleave打开,则Channel Group内的各个物理通道的数据按样本交错存放。若Interleave关闭,则Channel Group内的各个物理通道的数据分开存放。
-
I2S参数
-
I2S Mode
I2S Mode决定了I2S的工作模式,是标准的I2S模式还是Tdm I2S模式(2Channel或多channel),是Master还是Slave(Master提供同步时钟,Slave接收同步时钟)。一般来说,工作模式没有什么限制,能与外接的Codec时钟匹配上即可。
-
I2S BitWidth
I2S 收发数据的位宽,目前可支持16/32bit(Souffle/Ifado系列仅支持16bit),但硬件只能处理16bit,意味着位宽为32bit时,低16bit为无效数据。
-
I2S Format
I2S的Format即I2S的对齐方式,目前仅支持I2S Philips以及Left-justified对齐。下图分别为这两种格式的波形图。
I2S Philips的对齐格式,样本数据的第一个数据位出现在WCLK(即左右通道切换时钟)跳变的第一个BCLK(即串行时钟)后。左对齐格式,样本数据的第一个数据位出现在WCLK(即左右通道切换时钟)跳变的第一个BCLK(即串行时钟)内,且WCLK的极性与I2S Philips的对齐格式相反。
-
I2S Sample Rate
I2S 收发的采样频率。
-
Mclk
Mclk,称为主时钟,也叫系统时钟(System Clock),一般是采样频率的256或384倍,作用是为了使系统间能够更好的同步,并不是必须的。目前仅支持12.288M,16.384M,18.432M,24.576M,24M,48M等(具体支持哪些MCLK见数据类型)。
-
bSyncClock/4-Wire/6-Wire Mode
SigmaStar的I2S有两种接线方式。一种是4-Wire模式,包括RX_WCK、RX_BCK、RX_SDI、TX_SDO四根线,此模式下,TX没有独立的clock,所有的clock均由RX提供,故在此模式下TX需要依赖RX来使用,没法单独使用TX,且I2S TX的参数需与I2S RX一致。另一种是6-Wire模式,包括RX_WCK、RX_BCK、RX_SDI、TX_WCK、TX_BCK、TX_SDO六根线,此模式下RX和TX各自独立,没有关联。
4-Wire/6-Wire Mode的选择需要根据具体场景来决定。
MI API I2S参数中的bSyncClock为TRUE,则使用4-Wire Mode,FALSE则使用6-Wire Mode,且属于同一组I2S的RX和TX不能一边设置成4-Wire Mode,另一边设置成6-Wire Mode。
-
Slot
Slot表示I2S 传输的声道数,目前I2S模式下支持2slot,Tdm模式下支持4/8slot (Mochi系列和Souffle系列支持16slot)。
-
-
PCM
标准I2S(2Chn)协议属于PCM协议里最常用的一种。PCM可以传输多通道数据,如4channel,8channel,16channel等,也就是TDM协议(区别于标准I2S(2chn)协议的特定的格式)。一般用于传输单声道数据也常称为PCM(除过常用的标准I2S、TDM外,其他统称为PCM)。 Sigmastar Audio除过标准I2S(2chn)的设定,其他Timing 包括1Chn PCM的相关设定统一放到TDM的参数中设定。
2. API 参考¶
音频输入(AI)主要实现音频输入设备的配置和使能、获取音频帧数据等功能。
API名 | 功能 |
---|---|
MI_AI_Open | 打开音频输入设备 |
MI_AI_OpenWithCfgFile | 打开音频输入设备,并按配置文件初始化 |
MI_AI_Close | 关闭音频输入设备 |
MI_AI_AttachIf | 挂载外设到音频输入设备 |
MI_AI_EnableChnGroup | 使能音频输入通道组 |
MI_AI_DisableChnGroup | 禁用音频输入通道组 |
MI_AI_Read | 读取音频数据 |
MI_AI_ReleaseData | 释放音频数据 |
MI_AI_SetGain | 设置音频输入通道组的音量 |
MI_AI_GetGain | 获取音频输入通道组的音量 |
MI_AI_SetMute | 设置音频输入通道组的静音参数 |
MI_AI_GetMute | 获取音频输入通道组的静音参数 |
MI_AI_SetIfGain | 设置音频输入外设的音量 |
MI_AI_GetIfGain | 获取音频输入外设的音量 |
MI_AI_SetIfMute | 设置音频输入外设的静音参数 |
MI_AI_GetIfMute | 获取音频输入外设的静音参数 |
MI_AI_SetI2SConfig | 设置I2S RX的配置信息 |
MI_AI_GetI2SConfig | 获取I2S RX的配置信息 |
MI_AI_DupChnGroup | 同步音频输入通道组状态 |
MI_AI_InitDev | 初始化音频输入设备 |
MI_AI_DeInitDev | 反初始化音频输入设备 |
MI_AI_GetAttr | 获取音频输入设备属性 |
2.1. MI_AI_Open¶
-
功能
打开音频输入设备。
-
语法
MI_S32 MI_AI_Open(MI_AUDIO_DEV AiDevId, const MI_AI_Attr_t *pstAttr);
-
形参
参数名称 描述 输入/输出 AiDevId 音频输入设备号 输入 pstAttr 设备属性指针 输入 -
返回值
-
0:成功。
-
非0:失败,参照错误码。
-
-
依赖
-
头文件:mi_ai.h
-
库文件:libmi_ai.a/libmi_ai.so
-
-
注意
音频输入设备属性包括数据格式、声音模式、采样率、音频数据的样本数、交错模式。
-
音频数据格式(MI_AUDIO_Format_e)
音频数据格式指采样样本的数据格式。目前仅支持S16_LE。
-
音频声音模式(MI_AUDIO_SoundMode_e)
音频声音模式指通道组包含的物理通道数。MONO表示1个通道组包含1个物理通道,STEREO表示1个通道组包含2个物理通道,4CH表示1个通道组包含4个物理通道,6CH表示1个通道组包含6个物理通道,8CH表示1个通道组包含8个物理通道。
-
音频采样率(MI_AUDIO_SampleRate_e)
音频采样率指一秒内采样的次数。采样率越高,采样的结果与原信号相比失真度越小,但处理的数据量也就随之增加。
-
音频数据的样本数(u32PeriodSize)
音频数据的样本数即每次读取音频数据包含的样本个数。当音频采样率较高时,建议相应地增大u32PeriodSize。若发现采集到的声音断续,则需要增大u32PeriodSize和缓存buffer大小。
-
交错模式(bInterleaved)
交错模式是否使能决定了通道组中各物理通道的数据排列情况。以声音模式为4CH举例,下面以Sx代替第x个sample进行描述,当交错模式使能时,4个物理通道的数据交错排列,如Chn0S0 Chn1S0 Chn2S0 Chn3S0 Chn0S1 Chn1S1 Chn2S1 Chn3S1……,当交错模式禁用时,4个物理通道的数据按通道顺序,一个通道排列完再接下一个通道,如
Chn0S0 Chn0S1 Chn0S2 Chn0S3 …… Chn0Sn
Chn1S0 Chn1S1 Chn1S2 Chn1S3 …… Chn1Sn
Chn2S0 Chn2S1 Chn2S2 Chn2S3 …… Chn2Sn
Chn3S0 Chn3S1 Chn3S2 Chn3S3 …… Chn3Sn
-
-
举例
简单例子如下:
1. MI_AI_Attr_t stAiSetAttr = {0}; 2. MI_AUDIO_DEV AiDevId = 0; 3. stAiSetAttr.enFormat = E_MI_AUDIO_FORMAT_PCM_S16_LE; 4. stAiSetAttr.enSoundMode = E_MI_AUDIO_SOUND_MODE_MONO; 5. stAiSetAttr.enSampleRate = E_MI_AUDIO_SAMPLE_RATE_8000; 6. stAiSetAttr.u32PeriodSize = 1024; 7. stAiSetAttr.bInterleaved = TRUE; 8. ExecFunc(MI_AI_Open(AiDevId, &stAiSetAttr), MI_SUCCESS);
详细例子如下:
1. MI_AI_Attr_t stAiSetAttr = {0}; 2. MI_AI_Attr_t stAiGetAttr = {0}; 3. MI_AUDIO_DEV AiDevId = 0; 4. MI_AI_If_e enAiIf[] = {E_MI_AI_IF_ADC_AB}; 5. MI_AI_Data_t stAiChFrame; 6. MI_AI_Data_t stAecFrame; 7. MI_U8 u8ChnGrpId = 0; 8. MI_SYS_ChnPort_t stAiChnOutputPort; 9. MI_S16 s16DpgaGain[] = {-10}; 10. 11. // 设置AI Device的Format为S16_LE 12. stAiSetAttr.enFormat = E_MI_AUDIO_FORMAT_PCM_S16_LE; 13. 14. // 设置Sound Mode为Mono,一个Channel Group对应一个物理声道 15. stAiSetAttr.enSoundMode = E_MI_AUDIO_SOUND_MODE_MONO; 16. 17. // 设置AI Device的采样率为8KHz 18. stAiSetAttr.enSampleRate = E_MI_AUDIO_SAMPLE_RATE_8000; 19. 20. // 设置每个AI Buffer 包含1024个采样样本 21. stAiSetAttr.u32PeriodSize = 1024; 22. 23. // 设置AI buffer的数据排列形式 24. stAiSetAttr.bInterleaved = TRUE; 25. 26. // 打开AI Device 27. ExecFunc(MI_AI_Open(AiDevId, &stAiSetAttr), MI_SUCCESS); 28. 29. // 获取设备属性 30. ExecFunc(MI_AI_GetAttr(AiDevId, &stAiGetAttr), MI_SUCCESS); 31. 32. // 将ADC0/1 Attach到WDMA1上 33. ExecFunc(MI_AI_AttachIf(AiDevId, enAiIf, sizeof(enAiIf) / sizeof(enAiIf[0])), MI_SUCCESS); 34. 35. // 设置 output depth 36. memset(&stAiChnOutputPort, 0, sizeof(stAiChnOutputPort)); 37. stAiChnOutputPort.eModId = E_MI_MODULE_ID_AI; 38. stAiChnOutputPort.u32DevId = AiDevId; 39. stAiChnOutputPort.u32ChnId = u8ChnGrpId; 40. stAiChnOutputPort.u32PortId = 0; 41. ExecFunc(MI_SYS_SetChnOutputPortDepth(0, &stAiChnOutputPort, 4, 8), MI_SUCCESS); 42. 43. // 设置ADC0/1的Interface gain 44. ExecFunc(MI_AI_SetIfGain(E_MI_AI_IF_ADC_AB, 18, 0), MI_SUCCESS); 45. 46. // 设置ADC0/1的DPGA gain 47. ExecFunc(MI_AI_SetGain(AiDevId, u8ChnGrpId, s16DpgaGain, sizeof(s16DpgaGain) / sizeof(s16DpgaGain[0])), MI_SUCCESS); 48. 49. 50. // 使能Channel Group 51. ExecFunc(MI_AI_EnableChnGroup(AiDevId, u8ChnGrpId), MI_SUCCESS); 52. 53. // 获取音频帧数据 54. MI_AI_Read(AiDevId, u8ChnGrpId, &stAiChFrame, &stAecFrame, -1); 55. 56. // do something 57. 58. // 释放音频帧数据 59. MI_AI_ReleaseData(AiDevId, u8ChnGrpId, &stAiChFrame, &stAecFrame); 60. 61. // 禁用Channel Group 62. ExecFunc(MI_AI_DisableChnGroup(AiDevId, u8ChnGrpId), MI_SUCCESS); 63. 64. // 关闭AI Device 65. ExecFunc(MI_AI_Close(MI_AI_DEV_1), MI_SUCCESS);
2.2. MI_AI_OpenWithCfgFile¶
-
功能
打开音频输入设备,并按配置文件初始化。
-
语法
MI_S32 MI_AI_OpenWithCfgFile(MI_AUDIO_DEV AiDevId, const char *pCfgPath);
-
形参
参数名称 描述 输入/输出 AiDevId 音频输入设备号 输入 pCfgPath 配置文件路径 输入 -
返回值
-
0:成功。
-
非0:失败,参照错误码。
-
-
依赖
-
头文件:mi_ai.h
-
库文件:libmi_ai.a/libmi_ai.so
-
-
注意
-
此接口相当于MI_AI_Open和MI_AI_AttachIf组合。
-
如果音频输入设备已经处于开启状态,则直接返回成功。
-
Muffin/Mochi系列Soc上,配置文件为ini格式;Maruko/Souffle/Ifado系列Soc上,配置文件为json格式。
-
在dual os环境下,配置文件需要提供绝对路径。
-
ini格式配置文件模板如下:
1. ; Device attr section 2. [DEV] 3. ; enFormat determines the data format of the sample, only supports S16_LE now. 4. ; 0[S16_lE] 5. enFormat = 0 6. ; enSoundMode determines the channel count of Channel Group. 7. ; 1[Mono] 2[Stereo] 4[4Chn] 6[6Chn] 8[8Chn] 8. enSoundMode = 2 9. ; enSampleRate determines the sample rate of AI Device. 10. ; 8000[8KHz] 16000[16KHz] 32000[32KHz] 48000[48KHz] 11. enSampleRate = 8000 12. ; u32PeriodSize determines the count of sample in a AI Buffer 13. u32PeriodSize = 1024 14. ; bInterleaved determines the data arrangement mode of each channel. 15. ; if bInterleaved = 1, Data on each channel is interleaved, Otherwise, data on each channel is stored separately. 16. bInterleaved = 0 17. ; attach interface 18. ; 1[ADC_AB] 2[ADC_CD] 3[DMIC_A_01] 4[DMIC_A_23] 19. ; 5[I2S_A_01] 6[I2S_A_23] 7[I2S_A_45] 8[I2S_A_67] 9[I2S_A_89] 10[I2S_A_ab] 11[I2S_A_cd] 12[I2S_A_ef] 20. ; 13[I2S_B_01] 14[I2S_B_23] 15[I2S_B_45] 16[I2S_B_67] 17[I2S_B_89] 18[I2S_B_ab] 19[I2S_B_cd] 20[I2S_B_ef] 21. ; 21[I2S_C_01] 22[I2S_C_23] 23[I2S_C_45] 24[I2S_C_67] 25[I2S_C_89] 26[I2S_C_ab] 27[I2S_C_cd] 28[I2S_C_ef] 22. ; 29[I2S_D_01] 30[I2S_D_23] 31[I2S_D_45] 32[I2S_D_67] 33[I2S_D_89] 34[I2S_D_ab] 35[I2S_D_cd] 36[I2S_D_ef] 23. ; 37[ECHO_A] 38[HDMI_A] 24. aenAiIfs={1,5} 25. 26. ; I2S RX attr section 27. ; It is not necessarywhen you're not using I2S RX 28. [I2S_A] 29. ; enMode determines the working mode of I2S Rx 30. ; 0[I2S Master] 1[I2S Slave] 2[Tdm Master] 3[Tdm Slave] 31. enMode = 0 32. ; enBitWidth determines the bit with of I2S Rx 33. ; 0[16 bit] 1[32bit] 34. enBitWidth = 0 35. ; enFormat determines the waveform alignment of I2S Rx 36. ; 0[I2S Philips] 1[I2S Left-justify] 37. enFormat = 0 38. ; enSampleRate determines the sample rate of I2S Rx 39. ; 8000[8KHz] 16000[16KHz] 32000[32KHz] 48000[48KHz] 40. enSampleRate = 8000 41. ; enMclk determines the frequency of Mclk 42. ; 0[disable Mclk] 1[12.288M] 2[16.384M] 3[18.432M] 4[24.576M] 5[24M] 6[48M] 43. enMclk = 0 44. ; bSyncClock: 1[4-wire mode] 0[6-wire mode] 45. bSyncClock = 0 46. ; u32TdmSlots determines the slot number of I2S Rx 47. u32TdmSlots = 2
-
json格式配置文件模板如下:
1. { 2. "DEV":{ 3. "enFormat":0, 4. "enSoundMode":2, 5. "enSampleRate":8000, 6. "u32PeriodSize":1024, 7. "bInterleaved":0, 8. "aenAiIfs":[1,5] 9. }, 10. "I2S_A":{ 11. "enMode":0, 12. "enBitWidth":0, 13. "enFormat":0, 14. "enSampleRate":8000, 15. "enMclk":0, 16. "bSyncClock":0, 17. "u32TdmSlots":2 18. } 19. } 20.
“DEV”节点包含了MI_AI_Open和MI_AI_AttachIf所需要的参数信息,其中“enFormat”、“enSoundMode”、“enSampleRate”、“u32PeriodSize”和“bInterleaved”为MI_AI_Open所需的配置信息,可参考MI_AI_AttachIf,而“aenAiIfs”为MI_AI_AttachIf所需要的配置信息,可参考MI_AI_If_e。“I2S_A”节点包含了MI_AI_SetI2SConfig所需要的配置信息,可参考MI_AUDIO_I2sConfig_t。
配置项的取值与下给MI API的参数一致,enFormat = 0表示AI Device采用S16_LE格式,enSoundMode = 1表示Sound Mode采用Mono,enSampleRate = 8000表示AI Device使用8KHz采样频率,u32PeriodSize = 1024表示一个AI Buffer包含1024个采样点,bInterleaved = 1表示Channel Group的数据排列按交错方式排列,aenAiIfs={1},表示将ADC0/1 attach到WDMA。若需要使用I2S RX还需要设置I2S RX的参数,上述配置作用于I2S_A,enMode = 0表示使用I2S Master模式,enBitWidth = 0表示I2S的接收位宽为16bit,enFormat = 0表示按I2S Philips方式对齐,enSampleRate = 8000表示I2S RX的采样频率为8KHz,enMclk = 0表示不使用Mclk,bSyncClock = 1表示4-wire模式,u32TdmSlots表示接收2通道数据。
-
-
举例
1. char *path = "/tmp/Dev0Cfg.json"; // char *path = "/tmp/Dev0Cfg.ini"; 2. ExecFunc(MI_AI_OpenWithCfgFile(AiDevId, path), MI_SUCCESS);
2.3. MI_AI_Close¶
- 功能
关闭音频输入设备。
-
语法
MI_S32 MI_AI_Close(MI_AUDIO_DEV AiDevId);
-
形参
参数名称 描述 输入/输出 AiDevId 音频输入设备号 输入 -
返回值
-
0:成功。
-
非0:失败,参照错误码。
-
-
依赖
-
头文件:mi_ai.h
-
库文件:libmi_ai.a/libmi_ai.so
-
-
注意
- 如果音频输入设备已经处于关闭状态,则直接返回成功。
-
举例
简单例子如下:
1. ExecFunc(MI_AI_Close(MI_AI_DEV_1), MI_SUCCESS);
详细例子请参考MI_AI_Open。
2.4. MI_AI_AttachIf¶
-
功能
挂载外设到音频输入设备。
-
语法
MI_S32 MI_AI_AttachIf(MI_AUDIO_DEV AiDevId, const MI_AI_If_e aenAiIfs[], MI_U8 u8AiIfSize);
-
形参
参数名称 描述 输入/输出 AiDevId 音频输入设备号 输入 aenAiIfs AI Interface数组,需要挂载到音频输入设备的外设信息; 数组的一个元素表示2个相邻物理通道所挂载的外设 输入 U8AiIfSize interface数组的大小, 最大为(MI_AI_MAX_CHN_NUM/2) 输入 -
返回值
-
0:成功。
-
非0:失败,参照错误码。
-
-
依赖
-
头文件:mi_ai.h
-
库文件:libmi_ai.a/libmi_ai.so
-
-
注意
-
此接口仅能在MI_AI_Open成功后调用。
-
如需要挂载I2S RX到音频输入设备,需要先调用MI_AI_SetI2SConfig来初始化I2S RX。
-
如果要获取回声参考数据,AI模块需要attach E_MI_AI_IF_ECHO_A,AO模块需要attach E_MI_AO_IF_ECHO_A。在AI模块中E_MI_AI_IF_ECHO_A必须与非E_MI_AI_IF_ECHO_A的interface一同attach,且必须放在非E_MI_AI_IF_ECHO_A的interface后面。
-
当attach的interface通道数(减去E_MI_AI_IF_ECHO_A的通道数)少于或不能整除于音频声音模式(MI_AUDIO_SoundMode_e)时,返回错误。
-
-
举例
简单例子如下:
1. MI_AI_If_e enAiIf[] = {E_MI_AI_IF_ADC_AB, E_MI_AI_IF_ADC_CD}; 2. ExecFunc(MI_AI_AttachIf(AiDevId, enAiIf, sizeof(enAiIf) / sizeof(enAiIf[0])), MI_SUCCESS);
详细例子请参考MI_AI_Open。
2.5. MI_AI_EnableChnGroup¶
-
功能
使能音频输入通道组。
-
语法
MI_S32 MI_AI_EnableChnGroup(MI_AUDIO_DEV AiDevId, MI_U8 u8ChnGrpIdx);
-
形参
参数名称 描述 输入/输出 AiDevId 音频输入设备号 输入 u8ChnGrpIdx 音频输入通道组号 音频输入通道组总数 = (音频输入设备挂载外设的物理通道数 – 回声所占用的物理通道数) / 音频输入设备的声音模式 音频输入通道组号的范围为[0, 音频输入通道组总数 - 1] 输入 -
返回值
-
0:成功。
-
非0:失败,参照错误码。
-
-
依赖
-
头文件:mi_ai.h
-
库文件:libmi_ai.a/libmi_ai.so
-
-
注意
-
此接口仅能在MI_AI_Open和MI_AI_AttachIf成功后调用。
-
如果音频输入通道组已使能,则直接返回成功。
-
音频输入通道组的操作不支持多进程,在哪个进程使能,只能在哪个进程使用,且只能在该进程禁用。
-
-
举例
简单例子如下:
1. ExecFunc(MI_AI_EnableChnGroup(AiDevId, 0), MI_SUCCESS);
详细例子请参考MI_AI_Open。
2.6. MI_AI_DisableChnGroup¶
-
功能
禁用音频输入通道组。
-
语法
MI_S32 MI_AI_DisableChnGroup(MI_AUDIO_DEV AiDevId, MI_U8 u8ChnGrpIdx);
-
形参
参数名称 描述 输入/输出 AiDevId 音频输入设备号 输入 u8ChnGrpIdx 音频输入通道组号 范围为[0, Channel Group Number - 1] Channel Group Number = (attach上的物理通道数 – attach上的Echo通道数) / Sound Mode 输入 -
返回值
-
0:成功。
-
非0:失败,参照错误码。
-
-
依赖
-
头文件:mi_ai.h
-
库文件:libmi_ai.a/libmi_ai.so
-
-
注意
-
如果AI通道已禁用,则直接返回成功。
-
音频输入通道组的操作不支持多进程,在哪个进程使能,只能在哪个进程使用,且只能在该进程禁用。
-
-
举例
简单例子如下:
1. ExecFunc(MI_AI_DisableChnGroup(AiDevId, 0), MI_SUCCESS);
详细例子请参考MI_AI_Open。
2.7. MI_AI_Read¶
-
功能
读取音频数据。
-
语法
MI_S32 MI_AI_Read(MI_AUDIO_DEV AiDevId, MI_U8 u8ChnGrpIdx, MI_AI_Data_t *pstData, MI_AI_Data_e *pstEchoRefData, MI_S32 s32TimeoutMs);
-
形参
参数名称 描述 输入/输出 AiDevId 音频输入设备号 输入 u8ChnGrpIdx 音频输入通道组号 范围为[0, Channel Group Number - 1] Channel Group Number = (attach上的物理通道数 – attach上的Echo通道数) / Sound Mode 输入 pstData 音频数据结构体指针 输出 pstEchoRefData 回声参考数据结构体指针 输出 s32TimeoutMs 获取数据的超时时间 -1 表示阻塞模式,无数据时一直等待 0 表示非阻塞模式,无数据时则报错返回 >0 表示阻塞s32TimeoutMs毫秒,超时则报错返回 输入 -
返回值
-
0:成功。
-
非0:失败,参照错误码。
-
-
依赖
-
头文件:mi_ai.h
-
库文件:libmi_ai.a/libmi_ai.so
-
-
注意
-
此接口仅能在MI_AI_Open / MI_AI_AttachIf / MI_AI_EnableChnGroup成功后调用。
-
如果需要获取回声参考数据,AO必须attach E_MI_AO_IF_ECHO_A,AI必须attach E_MI_AI_IF_ECHO_A,否则获取的回声参考数据无效。App拿到ECHO数据的物理通道数有且仅有2channel,当AI配置为交错模式时,无论当前配置为哪种sound mode,每组channel group都对应着1路stereo(共2channel)的回声参考数据,且每组channel group拿到的回声参考数据完全相同;当AI配置为非交错模式时,无论当前配置为哪种sound mode,每组channel group都对应着2路mono(共2channel)的回声参考数据,且每组channel group拿到的回声参考数据完全相同。
-
如果需要获取回声参考数据,pstEchoRefData不能是空指针,如果不想获取回声参考数据pstEchoRefData置为空指针即可。
-
s32TimeoutMs的值必须大于等于-1,等于-1 时采用阻塞模式获取数据,等于0时采用非阻塞模式获取数据,大于0时,阻塞s32TimeoutMs毫秒后,没有数据则返回超时并报错。
-
本接口支持select/poll 操作,建议使用select/poll操作代替超时操作。
-
-
举例
简单例子如下:
1. MI_AI_Data_t stAiChFrame; 2. MI_AI_Data_t stAecFrame; 3. MI_AI_Read(AiDevId, AiChnGroup, &stAiChFrame, &stAecFrame, -1);
详细例子请参考MI_AI_Open。
2.8. MI_AI_ReleaseData¶
-
功能
释放音频数据。
-
语法
MI_S32 MI_AI_ReleaseData(MI_AUDIO_DEV AiDevId, MI_U8 u8ChnGrpIdx, MI_AI_Data_t *pstData, MI_AI_Data_t *pstEchoRefData);
-
形参
参数名称 描述 输入/输出 AiDevId 音频输入设备号 输入 u8ChnGrpIdx 音频输入通道组号 范围为[0, Channel Group Number - 1] Channel Group Number = (attach上的物理通道数 – attach上的Echo通道数) / Sound Mode 输入 pstData 音频数据结构体指针 输入 pstEchoRefData 回声参考数据结构体指针 输入 -
返回值
-
0:成功。
-
非0:失败,参照错误码。
-
-
依赖
-
头文件:mi_ai.h
-
库文件:libmi_ai.a/libmi_ai.so
-
-
举例
简单例子如下:
1. MI_AI_ReleaseData(AiDevId, AiChnGroup, &stAiChFrame, &stAecFrame);
详细例子请参考MI_AI_Open。
2.9. MI_AI_SetGain¶
-
功能
设置音频输入通道组的音量。
-
语法
MI_S32 MI_AI_SetGain(MI_AUDIO_DEV AiDevId, MI_U8 u8ChnGrpIdx, const MI_S16 as16Gains[], MI_U8 u8GainSize);
-
形参
参数名称 描述 输入/输出 AiDevId 音频输入设备号 输入 u8ChnGrpIdx 音频输入通道组号 范围为[0, Channel Group Number - 1] Channel Group Number = (attach上的物理通道数 – attach上的Echo通道数) / Sound Mode 输入 as16Gains 音量数组 数组的一个元素表示一个物理通道的音量 输入 u8GainSize 音量数组的大小, 最大为Sound Mode所对应的物理通道 输入 -
返回值
-
0:成功。
-
非0:失败,参照错误码。
-
-
依赖
-
头文件:mi_ai.h
-
库文件:libmi_ai.a/libmi_ai.so
-
-
注意
-
在3.55版本及以后版本,所有音量Gain值的数据类型由S8改为S16,如旧版本的函数原型: MI_S32 MI_AI_SetGain(MI_AUDIO_DEV AiDevId, MI_U8 u8ChnGrpIdx, const MI_S8 as8Gains[], MI_U8 u8GainSize); 其他音量Gain相关的API同上。
-
设置音频输入通道组的音量,必须先打开音频输入设备且挂载上外设。
-
Muffin系列芯片仅E_MI_AI_IF_ADC_AB对应的通道支持此设定,其他interface无效。
-
Souffle系列芯片E_MI_AI_IF_ADC_AB/E_MI_AI_IF_ADC_CD/E_MI_AI_IF_DMIC_A_01/.../ E_MI_AI_IF_DMIC_A_45/E_MI_AI_IF_I2S_A_01/.../E_MI_AI_IF_I2S_A_ef对应的通道均支持此设定。
-
Souffle系列芯片Gain值与其他系列芯片有所不同,Gain值不是对应的Db值,而是存在一个映射关系,范围[-508, 512]对应[-63.5Db, 64Db],其中0对应0Db,0.125dB/step。
-
Ifado系列芯片的as16Gains设置范围为[-63.5dB, 12dB],0.5dB/step。
-
-
举例
简单例子如下:
1. MI_S16 s16DpgaGain[] = {-10}; 2. ExecFunc(MI_AI_SetGain(AiDevId, u8ChnGroupIdx, s16DpgaGain, sizeof(s16DpgaGain) / sizeof(s16DpgaGain[0])), MI_SUCCESS);
详细例子请参考MI_AI_Open。
2.10. MI_AI_GetGain¶
-
功能
获取音频输入通道组的音量。
-
语法
MI_S32 MI_AI_GetGain(MI_AUDIO_DEV AiDevId, MI_U8 u8ChnGrpIdx, MI_S16 as16Gains[], MI_U8 *pu8GainSize);
-
形参
参数名称 描述 输入/输出 AiDevId 音频输入设备号 输入 u8ChnGrpIdx 音频输入通道组号 范围为[0, Channel Group Number - 1] Channel Group Number = (attach上的物理通道数 – attach上的Echo通道数) / Sound Mode 输入 as16Gains 音量数组 数组的一个元素表示一个物理通道的音量 输出 pu8GainSize 音量数组的大小, 最大为Sound Mode所对应的物理通道 输出 -
返回值
-
0:成功。
-
非0:失败,参照错误码。
-
-
依赖
-
头文件:mi_ai.h
-
库文件:libmi_ai.a/libmi_ai.so
-
-
注意
-
获取音频输入通道组的音量,必须先打开音频输入设备且挂载上外设。
-
Muffin系列芯片仅E_MI_AI_IF_ADC_AB对应的通道支持此接口,其他interface无效。
-
Souffle系列芯片所有输入interface均支持,同MI_AI_SetGain。
-
-
举例
简单例子如下:
1. MI_S16 s16DpgaGain[MI_AI_MAX_CHN_NUM]; 2. MI_U8 u8Size; 3. memset(&s16DpgaGain, 0x0, sizeof(s16DpgaGain)); 4. ExecFunc(MI_AI_GetGain(AiDevId, u8ChnGroupIdx, s16DpgaGain, &u8Size), MI_SUCCESS);
详细例子请参考MI_AI_Open。
2.11. MI_AI_SetMute¶
-
功能
设置音频输入通道组的静音参数。
-
语法
MI_S32 MI_AI_SetMute(MI_AUDIO_DEV AiDevId, MI_U8 u8ChnGrpIdx, const MI_BOOL abMutes[], MI_U8 u8MuteSize);
-
形参
参数名称 描述 输入/输出 AiDevId 音频输入设备号 输入 u8ChnGrpIdx 音频输入通道组号 范围为[0, Channel Group Number - 1] Channel Group Number = (attach上的物理通道数 – attach上的Echo通道数) / Sound Mode 输入 abMutes 静音参数数组 静音参数数组的一个元素表示一个物理通道的静音参数 输入 u8MuteSize 静音参数数组大小, 最大为Sound Mode所对应的物理通道数 输入 -
返回值
-
0:成功。
-
非0:失败,参照错误码。
-
-
依赖
-
头文件:mi_ai.h
-
库文件:libmi_ai.a/libmi_ai.so
-
-
注意
- 设置音频输入通道组的静音参数,必须先打开音频输入设备且挂载上外设。
-
举例
1. MI_BOOL bDpgaMute[] = {TRUE, FALSE}; 2. ExecFunc(MI_AI_SetMute(AiDevId, u8ChnGroupIdx, bDpgaMute, sizeof(bDpgaMute) / sizeof(bDpgaMute[0])), MI_SUCCESS);
2.12. MI_AI_GetMute¶
-
功能
获取音频输入通道组的静音参数。
-
语法
MI_S32 MI_AI_GetMute(MI_AUDIO_DEV AiDevId, MI_U8 u8ChnGrpIdx, MI_BOOL abMutes[], MI_U8 *pu8MuteSize);
-
形参
参数名称 描述 输入/输出 AiDevId 音频输入设备号 输入 u8ChnGrpIdx 音频输入通道组号 范围为[0, Channel Group Number - 1] Channel Group Number = (attach上的物理通道数 – attach上的Echo通道数) / Sound Mode 输入 abMutes 静音参数数组 静音参数数组的一个元素表示一个物理通道的静音参数 输出 pu8MuteSize 静音参数数组大小, 最大为最大为Sound Mode所对应的物理通道 输出 -
返回值
-
0:成功。
-
非0:失败,参照错误码。
-
-
依赖
-
头文件:mi_ai.h
-
库文件:libmi_ai.a/libmi_ai.so
-
-
注意
- 获取音频输入通道组的静音参数,必须先打开音频输入设备且挂载上外设。
-
举例
1. MI_BOOL bDpgaMute[MI_AI_MAX_CHN_NUM]; 2. MI_U8 u8Size; 3. memset(&bDpgaMute, 0x0, sizeof(bDpgaMute)); 4. ExecFunc(MI_AI_GetMute(AiDevId, u8ChnGroupIdx, s16DpgaGain, &u8Size), MI_SUCCESS);
2.13. MI_AI_SetIfGain¶
-
功能
设置音频输入外设的音量。
-
语法
MI_S32 MI_AI_SetIfGain(MI_AI_If_e enAiIf, MI_S16 s16LeftIfGain, MI_S16 s16RightIfGain);
-
形参
参数名称 描述 输入/输出 enAiIf 音频输入外设 输入 s16LeftIfGain 左声道音量 输入 s16RightIfGain 右声道音量 输入 -
返回值
-
0:成功。
-
非0:失败,参照错误码。
-
-
依赖
-
头文件:mi_ai.h
-
库文件:libmi_ai.a/libmi_ai.so
-
-
注意
-
目前仅E_MI_AI_IF_ADC_AB/E_MI_AI_IF_ADC_CD/E_MI_AI_IF_DMIC_A_01/E_MI_AI_IF_DMIC_A_23/ E_MI_AI_IF_DMIC_A_45支持此设定。
-
E_MI_AI_IF_ADC_AB/E_MI_AI_IF_ADC_CD支持的音量范围:Muffin/Mochi/Souffle[0, 19],对应到0~57Db,3dB/step;Maruko[0, 21],对应到-6~57Db,3dB/step;Ifado[0, 19],对应到-6~51Db,3dB/step。
-
E_MI_AI_IF_DMIC_A_01/E_MI_AI_IF_DMIC_A_23/E_MI_AI_IF_DMIC_A_45支持的音量范围为[0, 6],对应到0~36dB,6dB/step。
-
-
举例
简单例子如下:
1. ExecFunc(MI_AI_SetIfGain(E_MI_AI_IF_ADC_AB, 18, 18), MI_SUCCESS); 2. ExecFunc(MI_AI_SetIfGain(E_MI_AI_IF_ADC_CD, 18, 18), MI_SUCCESS); 3. ExecFunc(MI_AI_SetIfGain(E_MI_AI_IF_DMIC_A_01, 4, 4), MI_SUCCESS); 4. ExecFunc(MI_AI_SetIfGain(E_MI_AI_IF_DMIC_A_23, 4, 4), MI_SUCCESS);
详细例子请参考MI_AI_Open。
2.14. MI_AI_GetIfGain¶
-
功能
获取音频输入外设的音量。
-
语法
MI_S32 MI_AI_GetIfGain(MI_AI_If_e enAiIf, MI_S16 *ps16LeftIfGain, MI_S16 *ps16RightIfGain);
-
形参
参数名称 描述 输入/输出 enAiIf 音频输入外设 输入 ps16LeftIfGain 左声道音量指针 输出 ps16RightIfGain 右声道音量指针 输出 -
返回值
-
0:成功。
-
非0:失败,参照错误码。
-
-
依赖
-
头文件:mi_ai.h
-
库文件:libmi_ai.a/libmi_ai.so
-
-
注意
- 目前仅E_MI_AI_IF_ADC_AB/E_MI_AI_IF_ADC_CD/E_MI_AI_IF_DMIC_A_01/E_MI_AI_IF_DMIC_A_23/ E_MI_AI_IF_DMIC_A_45支持此设定。
-
举例
1. MI_S16 s16IfLeftGain, s16IfRightGain; 2. ExecFunc(MI_AI_GetIfGain(E_MI_AI_IF_ADC_AB, &s16IfLeftGain, &s16IfRightGain), MI_SUCCESS); 3. ExecFunc(MI_AI_GetIfGain(E_MI_AI_IF_ADC_CD, &s16IfLeftGain, &s16IfRightGain), MI_SUCCESS); 4. ExecFunc(MI_AI_GetIfGain(E_MI_AI_IF_DMIC_A_01, &s16IfLeftGain, &s16IfRightGain), MI_SUCCESS); 5. ExecFunc(MI_AI_GetIfGain(E_MI_AI_IF_DMIC_A_23, &s16IfLeftGain, &s16IfRightGain), MI_SUCCESS);
2.15. MI_AI_SetIfMute¶
-
功能
设置音频输入外设的静音参数。
-
语法
MI_S32 MI_AI_SetIfMute(MI_AI_If_e enAiIf, MI_BOOL bLeftMute, MI_BOOL bRightMute);
-
形参
参数名称 描述 输入/输出 enAiIf 音频输入外设 输入 bLeftMute 左声道静音参数 输入 bRightMute 右声道静音参数 输入 -
返回值
-
0:成功。
-
非0:失败,参照错误码。
-
-
依赖
-
头文件:mi_ai.h
-
库文件:libmi_ai.a/libmi_ai.so
-
-
注意
- 目前没有输入外设支持此设定。
-
举例
1. ExecFunc(MI_AI_SetIfMute(E_MI_AI_IF_ADC_AB, TRUE, FALSE), MI_SUCCESS); 2. ExecFunc(MI_AI_SetIfMute(E_MI_AI_IF_ADC_CD, TRUE, FALSE), MI_SUCCESS); 3. ExecFunc(MI_AI_SetIfMute(E_MI_AI_IF_DMIC_A_01, TRUE, FALSE), MI_SUCCESS); 4. ExecFunc(MI_AI_SetIfMute(E_MI_AI_IF_DMIC_A_23, TRUE, FALSE), MI_SUCCESS);
2.16. MI_AI_GetIfMute¶
-
功能
获取音频输入外设的静音参数。
-
语法
MI_S32 MI_AI_GetIfMute(MI_AI_If_e enAiIf, MI_BOOL *pbLeftMute, MI_BOOL *pbRightMute);
-
形参
参数名称 描述 输入/输出 enAiIf 音频输入外设 输入 pbLeftMute 左声道静音参数指针 输出 pbRightMute 右声道静音参数指针 输出 -
返回值
-
0:成功。
-
非0:失败,参照错误码。
-
-
依赖
-
头文件:mi_ai.h
-
库文件:libmi_ai.a/libmi_ai.so
-
-
举例
1. MI_BOOL bIfLeftMute, bIfRightMute; 2. ExecFunc(MI_AI_GetIfMute(E_MI_AI_IF_ADC_AB, &bIfLeftMute, &bIfRightMute), MI_SUCCESS); 3. ExecFunc(MI_AI_GetIfMute(E_MI_AI_IF_ADC_CD, &bIfLeftMute, &bIfRightMute), MI_SUCCESS); 4. ExecFunc(MI_AI_GetIfMute(E_MI_AI_IF_DMIC_A_01, &bIfLeftMute, &bIfRightMute), MI_SUCCESS); 5. ExecFunc(MI_AI_GetIfMute(E_MI_AI_IF_DMIC_A_23, &bIfLeftMute, &bIfRightMute), MI_SUCCESS);
2.17. MI_AI_SetI2SConfig¶
-
功能
设置I2S RX的配置信息。
-
语法
MI_S32 MI_AI_SetI2SConfig(MI_AI_If_e enAiI2SIf, const MI_AUDIO_I2sConfig_t *pstConfig);
-
形参
参数名称 描述 输入/输出 enAiI2Sif 音频I2S RX输入外设 输入 pstConfig 音频I2S RX的配置信息 输入 -
返回值
-
0:成功。
-
非0:失败,参照错误码。
-
-
依赖
-
头文件:mi_ai.h
-
库文件:libmi_ai.a/libmi_ai.so
-
-
注意
-
一组I2S RX只需要配置一次。比如使用E_MI_AI_IF_I2S_A_01配置后,I2S_A已被初始化,后面使用其他属于I2S_A的interface,无需再次对I2S_A做配置,除非I2S_A的配置参数有改变。
-
MI_AUDIO_I2sConfig_t中的enSampleRate必须和MI_AI_Attr_t中的enSampleRate一致,否则attach会报错。
-
-
举例
1. MI_AUDIO_I2sConfig_t stAiI2sACfg; 2. memset(&stAiI2sACfg, 0x0, sizeof(stAiI2sACfg)); 3. stAiI2sACfg.enMode = E_MI_AUDIO_I2S_MODE_I2S_MASTER; 4. stAiI2sACfg.enFormat = E_MI_AUDIO_I2S_FMT_I2S_MSB; 5. stAiI2sACfg.enSampleRate = E_MI_AUDIO_SAMPLE_RATE_8000; 6. stAiI2sACfg.enMclk = E_MI_AUDIO_I2S_MCLK_0; 7. stAiI2sACfg.bSyncClock = TRUE; 8. stAiI2sACfg.u32TdmSlots = 2; 9. stAiI2sACfg.enBitWidth = E_MI_AUDIO_BIT_WIDTH_16; 10. ExecFunc(MI_AI_SetI2SConfig(E_MI_AI_IF_I2S_A_01, &stAiI2sACfg), MI_SUCCESS);
2.18. MI_AI_GetI2SConfig¶
-
功能
获取I2S RX的配置信息。
-
语法
MI_S32 MI_AI_GetI2SConfig(MI_AI_If_e enAiI2SIf, MI_AUDIO_I2sConfig_t *pstConfig);
-
形参
参数名称 描述 输入/输出 enAiI2SIf 音频I2S RX输入外设 输入 pstConfig 音频I2S RX的配置信息 输出 -
返回值
-
0:成功。
-
非0:失败,参照错误码。
-
-
依赖
-
头文件:mi_ai.h
-
库文件:libmi_ai.a/libmi_ai.so
-
-
举例
1. MI_AUDIO_I2sConfig_t stAiI2sACfg; 2. memset(&stAiI2sACfg, 0x0, sizeof(stAiI2sACfg)); 3. ExecFunc(MI_AI_GetI2SConfig(E_MI_AI_IF_I2S_A_01, &stAiI2sACfg), MI_SUCCESS);
2.19. MI_AI_DupChnGroup¶
-
功能
同步音频输入通道组的状态。
-
语法
MI_S32 MI_AI_DupChnGroup(MI_AUDIO_DEV AiDevId, MI_U8 u8ChnGrpIdx)
-
形参
参数名称 描述 输入/输出 AiDevId 音频输入设备号 输入 u8ChnGrpIdx 音频输入通道组号 范围为[0, Channel Group Number - 1] Channel Group Number = (attach上的物理通道数 – attach上的Echo通道数) / Sound Mode 输入 -
返回值
-
0:成功。
-
非0:失败,参照错误码。
-
-
依赖
-
头文件:mi_ai.h
-
库文件:libmi_ai.a/libmi_ai.so
-
-
注意
- 此接口仅适用于多进程和多OS环境。进程A调用MI_AI_EnableChnGroup进行初始化后,进程B也需要使用同一个chn group资源,则需要调用MI_AI_DupChnGroup获取相应的资源。当进程B使用完该chn group资源时也需要调用MI_AI_DisableChnGroup进行该资源的释放。同理,dualos的场景也需要遵循此规则,实际上dual os就是一种特殊的多进程情况。
2.20. MI_AI_InitDev¶
-
功能
初始化音频输入设备。
-
语法
MI_S32 MI_AI_InitDev(MI_AI_InitParam_t *pstInitParam);
-
形参
参数名称 描述 输入/输出 pstInitParam 设备初始化参数 输入 -
返回值
-
0:成功。
-
非0:失败,参照错误码。
-
-
依赖
-
头文件:mi_ai.h
-
库文件:libmi_ai.a/libmi_ai.so
-
-
注意
-
本接口必须和MI_AI_DeInitDev成对使用,不可单独重复调用,否则返回失败。
-
仅用于STR状态唤醒后重新初始化AI模块。
-
2.21. MI_AI_DeInitDev¶
-
功能
反初始化音频输入设备。
-
语法
MI_S32 MI_AI_DeInitDev(void);
-
返回值
-
0:成功。
-
非0:失败,参照错误码。
-
-
依赖
-
头文件:mi_ai.h
-
库文件:libmi_ai.a/libmi_ai.so
-
-
注意
-
此函数必须在初始化设备后调用,否则返回失败。
-
如果本接口在app退出前没有调用,内部会自动反初始化设备。
-
本接口必须和MI_AI_InitDev成对使用,不可单独重复调用,否则返回失败。
-
2.22. MI_AI_GetAttr¶
-
功能
获取音频输入设备的属性。
-
语法
MI_S32 MI_AI_GetAttr(MI_AUDIO_DEV AiDevId, MI_AI_Attr_t *pstAttr);
-
形参
参数名称 描述 输入/输出 AiDevId 音频输入设备号 输入 pstAttr 音频输入设备属性 输出 -
返回值
-
0:成功。
-
非0:失败,参照错误码。
-
-
依赖
-
头文件:mi_ai.h
-
库文件:libmi_ai.a/libmi_ai.so
-
-
注意
- 此函数必须在打开设备成功后调用,否则返回失败。
3. AI 数据类型¶
AI模块相关数据类型定义如下:
数据类型 | 定义 |
---|---|
MI_AUDIO_DEV | 定义音频输入设备号 |
MI_AUDIO_Format_e | 定义音频输入设备的数据格式 |
MI_AUDIO_SoundMode_e | 定义音频输入设备的声音模式 |
MI_AUDIO_SampleRate_e | 定义音频采样率 |
MI_AI_Attr_t | 定义音频输入设备属性结构体 |
MI_AI_If_e | 定义音频输入 |
MI_AI_MAX_CHN_NUM | 定义音频输入设备支持的最大物理通道数 |
MI_AI_Data_t | 定义音频数据结构体 |
MI_AUDIO_I2sMode_e | 定义I2S RX/TX的工作模式 |
MI_AUDIO_I2sBitWidth_e | 定义I2S RX/TX的位宽 |
MI_AUDIO_I2sFormat_e | 定义I2S RX/TX的传输数据格式 |
MI_AUDIO_I2sMclk_e | 定义I2S RX/TX的mclk时钟频率 |
MI_AUDIO_I2sConfig_t | 定义I2S RX/TX的配置信息 |
MI_AI_InitParam_t | 定义音频输入设备初始化参数 |
3.1. MI_AUDIO_DEV¶
-
说明
定义音频输入/输出设备号。
-
定义
typedef MI_S32 MI_AUDIO_DEV
3.2. MI_AUDIO_Format_e¶
-
说明
定义音频数据格式。
-
定义
typedef enum { E_MI_AUDIO_FORMAT_INVALID = -1, E_MI_AUDIO_FORMAT_PCM_S16_LE = 0, } MI_AUDIO_Format_e;
-
成员
成员名称 描述 E_MI_AUDIO_FORMAT_INVALID 非法的数据格式 E_MI_AUDIO_FORMAT_PCM_S16_LE PCM Linear 16bit (Little Endian) -
相关数据类型及接口
3.3. MI_AUDIO_SoundMode_e¶
-
说明
定义音频声音模式。
-
定义
typedef enum { E_MI_AUDIO_SOUND_MODE_MONO = 1, E_MI_AUDIO_SOUND_MODE_STEREO = 2, E_MI_AUDIO_SOUND_MODE_4CH = 4, E_MI_AUDIO_SOUND_MODE_6CH = 6, E_MI_AUDIO_SOUND_MODE_8CH = 8, E_MI_AUDIO_SOUND_MODE_10CH = 10, E_MI_AUDIO_SOUND_MODE_12CH = 12, E_MI_AUDIO_SOUND_MODE_14CH = 14, E_MI_AUDIO_SOUND_MODE_16CH = 16, }MI_AUDIO_SoundMode_e
-
成员
成员名称 描述 E_MI_AUDIO_SOUND_MODE_MONO 单声道 E_MI_AUDIO_SOUND_MODE_STEREO 双声道 E_MI_AUDIO_SOUND_MODE_4CH 四声道 E_MI_AUDIO_SOUND_MODE_6CH 6声道 E_MI_AUDIO_SOUND_MODE_8CH 8声道 E_MI_AUDIO_SOUND_MODE_10CH 10声道 E_MI_AUDIO_SOUND_MODE_12CH 12声道 E_MI_AUDIO_SOUND_MODE_14CH 14声道 E_MI_AUDIO_SOUND_MODE_16CH 16声道 -
注意事项
- 在不同系列Soc上,具体支持哪些Sound Mode,以头文件为准。
-
相关数据类型及接口
3.4. MI_AUDIO_SampleRate_e¶
-
说明
定义音频采样率。
-
定义
typedef enum { E_MI_AUDIO_SAMPLE_RATE_8000 = 8000, E_MI_AUDIO_SAMPLE_RATE_11052 = 11025, E_MI_AUDIO_SAMPLE_RATE_12000 = 12000, E_MI_AUDIO_SAMPLE_RATE_16000 = 16000, E_MI_AUDIO_SAMPLE_RATE_22050 = 22050, E_MI_AUDIO_SAMPLE_RATE_24000 = 24000, E_MI_AUDIO_SAMPLE_RATE_32000 = 32000, E_MI_AUDIO_SAMPLE_RATE_44100 = 44100, E_MI_AUDIO_SAMPLE_RATE_48000 = 48000, E_MI_AUDIO_SAMPLE_RATE_96000 = 96000, E_MI_AUDIO_SAMPLE_RATE_192000 = 192000, }MI_AUDIO_SampleRate_e;
-
成员
成员名称 描述 E_MI_AUDIO_SAMPLE_RATE_8000 8kHz 采样率 E_MI_AUDIO_SAMPLE_RATE_11025 11.025kHz采样率 E_MI_AUDIO_SAMPLE_RATE_12000 12kHz采样率 E_MI_AUDIO_SAMPLE_RATE_16000 16kHz 采样率 E_MI_AUDIO_SAMPLE_RATE_22050 22.05kHz采样率 E_MI_AUDIO_SAMPLE_RATE_24000 24kHz采样率 E_MI_AUDIO_SAMPLE_RATE_32000 32kHz 采样率 E_MI_AUDIO_SAMPLE_RATE_44100 44.1kHz采样率 E_MI_AUDIO_SAMPLE_RATE_48000 48kHz 采样率 E_MI_AUDIO_SAMPLE_RATE_96000 96kHz采样率 E_MI_AUDIO_SAMPLE_RATE_192000 192kHz采样率 -
注意事项
-
除I2S RX, 其他的音频输入外设仅支持8/16/32/48kHz。
-
I2S RX可支持8/16/32/48/96/192kHz, 但使用96/192kHz只能单独attach I2S RX。
-
Muffin芯片I2S RX仅支持8/16/32/48/96 kHz。
-
-
相关数据类型及接口
3.5. MI_AI_Attr_t¶
-
说明
定义音频输入设备属性结构体。
-
定义
typedef struct MI_AUDIO_Attr_s { MI_AUDIO_Format_e enFormat; MI_AUDIO_SoundMode_e enSoundMode; MI_AUDIO_SampleRate_e enSampleRate; MI_U32 u32PeriodSize; MI_BOOL bInterleaved; }MI_AI_Attr_t;
-
成员
成员名称 描述 enFormat 音频数据格式,静态属性 enSoundMode 音频声音模式,静态属性,声音模式决定一个通道组对应多少个物理通道 enSampleRate 音频采样率, 静态属性 u32PeriodSize 音频数据的样本数,静态属性 bInterleaved 音频数据是否为交错模式,静态属性 -
相关数据类型及接口
3.6. MI_AI_If_e¶
-
说明
定义音频输入外设。
-
定义
typedef enum { E_MI_AI_IF_NONE = 0, E_MI_AI_IF_ADC_AB = 1, E_MI_AI_IF_ADC_CD = 2, E_MI_AI_IF_DMIC_A_01 = 3, E_MI_AI_IF_DMIC_A_23 = 4, E_MI_AI_IF_I2S_A_01 = 5, E_MI_AI_IF_I2S_A_23 = 6, E_MI_AI_IF_I2S_A_45 = 7, E_MI_AI_IF_I2S_A_67 = 8, E_MI_AI_IF_I2S_A_89 = 9, E_MI_AI_IF_I2S_A_ab = 10, E_MI_AI_IF_I2S_A_cd = 11, E_MI_AI_IF_I2S_A_ef = 12, E_MI_AI_IF_I2S_B_01 = 13, E_MI_AI_IF_I2S_B_23 = 14, E_MI_AI_IF_I2S_B_45 = 15, E_MI_AI_IF_I2S_B_67 = 16, E_MI_AI_IF_I2S_B_89 = 17, E_MI_AI_IF_I2S_B_ab = 18, E_MI_AI_IF_I2S_B_cd = 19, E_MI_AI_IF_I2S_B_ef = 20, E_MI_AI_IF_I2S_C_01 = 21, E_MI_AI_IF_I2S_C_23 = 22, E_MI_AI_IF_I2S_C_45 = 23, E_MI_AI_IF_I2S_C_67 = 24, E_MI_AI_IF_I2S_C_89 = 25, E_MI_AI_IF_I2S_C_ab = 26, E_MI_AI_IF_I2S_C_cd = 27, E_MI_AI_IF_I2S_C_ef = 28, E_MI_AI_IF_I2S_D_01 = 29, E_MI_AI_IF_I2S_D_23 = 30, E_MI_AI_IF_I2S_D_45 = 31, E_MI_AI_IF_I2S_D_67 = 32, E_MI_AI_IF_I2S_D_89 = 33, E_MI_AI_IF_I2S_D_ab = 34, E_MI_AI_IF_I2S_D_cd = 35, E_MI_AI_IF_I2S_D_ef = 36, E_MI_AI_IF_ECHO_A = 37, E_MI_AI_IF_HDMI_A = 38, E_MI_AI_IF_DMIC_A_45 = 39, E_MI_AI_IF_MAX, } MI_AI_If_e;
-
成员
成员名称 描述 E_MI_AI_IF_NONE None E_MI_AI_IF_ADC_AB ADC0/ 1 E_MI_AI_IF_ADC_CD ADC2/ 3 E_MI_AI_IF_DMIC_A_01 DMIC Chn0和Chn1 E_MI_AI_IF_DMIC_A_23 DMIC Chn2和Chn3 E_MI_AI_IF_I2S_A_01 I2S RX A的Chn0和Chn1 E_MI_AI_IF_I2S_A_23 I2S RX A的Chn2和Chn3 E_MI_AI_IF_I2S_A_45 I2S RX A的Chn4和Chn5 E_MI_AI_IF_I2S_A_67 I2S RX A的Chn6和Chn7 E_MI_AI_IF_I2S_A_89 I2S RX A的Chn8和Chn9 E_MI_AI_IF_I2S_A_ab I2S RX A的Chn10和Chn11 E_MI_AI_IF_I2S_A_cd I2S RX A的Chn12和Chn13 E_MI_AI_IF_I2S_A_ef I2S RX A的Chn14和Chn15 E_MI_AI_IF_I2S_B_01 I2S RX B的Chn0和Chn1 E_MI_AI_IF_I2S_B_23 I2S RX B的Chn2和Chn3 E_MI_AI_IF_I2S_B_45 I2S RX B的Chn4和Chn5 E_MI_AI_IF_I2S_B_67 I2S RX B的Chn6和Chn7 E_MI_AI_IF_I2S_B_89 I2S RX B的Chn8和Chn9 E_MI_AI_IF_I2S_B_ab I2S RX B的Chn10和Chn11 E_MI_AI_IF_I2S_B_cd I2S RX B的Chn12和Chn13 E_MI_AI_IF_I2S_B_ef I2S RX B的Chn14和Chn15 E_MI_AI_IF_I2S_C_01 I2S RX C的Chn0和Chn1 E_MI_AI_IF_I2S_C_23 I2S RX C的Chn2和Chn3 E_MI_AI_IF_I2S_C_45 I2S RX C的Chn4和Chn5 E_MI_AI_IF_I2S_C_67 I2S RX C的Chn6和Chn7 E_MI_AI_IF_I2S_C_89 I2S RX C的Chn8和Chn9 E_MI_AI_IF_I2S_C_ab I2S RX C的Chn10和Chn11 E_MI_AI_IF_I2S_C_cd I2S RX C的Chn12和Chn13 E_MI_AI_IF_I2S_C_ef I2S RX C的Chn14和Chn15 E_MI_AI_IF_I2S_D_01 I2S RX D的Chn0和Chn1 E_MI_AI_IF_I2S_D_23 I2S RX D的Chn2和Chn3 E_MI_AI_IF_I2S_D_45 I2S RX D的Chn4和Chn5 E_MI_AI_IF_I2S_D_67 I2S RX D的Chn6和Chn7 E_MI_AI_IF_I2S_D_89 I2S RX D的Chn8和Chn9 E_MI_AI_IF_I2S_D_ab I2S RX D的Chn10和Chn11 E_MI_AI_IF_I2S_D_cd I2S RX D的Chn12和Chn13 E_MI_AI_IF_I2S_D_ef I2S RX D的Chn14和Chn15 E_MI_AI_IF_ECHO_A SRC数据(回声) E_MI_AI_IF_HDMI_A HDMI RX E_MI_AI_IF_DMIC_A_45 (部分支持)DMIC Chn4和Chn5 -
相关数据类型及接口
3.7. MI_AI_MAX_CHN_NUM¶
-
说明
定义音频输入设备支持的最大物理通道数。
-
定义
#define MI_AI_MAX_CHN_NUM 16
-
注意事项
- 在不同系列Soc上,该宏MI_AI_MAX_CHN_NUM定义会有区别,以头文件为准。
3.8. MI_AI_Data_t¶
-
说明
定义音频结构体。
-
定义
typedef struct MI_AI_Data_s { void *apvBuffer[MI_AI_MAX_CHN_NUM]; MI_U32 u32Bytes[MI_AI_MAX_CHN_NUM]; MI_U64 u64Pts; MI_U64 u64Seq; }MI_AI_Data_t;
-
成员
成员名称 描述 apvBuffer 音频数据地址,若音频输入设备使能交错模式,则数据保存在apvBuffer[0]中。若音频输入设备未使能交错模式,则数据按顺序排列在apvBuffer中 u32Bytes 音频数据长度,与apvBuffer一一对应 u64Pts 音频数据时间戳, 单位us u64Seq 音频数据序号 -
相关数据类型及接口
3.9. MI_AUDIO_I2sMode_e¶
-
说明
定义音频I2S RX/TX的工作模式。
-
定义
typedef enum { E_MI_AUDIO_I2S_MODE_I2S_MASTER, E_MI_AUDIO_I2S_MODE_I2S_SLAVE, E_MI_AUDIO_I2S_MODE_TDM_MASTER, E_MI_AUDIO_I2S_MODE_TDM_SLAVE, } MI_AUDIO_I2sMode_e;
-
成员
成员名称 描述 E_MI_AUDIO_I2S_MODE_I2S_MASTER I2S主模式 E_MI_AUDIO_I2S_MODE_I2S_SLAVE I2S从模式 E_MI_AUDIO_I2S_MODE_TDM_MASTER TDM主模式 E_MI_AUDIO_I2S_MODE_TDM_SLAVE TDM从模式 -
注意事项
- 主模式与从模式是否支持会依据不同的芯片而有区别。
-
相关数据类型及接口
3.10. MI_AUDIO_I2sBitWidth_e¶
-
说明
定义音频I2S RX/TX的位宽。
-
定义
typedef enum { E_MI_AUDIO_BIT_WIDTH_16, E_MI_AUDIO_BIT_WIDTH_32, } MI_AUDIO_I2sBitWidth_e;
-
成员
成员名称 描述 E_MI_AUDIO_BIT_WIDTH_16 I2S位宽为16bit E_MI_AUDIO_BIT_WIDTH_32 I2S位宽为32bit -
注意事项
- 目前I2S支持32bit的时序接收数据,当I2S配置为32bit时,即高位有效且数据排列要保证在1,3,5,7...上。
-
相关数据类型及接口
3.11. MI_AUDIO_I2sFormat_e¶
-
说明
定义音频I2S RX/TX的数据传输格式。
-
定义
typedef enum { E_MI_AUDIO_I2S_FMT_I2S_MSB, E_MI_AUDIO_I2S_FMT_LEFT_JUSTIFY_MSB, } MI_AUDIO_I2sFormat_e;
-
成员
成员名称 描述 E_MI_AUDIO_I2S_FMT_I2S_MSB I2S 标准格式,最高位优先 E_MI_AUDIO_I2S_FMT_LEFT_JUSTIFY_MSB I2S 左对齐格式,最高位优先 -
相关数据类型及接口
3.12. MI_AUDIO_I2sMclk_e¶
-
说明
定义音频I2S RX/TX的mclk时钟频率。
-
定义
typedef enum { E_MI_AUDIO_I2S_MCLK_0, E_MI_AUDIO_I2S_MCLK_12_288M, E_MI_AUDIO_I2S_MCLK_16_384M, E_MI_AUDIO_I2S_MCLK_18_432M, E_MI_AUDIO_I2S_MCLK_24_576M, E_MI_AUDIO_I2S_MCLK_24M, E_MI_AUDIO_I2S_MCLK_48M, E_MI_AUDIO_I2S_MCLK_22_5792M, E_MI_AUDIO_I2S_MCLK_32_768M, E_MI_AUDIO_I2S_MCLK_36_864M, E_MI_AUDIO_I2S_MCLK_49_152M, E_MI_AUDIO_I2S_MCLK_76_8M, } MI_AUDIO_I2sMclk_e;
-
成员
成员名称 描述 E_MI_AUDIO_I2S_MCLK_0 关闭MCLK E_MI_AUDIO_I2S_MCLK_12_288M 设置MCLK为12.88M E_MI_AUDIO_I2S_MCLK_16_384M 设置MCLK为16.384M E_MI_AUDIO_I2S_MCLK_18_432M 设置MCLK为18.432M E_MI_AUDIO_I2S_MCLK_24_576M 设置MCLK为24.576M E_MI_AUDIO_I2S_MCLK_24M 设置MCLK为24M E_MI_AUDIO_I2S_MCLK_48M 设置MCLK为48M E_MI_AUDIO_I2S_MCLK_22_5792M 设置MCLK为22.5792M E_MI_AUDIO_I2S_MCLK_32_768M 设置MCLK为32.768M E_MI_AUDIO_I2S_MCLK_36_864M 设置MCLK为36.864M E_MI_AUDIO_I2S_MCLK_49_152M 设置MCLK为49.152M E_MI_AUDIO_I2S_MCLK_76_8M 设置MCLK为76.8M -
注意事项
- 在不同系列Soc上,具体支持哪些Mclk,以头文件为准。
-
相关数据类型及接口
3.13. MI_AUDIO_I2sConfig_t¶
-
说明
定义I2S RX/TX的配置信息。
-
定义
typedef struct MI_AUDIO_I2sConfig_s { MI_AUDIO_I2sMode_e enMode; MI_AUDIO_I2sBitWidth_e enBitWidth; MI_AUDIO_I2sFormat_e enFormat; MI_AUDIO_SampleRate_e enSampleRate; MI_AUDIO_I2sMclk_e enMclk; MI_BOOL bSyncClock; MI_U32 u32TdmSlots; } MI_AUDIO_I2sConfig_t;
-
成员
成员名称 描述 enMode I2S的工作模式 enBitWidth I2S的数据位宽 enFormat I2S的传输数据格式 enSampleRate I2S的采样率 enMclk I2S的mclk时钟频率 bSyncClock I2S RX和I2S TX是否共用时钟 u32TdmSlots I2S TDM slot的数目(仅TDM模式下有效) -
注意事项
Souffle系列芯片支持1Chn PCM,使用该功能时enMode必须工作在E_MI_AUDIO_I2S_MODE_TDM_MASTER、E_MI_AUDIO_I2S_MODE_TDM_SLAVE模式下,且u32TdmSlots设定为1。
-
相关数据类型及接口
3.14. MI_AI_InitParam_t¶
-
说明
音频输入设备初始化参数。
-
定义
typedef struct MI_AI_InitParam_s { MI_AUDIO_DEV AiDevId; MI_U8 *u8Data; } MI_AI_InitParam_t;
-
成员
成员名称 描述 AiDevId 音频输入设备号 u8Data 参数指针(保留) -
相关数据类型及接口
4. 错误码¶
AI API 错误码如下表所示:
错误码 | 宏定义 | 描述 |
---|---|---|
0xA0042001 | MI_AI_ERR_INVALID_DEVID | 音频输入设备号无效 |
0xA0042002 | MI_AI_ERR_INVALID_CHNGRPID | 音频输入通道组号无效 |
0xA0042003 | MI_AI_ERR_ILLEGAL_PARAM | 音频输入参数设置无效 |
0xA0042006 | MI_AI_ERR_NULL_PTR | 输入参数空指标错误 |
0xA0042007 | MI_AI_ERR_NOT_CONFIG | 音频输入设备属性未设置 |
0xA0042008 | MI_AI_ERR_NOT_SUPPORT | 操作不支持 |
0xA0042009 | MI_AI_ERR_NOT_PERM | 操作不允许 |
0xA004200C | MI_AI_ERR_NOMEM | 分配内存失败或相应的数据队列已满 |
0xA004200D | MI_AI_ERR_NOBUF | 音频输入缓存不足 |
0xA004200E | MI_AI_ERR_BUF_EMPTY | 音频输入缓存为空 |
0xA004200F | MI_AI_ERR_BUF_FULL | 音频输入缓存为满 |
0xA0042010 | MI_AI_ERR_SYS_NOTREADY | 音频输入系统未初始化 |
0xA0042012 | MI_AI_ERR_BUSY | 音频输入系统忙碌 |
0xA0042017 | MI_AI_ERR_NOT_ENABLED | 音频输入设备或通道没有使能 |
5. PROCFS及DEBUG功能介绍¶
5.1. Cat¶
-
调试信息
# cat proc/mi_modules/mi_ai/mi_ai0
-
调试信息分析
记录当前AI的使用状况以及device属性、channel group属性,可以动态地获取到这些信息,方便调试和测试。
-
参数说明
参数 描述 AI Device Attr DevStatus AI设备状态
uninit:未初始化
opened:open成功Format 音频格式(位宽及大小端等)
目前仅支持S16_LE(16bit,小端模式)SoundMode 声音模式
mono: 单声道
stereo: 立体声
SOUND_MODE_4CH: 4channel
SOUND_MODE_6CH: 6channel
SOUND_MODE_8CH: 8channel
...
SOUND_MODE_16CH: 16channelSampleRate 采样率 8k/16k/32k/48k Interleaved 是否为交错模式 PeriodSize AI每帧数据量 PeriodToUs (部分支持)APP取一帧数据对应时间Us Interrupt (部分支持)中断类型,hw-timer/wdma-irq TriggerSize (部分支持)配置DMA的trigger size,64bytes对齐;当中断为hw-timer时,该参数无效 IrqTriggerUs (部分支持)中断类型为hw-timer/wdma-irq,理论中断trigger时间Us CurIrqTriggerUs (部分支持)中断类型为hw-timer/wdma-irq,当前实际中断trigger时间Us TriggerIsrCnt (部分支持)中断类型为hw-timer/wdma-irq,累计中断trigger次数 XrunIsrCnt (部分支持)发生Xrun中断的次数 DmaBufSize DMA buffer的大小 DmaBusySize DMA buffer已使用的大小 DmaFreeSize DMA buffer未使用的大小 TmpBufSize TMP buffer的大小(Not heap alloc) MhalChnCnt mhal设备的通道数 MiChnGrpCnt MI channel group数 ReadCountFromMhal AI从mhal读取的帧数 If slot[IfIdx]: interface type [IfIdx]: Interface 索引
interface type: Interface类型[interface type]:
Gain(Leftgain,RightGain)
Mute(LeftMute,RightMute)[interface type]: Interface类型
Gain(Leftgain,RightGain): 左声道增益,右声道增益
Mute(LeftMute,RightMute): 左声道静音,右声道静音AI I2S Status (AI I2S信息) I2sMode I2S Rx的工作模式(仅interface为I2S Rx时有效)
i2s-master
i2s-slave
tdm-master
tdm-slaveI2sMclk I2S Rx的Mclk的频率(仅interface为I2S Rx时有效)
disable: 不使用Mclk
其他值为当前的Mclk频率I2sFmt I2S Rx的数据格式(仅interface为I2S Rx时有效)
I2S-MSB: I2S格式
LEFT-MSB: I2S左对齐格式bI2sSync I2S RX和TX是否共用clock(仅interface为I2S Rx时有效)
1: 4 wire mode,RX和TX共用clock
0: 6 wire mode,RX和TX都有独立的clockTdmSlots I2S Rx的TDM slot数目(仅interface为I2S Rx为TDM模式时有效) I2sBitWidth I2S RX的位宽(仅interface为I2S Rx,且需要支持TDM模式的芯片有效) AI ChnGrp info (AI 通道信息) ChnGrpId MI channel group ID bEnable 是否使能 ReadFrameCount 对应channel group读取的帧数 OutputPortBufSize (部分支持)对应channel group通过sys申请的OutputPortBuf size Mute Status DPGA Mute信息 Mute[PhyChnIdx]:bMute [PhyChnIdx]:channel group中的channel索引
bMute:静音状态Dpga Gain DPGA 增益信息 Dpga Gain[PhyChnIdx]:Gain [PhyChnIdx]: channel group中的channel索引
Gain:增益
5.2. Echo¶
功能 | 动态启用/关闭AI设备dump mhal pcm数据 |
---|---|
命令 | echo dump_mhal_chn [Path] [ON/on/1, OFF/off/0] > /proc/mi_modules/mi_ai/mi_ai[ID] |
参数说明 | [Path] dump文件保存的路径 [ON/on/1, OFF/off/0] 是否使能 [ID] AI设备号 |
举例 | echo dump_mhal_chn /tmp 1 > /proc/mi_modules/mi_ai/mi_ai0 |
功能 | 动态启用/关闭AI设备dump mi pcm数据 |
---|---|
命令 | echo dump_mi_chn [ChnGrpId] [Path] [ON/on/1, OFF/off/0] > /proc/mi_modules/mi_ai/mi_ai[ID] |
参数说明 | [ChnGrpId] channel group ID [Path] dump文件保存的路径 [ON/on/1, OFF/off/0] 是否使能 [ID] AI设备号 |
举例 | echo dump_mi_chn 0 /tmp 1 > /proc/mi_modules/mi_ai/mi_ai0 |
功能 | 动态设定AI DPGA的增益 |
---|---|
命令 | echo set_dpga_gain [ChnGrpId] [ChnId] [Gain] > /proc/mi_modules/mi_ai/mi_ai[ID] |
参数说明 | [ChnGrpId] channel group ID [ChnId] channel group中的channel索引 [Gain] AI数字增益 |
举例 | echo set_dpga_gain 0 0 -10 > /proc/mi_modules/mi_ai/mi_ai0 |
功能 | 动态设定AI Interface的增益 |
---|---|
命令 | echo set_inf_gain [If] [LeftGain] [RightGain] > /proc/mi_modules/mi_ai/mi_ai[ID] |
参数说明 | [If] AI Interface [LeftGain] [RightGain] 左声道增益,右声道增益 |
举例 | echo set_inf_gain 1 18 18 > /proc/mi_modules/mi_ai/mi_ai0 |
功能 | 动态设定AI DPGA静音模式 |
---|---|
命令 | echo set_dpga_mute [ChnGrpId] [ChnId] [Mute] > /proc/mi_modules/mi_ai/mi_ai[ID] |
参数说明 | [ChnGrpId] channel group ID [ChnID] channel group中的channel索引 [Mute] AI DPGA静音 |
举例 | echo set_dpga_mute 0 0 1 > /proc/mi_modules/mi_ai/mi_ai0 |
功能 | 动态设定AI Interface静音模式 |
---|---|
命令 | echo set_inf_mute [If] [LeftMute] [RightMute] > /proc/mi_modules/mi_ai/mi_ai[ID] |
参数说明 | [If] AI Interface [LeftMute] [RightMute] 左声道静音,右声道静音 |
举例 | echo set_inf_mute 1 0 1 > /proc/mi_modules/mi_ai/mi_ai0 |
功能 | 动态开启/关闭AI设备的Singen功能 |
---|---|
命令 | echo singen [SinGen Index] [Enable] > /proc/mi_modules/mi_ai/mi_ai[ID] |
参数说明 | [SinGen Index] 需要控制的Singen ID [Enable] 开启/关闭Singen功能 |
举例 | echo singen 0 1 > /proc/mi_modules/mi_ai/mi_ai0 |
各系列芯片interface singen支持情况如下表:
interface singen | Muffin | Mochi | Maruko | Souffle | Ifado |
---|---|---|---|---|---|
DMIC_A | Y | Y | Y | Y | Y |
ADC_AB | N | N | Y | Y | Y |
ADC_CD | N | N | Y | Y | Y |
I2S_RX_A | N | N | N | Y | Y |
5.3. MI User层Debug¶
功能 | 在运行APP前,通过export指定环境变量,dump MI user层AI录音数据和Echo数据 |
---|---|
说明 | [MI_AI_DUMP_ENABLE] dump MI user层AI录音和Echo数据使能 [MI_AI_DUMP_PATH] 指定dump数据的路径 |
举例 | export MI_AI_DUMP_ENABLE=1 export MI_AI_DUMP_PATH=/mnt |
6. Insmod参数及MODPARAM.json介绍¶
6.1. 参数名、支持平台及使用方式¶
参数名 | 使用insmod参数的平台 | 使用MODPARAM.json的平台 | 默认值 | 是否支持客户配置 | 作用 |
---|---|---|---|---|---|
ThreadPriority | Muffin/Mochi/Ifado | Maruko/Souffle | 98 | Y | ai线程优先级 |
DmaBufferSize | Muffin/Mochi/Ifado | Maruko/Souffle | (通过参数计算得出) | Y | 调整AI DMA Buffer大小 |
bUsedDmaInterrupt | NA | Souffle | 1 | Y | 中断源选择:hw-timer/wdma-irq(默认使用wdma-irq) |
6.2. Insmod参数用法举例¶
修改举例:
insmod mi_ai.ko ThreadPriority=99 insmod mi_ai.ko DmaBufferSize=32 # 单位K,必须是4K对齐
6.3. MODPARAM.json参数用法举例¶
修改举例 vim /config/modparam.json:
{ "E_MI_MODULE_ID_AI" : { "ThreadPriority" : 99, "DmaBufferSize" : 32, // 单位K,必须是4K对齐 "bUsedDmaInterrupt" : 0 } }