MI AO 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 | ||
02/05/2024 | ||
3.56 | 04/15/2024 | |
3.57 | 07/26/2024 |
1. 概述¶
1.1. 模块说明¶
音频输出(Audio Output, AO)主要实现配置及启用音频输出设备、写入音频数据、以及音量设置等功能。
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
HDMI(High Definition Multimedia Interface,高清多媒体接口),AO输出接口,是一种全数字化视频和声音发送接口,可以发送未压缩的音频及视频信号。
-
Mixer
Mixer,硬件混音,使用线性叠加平均的算法(如果某一路音频的音量特别小,整个混音结果音量会被拉低),混音后可设置输出的采样率。
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系列芯片的audio codec拥有如下资源:WDMA * 3, RDMA * 2, DMIC接口(可支持4Chn DMIC信号) * 1, ADC(可支持2Chn Amic/Linein) * 2, I2S-TDM RX(16 slot) * 1, DAC(可支持2Chn Lineout) * 2, SRC * 1, HDMI TX * 1。
Mochi系列芯片I2S支持最大16slot,采样率新增支持96K/192K。注意:在I2S的使用场景中,I2S BCK最大不能超过30MHz(如:BCK=16bit * 16slots * 192K=49.152M 或者 BCK=32bit * 16slots * 192K=98.304M,BCK > 30MHz的使用情况不支持)。
支持两个AO设备混音,在Audio Codec框图中用Mixer表示。混音后可设置输出采样率到8K/16K/32K/48K。
注:Mochi系列芯片Audio Codec框图中ADC_AB_PRE表示未经过DPGA前的音频信号,如图1-2。
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系列¶
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 (音频输出设备)
AO的Device指的是audio codec的RDMA。Device是audio3.0对audio codec中DMA的抽象,audio codec中的RDMA和AO Device为一一对应的关系。如AO Device0对应audio codec中的RDMA1,AO Device1对应audio codec中的RDMA2,以此类推。audio3.0的数据流均以DMA为中心进行串接。
audio3.0中还包括另一类Device,即AI设备不经过DMA,直接将数据流送至AO设备,如(Amic→Lineout)。这一类device称为直通通路Device,即Passthrough,目前仅支持MI_AUDIO_PASSTHROUGH_DEV_1。
-
Interface (音频输出外设)
AO的Interface指的是audio codec的音频输出外设接口的抽象,如Speaker/I2S Codec/HDMI等接口。
-
Attach
AO的attach指的是将Interface挂载到RDMA上。对于AO Device而言,Attach是将RDMA的输出信号连接到具体的Interface,使外设输出音频信号。AO Device支持动态Attach。
当同一个AO Interface被Attach到两个AO Device时,AO Interface的输出为两个AO Device输出混音后的结果(Mochi系列支持)。
当使用场景中包含Passthrough时,需要先要attach AI,再attach AO,否则将不能正常使用。
下图是将I2S TX和DAC0/1 Attach到RDMA1的结果,从RDMA1输出的信号经过DPGA做增益调节后,分成3个支路分别到达DAC0、DAC1和I2S TX。Ao Device的Attach就是在设定这些支路的流向。
-
Detach
AO的detach指的是将Interface和RDMA的连接断开。
-
Echo (回声)
AO的Echo指的是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 (声音模式)
AO的Sound Mode指的是音频的声道数,如单声道、立体声。
-
Channel Mode (声道输出模式)
支持静态设置和动态设置Channel Mode,Muffin系列芯片不支持动态Channel Mode设定。
AO的Channel Mode指代的是RDMA通道的输出模式。对于AO Device而言,Channel Mode决定了音频数据的声道和Interface输出左右声道的对应关系。下面结合图示来说明Channel Mode的作用。
-
E_MI_AO_CHANNEL_MODE_STEREO
正常的立体声模式。
-
E_MI_AO_CHANNEL_MODE_DOUBLE_MONO
Double Mono单声道,左右两个声道输出为同样的单声道数据。
Double Mono立体声,左右两个声道输出为左右声道混音后的数据,左右声道输出相同(Muffin系列不支持)。
-
E_MI_AO_CHANNEL_MODE_DOUBLE_LEFT
Double Left立体声,左右两个声道输出为左声道数据(Muffin系列不支持)。
-
E_MI_AO_CHANNEL_MODE_DOUBLE_RIGHT
Double Right立体声,左右两个声道输出为右声道数据(Muffin系列不支持)。
-
E_MI_AO_CHANNEL_MODE_EXCHANGE
Exchange立体声,左右两个声道输出为左右声道互换数据。
-
E_MI_AO_CHANNEL_MODE_ONLY_LEFT
Only Left单声道,只有左声道输出为单声道数据。
Only Left立体声,只有左声道输出为立体声数据。
-
E_MI_AO_CHANNEL_MODE_ONLY_RIGHT
Only Right单声道,只有右声道输出为单声道数据。
Only Right立体声,只有右声道输出为立体声数据。
-
-
Gain
AO的Gain在audio3.0架构上分成两类,一类是与Device相关联的DPGA Gain,即audio codec框图中的DPGA,另一类则是Interface所独有的Gain,即audio codec框图中的IF Gain(也由DPGA实现,仅Interface独有),具体是否支持见框图。
-
Format
Format,即用什么数据形式来表示一个音频采样样本,目前仅支持S16_LE格式(PCM Linear 16bit (Little Endian))。
-
Sample Rate
Sample Rate,即播放采样率。
-
Period Size
对于AO Device而言,Period Size表示AO Device默认的起播条件(缓存中的样本数大于Period Size,才会起播)。
-
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/8/16slot (Mochi系列和Souffle系列支持16slot),但I2S TX的有效数据为2slot,当对I2S TX设置大于2的slot个数时,除了slot0和slot1,其他的均为无效数据。
-
-
PCM
标准I2S(2Chn)协议属于PCM协议里最常用的一种。PCM可以传输多通道数据,如4channel,8channel,16channel等,也就是TDM协议(区别于标准I2S(2chn)协议的特定的格式)。一般用于传输单声道数据也常称为PCM(除过常用的标准I2S、TDM外,其他统称为PCM)。 Sigmastar Audio除过标准I2S(2chn)的设定,其他Timing 包括1Chn PCM的相关设定统一放到TDM的参数中设定。
-
Passthrough (直通通道)
Passthrough指的是不经DMA直接将数据流从AI设备传送到AO设备的通道。以ADC_AB→DAC_AB为例,如下图1-3 红色标注的通路:
图1-3:Mochi系列芯片直通通路示意图
Muffin系列芯片仅支持输入设备为ADC_AB到输出设备为DAC_AB的Passthrough。
Mochi系列芯片支持输入设备为ADC_AB/DMIC_A_01/ DMIC_A_23/I2S_A_01/…/ I2S_A_EF到输出设备为DAC_AB/I2S_TX/ HDMI的任意组合Passthrough。Mochi系列芯片目前Passthrough的限制为:仅支持采样率48K; Passthrough Device暂不支持Channel Mode设定; Passthrough + DMA混音场景时,输出设备仅支持DAC_AB。
2. API参考¶
音频输出(AO)主要用于启用音频输出设备、发送音频帧到输出通道等。
API名 | 功能 |
---|---|
MI_AO_Open | 打开音频输出设备 |
MI_AO_OpenWithCfgFile | 打开音频输出设备,并按配置文件初始化 |
MI_AO_Close | 关闭音频输出设备 |
MI_AO_AttachIf | 挂载外设到音频输出设备 |
MI_AO_DetachIf | 卸载外设与音频输出设备的连接 |
MI_AO_Write | 写入音频数据 |
MI_AO_Start | 启动音频输出设备,立刻进行播放 |
MI_AO_Stop | 停止音频输出设备,立刻停止播放 |
MI_AO_Pause | 暂停音频输出设备 |
MI_AO_Resume | 回复音频输出设备 |
MI_AO_SetVolume | 设置音频输出设备的音量 |
MI_AO_GetVolume | 获取音频输出设备的音量 |
MI_AO_SetMute | 设置音频输出设备的静音参数 |
MI_AO_GetMute | 获取音频输出设备的静音参数 |
MI_AO_SetIfVolume | 设置音频输出外设的音量 |
MI_AO_GetIfVolume | 获取音频输出外设的音量 |
MI_AO_SetIfMute | 设置音频输出外设的静音参数 |
MI_AO_GetIfMute | 获取音频输出外设的静音参数 |
MI_AO_SetI2SConfig | 设置I2S TX的配置参数 |
MI_AO_GetI2SConfig | 获取I2S TX的配置参数 |
MI_AO_AdjustSpeed | 调整音频输出设备的播放速度 |
MI_AO_GetTimestamp | 获取音频输出设备当前播放时间戳和缓存数据量 |
MI_AO_GetLatency | 获取音频输出设备的延迟 |
MI_AO_InitDev | 初始化音频输出设备 |
MI_AO_DeinitDev | 反初始化音频输出设备 |
MI_AO_GetAttr | 获取音频输出设备属性 |
MI_AO_SetChannelMode | 动态设置声道输出模式(Muffin系列不支持) |
MI_AO_Dup | 同步音频输出设备状态 |
2.1. MI_AO_Open¶
-
功能
打开音频输出设备。
-
语法
MI_S32 MI_AO_Open(MI_AUDIO_DEV AoDevId, const MI_AO_Attr_t *pstAttr);
-
形参
参数名称 描述 输入/输出 AoDevId 音频输出设备号 输入 pstAttr 音频输出设备属性指针 输入 -
返回值
-
0:成功。
-
非0:失败,参照错误码。
-
-
依赖
-
头文件: mi_ao.h
-
库文件: libmi_ao.a/libmi_ao.so
-
-
注意
音频输出设备属性包括数据格式、声音模式、采样率、起播条件的样本数、声道输出模式。
-
音频数据格式(MI_AUDIO_Format_e)
音频数据格式指采样样本的数据格式。目前仅支持S16_LE。
-
音频声音模式(MI_AUDIO_SoundMode_e)
音频声音模式指待播放数据的声道数,单声道/立体声。
-
音频采样率(MI_AUDIO_SampleRate_e)
音频采样率指一秒内的采样次数,采样率越高表明失真度越小,处理的数据量也就随之增加。一般来说语音使用8k 采样率,音频使用32k或以上的采样率。
-
起播条件的样本数(u32PeriodSize)
起播条件即数据缓存满足此样本数才会开始播放。此参数设定后,建议应用按此大小来写入音频数据。当起播条件的样本数为0时,APP需要主动调用MI_AO_Start来启动播放。
-
声道输出模式(MI_AO_ChannelMode_e)
声道输出模式决定了音频数据在音频设备的输出模式。
-
Maruko系列芯片I2S TX的行为不受MI_AO_ChannelMode_e参数的影响。
-
只有调用MI_AO_Open和MI_AO_AttachIf后,或调用MI_AO_OpenWitCfgFile后,才能通过MI_SYS_QureyDevChnPortState获取到AO Device的Enable状态。
-
-
举例
简单例子如下:
1. MI_AO_Attr_t stAoSetAttr; 2. memset(&stAoSetAttr, 0x0, sizeof(MI_AO_Attr_t)); 3. stAoSetAttr.enFormat = E_MI_AUDIO_FORMAT_PCM_S16_LE; 4. stAoSetAttr.enSoundMode = E_MI_AUDIO_SOUND_MODE_MONO; 5. stAoSetAttr.enSampleRate = E_MI_AUDIO_SAMPLE_RATE_8000; 6. stAoSetAttr.u32PeriodSize = 1024; 7. stAoSetAttr.enChannelMode = E_MI_AO_CHANNEL_MODE_DOUBLE_MONO; 8. ExecFunc(MI_AO_Open(AoDevId, &stAoSetAttr), MI_SUCCESS);
详细例子如下:
1. MI_AUDIO_DEV AoDevId = 0; 2. MI_AO_Attr_t stAoSetAttr, stAoGetAttr; 3. MI_S16 s16LeftVolume, s16RightVolume; 4. MI_AO_GainFading_e eGainFading; 5. 6. memset(&stAoSetAttr, 0x0, sizeof(MI_AO_Attr_t)); 7. 8. // 设置AO Device的Format为S16_LE 9. stAoSetAttr.enFormat = E_MI_AUDIO_FORMAT_PCM_S16_LE; 10. 11. // 设置AO Device的Sound Mode为Mono 12. stAoSetAttr.enSoundMode = E_MI_AUDIO_SOUND_MODE_MONO; 13. 14. // 设置AO Device的采样率为8KHz 15. stAoSetAttr.enSampleRate = E_MI_AUDIO_SAMPLE_RATE_8000; 16. 17. // 设置AO Device的起播条件为1024个采样样本 18. stAoSetAttr.u32PeriodSize = 1024; 19. 20. // 设置AO Device的Channel Mode为Double Mono 21. stAoSetAttr.enChannelMode = E_MI_AO_CHANNEL_MODE_DOUBLE_MONO; 22. 23. // 打开AO Device 24. ExecFunc(MI_AO_Open(AoDevId, &stAoSetAttr), MI_SUCCESS); 25. 26. // 获取AO Device属性 27. ExecFunc(MI_AO_GetAttr(AoDevId, &stAoGetAttr), MI_SUCCESS); 28. 29. // 将DAC_AB attach到AO Device 30. ExecFunc(MI_AO_AttachIf(AoDevId, E_MI_AO_IF_DAC_AB, 0), MI_SUCCESS); 31. 32. // 动态设置音频通道模式为Only Left 33. ExecFunc(MI_AO_SetChannelMode(AoDevId, E_MI_AO_CHANNEL_MODE_ONLY_LEFT), MI_SUCCESS); 34. 35. // 设置Dpga Gain 36. s16LeftVolume = 0; 37. s16RightVolume = 0; 38. eGainFading = E_MI_AO_GAIN_FADING_OFF; 39. ExecFunc(MI_AO_SetVolume(AoDevId, s16LeftVolume, s16RightVolume, eGainFading), MI_SUCCESS); 40. 41. // 往AO Device写数据 42. MI_AO_Write(AoDevId, u8TempBuf, s32ReadSize, 0, -1); 43. 44. // detach DAC_AB 45. ExecFunc(MI_AO_DetachIf(AoDevId, E_MI_AO_IF_DAC_AB), MI_SUCCESS); 46. 47. // 关闭AO Device 48. ExecFunc(MI_AO_Close(MI_AO_DEV_1), MI_SUCCESS);
2.2. MI_AO_OpenWithCfgFile¶
-
功能
打开音频输出设备,并按配置文件初始化。
-
语法
MI_S32 MI_AO_OpenWithCfgFiile(MI_AUDIO_DEV AoDevId, const char *pCfgPath);
-
形参
参数名称 描述 输入/输出 AoDevId 音频输出设备号 输入 pCfgPath 配置文件路径 输入 -
返回值
-
0:成功。
-
非0:失败,参照错误码。
-
-
依赖
-
头文件: mi_ao.h
-
库文件: libmi_ao.a/libmi_ao.so
-
-
注意
-
此接口相当于MI_AO_Open和MI_AO_AttachIf组合。
-
如果音频输出设备已经处于开启状态,则直接返回成功。
-
Muffin/Mochi系列Soc上,配置文件为ini格式;Maruko/Souffle/Ifado系列Soc上,配置文件为json格式。
-
在dual os环境下,配置文件需要提供绝对路径。
-
只有调用MI_AO_Open和MI_AO_AttachIf后,或调用MI_AO_OpenWitCfgFile后,才能通过MI_SYS_QureyDevChnPortState获取到AO Device的Enable状态。
-
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 sound mode of AO Device. 7. ; 1[Mono] 2[Stereo] 8. enSoundMode = 2 9. ; enSampleRate determines the sample rate of AO Device. 10. ; 8000[8KHz] 16000[16KHz] 32000[32KHz] 48000[48KHz] 11. enSampleRate = 8000 12. ; u32PeriodSize(samples) determines the time to start RDMA. 13. u32PeriodSize = 1024 14. ; enChannelMode determines the channel mode of AO Device. 15. ; 0[Stereo] 1[Double Mono] 2[Double Left] 3[Double Right] 4[Exchange] 5[Only Left] 6[Only Right] 16. enChannelMode = 0 17. ; attach interface 18. ; 1[DAC_AB] 2[DAC_CD] 4[I2S_A] 8[I2S_B] 16[ECHO_A] 32[HDMI_A] 19. ; if you want to attach DAC_AB and DAC_CD, so enAoIfs = DAC_AB | DAC_CD = 1 | 2 = 3. 20. enAoIfs = 5 21. 22. ; I2S TX attr section 23. ; It is not necessarywhen you're not using I2S TX 24. [I2S_A] 25. ; enMode determines the working mode of I2S Tx 26. ; 0[I2S Master] 1[I2S Slave] 2[Tdm Master] 3[Tdm Slave] 27. enMode = 0 28. ; enBitWidth determines the bit with of I2S Tx 29. ; 0[16 bit] 1[32bit] 30. enBitWidth = 0 31. ; enFormat determines the waveform alignment of I2S Tx 32. ; 0[I2S Philips] 1[I2S Left-justify] 33. enFormat = 0 34. ; enSampleRate determines the sample rate of I2S Tx 35. ; 8000[8KHz] 16000[16KHz] 32000[32KHz] 48000[48KHz] 36. enSampleRate = 8000 37. ; enMclk determines the frequency of Mclk 38. ; 0[disable Mclk] 1[12.288M] 2[16.384M] 3[18.432M] 4[24.576M] 5[24M] 6[48M] 39. enMclk = 0 40. ; bSyncClock: 1[4-wire mode] 0[6-wire mode] 41. bSyncClock = 0 42. ; u32TdmSlots determines the slot number of I2S Tx 43. u32TdmSlots = 2
-
json格式配置文件模板如下:
1. { 2. "DEV":{ 3. "enFormat":0, 4. "enSoundMode":2, 5. "enSampleRate":8000, 6. "u32PeriodSize":1024, 7. "enChannelMode":0, 8. "enAoIfs":[1,4] 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. }
“DEV”节点包含了MI_AO_Open和MI_AO_AttachIf所需要的参数信息,其中“enFormat”、“enSoundMode”、“enSampleRate”、“u32PeriodSize”和“enChannelMode”为MI_AO_Open所需的配置信息,可参考MI_AO_Attr_t,而“enAoIfs”为MI_AO_AttachIf所需要的配置信息,可参考MI_AO_If_e。“I2S_A”节点包含了MI_AO_SetI2SConfig所需要的配置信息,可参考MI_AUDIO_I2sConfig_t。
上面的配置信息,enFormat = 0表示AO Device采用S16_LE格式,enSoundMode = 1表示Sound Mode采用Mono,enSampleRate = 8000表示AO Device使用8KHz采样频率,u32PeriodSize = 1024表示起播条件为1024个采样点,enChannelMode = 1表示Double Mono,enAoIfs=1表示将DAC0/1 attach到RDMA。若需要使用I2S TX还需要设置I2S TX的参数,上述配置作用于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_AO_OpenWithCfgFile(AoDevId, path), MI_SUCCESS);
2.3. MI_AO_Close¶
-
功能
关闭音频输出设备。
-
语法
MI_S32 MI_AO_Close(MI_AUDIO_DEV AoDevId);
-
形参
参数名称 描述 输入/输出 AoDevId 音频输出设备号 输入 -
返回值
-
0:成功。
-
非0:失败,参照错误码。
-
-
依赖
-
头文件: mi_ao.h
-
库文件: libmi_ao.a/libmi_ao.so
-
-
注意
- 如果音频输出设备已经处于关闭状态,则直接返回成功。
- 只有调用MI_AO_Close后,或没有对AO Device进行初始化,才能通过MI_SYS_QureyDevChnPortState获取到AO Device的Disable状态。
-
举例
简单例子如下:
1. ExecFunc(MI_AO_Close(MI_AO_DEV_1), MI_SUCCESS);
详细例子请参考MI_AO_Open。
2.4. MI_AO_AttachIf¶
-
功能
挂载外设到音频输出设备。
-
语法
MI_S32 MI_AO_AttachIf(MI_AUDIO_DEV AoDevId, MI_AO_If_e enAoIfs, MI_U32 u32AudioDelay);
-
形参
参数名称 描述 输入/输出 AoDevId 音频输出设备号 输入 enAoIfs AO Interface, 需要挂载到音频输出设备的外设信息, 可以使用 “ ” 来表示挂载多个外设 u32AudioDelay 延迟参数,保留未使用 输入 -
返回值
-
0:成功。
-
非0:失败,参照错误码。
-
-
依赖
-
头文件: mi_ao.h
-
库文件: libmi_ao.a/libmi_ao.so
-
-
注意
-
此接口仅能在MI_AO_Open成功后调用。
-
如需要挂载I2S TX到音频输出设备,需要先调用MI_AO_SetI2SConfig来初始化I2S TX。
-
如果要获取回声参考数据,AO模块需要attach E_MI_AO_IF_ECHO_A,AI模块需要attach E_MI_AI_IF_ECHO_A。
-
只有调用MI_AO_Open和MI_AO_AttachIf后,或调用MI_AO_OpenWitCfgFile后,才能通过MI_SYS_QureyDevChnPortState获取到AO Device的Enable状态。
-
-
举例
1. ExecFunc(MI_AO_AttachIf(AoDevId, E_MI_AO_IF_DAC_AB, 0), MI_SUCCESS);
2.5. MI_AO_DetachIf¶
-
功能
卸载外设与音频输出设备的连接。
-
语法
MI_S32 MI_AO_DetachIf(MI_AUDIO_DEV AoDevId, MI_AO_If_e enAoIfs);
-
形参
参数名称 描述 输入/输出 AoDevId 音频输出设备号 输入 enAoIfs AO Interface, 需要卸载到音频输出设备的外设信息, 可以使用 “|” 来表示卸载多个外设 输入 -
返回值
-
0:成功。
-
非0:失败,参照错误码。
-
-
依赖
-
头文件: mi_ao.h
-
库文件: libmi_ao.a/libmi_ao.so
-
-
注意
-
此接口仅能在MI_AO_AttachIf成功后调用。
-
Maruko系列芯片I2S TX和ECHO不支持detach。
-
-
举例
简单例子如下:
1. ExecFunc(MI_AO_DetachIf(AoDevId, E_MI_AO_IF_DAC_AB), MI_SUCCESS);
详细例子请参考MI_AO_Open。
2.6. MI_AO_Write¶
-
功能
写入音频数据。
-
语法
MI_S32 MI_AO_Write(MI_AUDIO_DEV AoDevId, const void *pvBuffer, MI_U32 u32Bytes, MI_U64 u64Pts, MI_S32 s32TimeoutMs);
-
形参
参数名称 描述 输入/输出 AoDevId 音频输出设备号 输入 pvBuffer 音频数据指针 输入 u32Bytes 音频数据长度 输入 u64Pts 音频数据时间戳,保留未使用 输入 s32TimeoutMs 写入音频数据的超时时间 -1 表示阻塞模式,缓存空间不足时一直等待 0 表示非阻塞模式,缓存空间不足时则报错返回 >0表示阻塞s32TimeoutMs毫秒,超时则报错返回 输入 -
返回值
-
0:成功。
-
非0:失败,参照错误码。
-
-
依赖
-
头文件: mi_ao.h
-
库文件: libmi_ao.a/libmi_ao.so
-
-
注意
-
此接口仅能在MI_AO_Open和MI_AO_AttachIf成功后调用。
-
s32TimeoutMs必须大于等于-1,等于-1 时采用阻塞模式写入数据,等于0时采用非阻塞模式写入数据,大于0时,阻塞s32MilliSec 毫秒后,仍然写入不成功则返回超时并报错。
-
-
举例
简单例子如下:
1. MI_U8 u8TempBuf[1024] = {0}; 2. MI_S32 s32ReadSize; 3. s32ReadSize = read(s32Fd, pu8TempBuf, sizeof(u8TempBuf)); 4. if (s32ReadSize > 0) 5. { 6. MI_AO_Write(AoDevId, u8TempBuf, s32ReadSize, 0, -1); 7. }
详细例子请参考MI_AO_Open。
2.7. MI_AO_Start¶
-
功能
启动音频输出设备,立刻进行播放。
-
语法
MI_S32 MI_AO_Start(MI_AUDIO_DEV AoDevId);
-
形参
参数名称 描述 输入/输出 AoDevId 音频输出设备号 输入 -
返回值
-
0:成功。
-
非0:失败,参照错误码。
-
-
依赖
-
头文件: mi_ao.h
-
库文件: libmi_ao.a/libmi_ao.so
-
-
注意
-
此接口仅能在MI_AO_Open成功后调用。
-
当此接口被调用时,即使没有达到默认的起播条件(> u32PeriodSize),也会立刻进行播放。
-
-
举例
1. ExecFunc(MI_AO_Start(AoDevId), MI_SUCCESS);
2.8. MI_AO_Stop¶
-
功能
停止音频输出设备,立刻停止播放。
-
语法
MI_S32 MI_AO_Stop(MI_AUDIO_DEV AoDevId);
-
形参
参数名称 描述 输入/输出 AoDevId 音频输出设备号 输入 -
返回值
-
0:成功。
-
非0:失败,参照错误码。
-
-
依赖
-
头文件: mi_ao.h
-
库文件: libmi_ao.a/libmi_ao.so
-
-
注意
-
此接口仅能在MI_AO_Open成功后调用。
-
当此接口被调用时,会立刻停止播放。停止后原有的缓存数据也会丢失。
-
-
举例
1. ExecFunc(MI_AO_Stop(AoDevId), MI_SUCCESS);
2.9. MI_AO_Pause¶
-
功能
暂停音频输出设备。
-
语法
MI_S32 MI_AO_Pause (MI_AUDIO_DEV AoDevId);
-
形参
参数名称 描述 输入/输出 AoDevId 音频输出设备号 输入 -
返回值
-
0:成功。
-
非0:失败,参照错误码。
-
-
依赖
-
头文件: mi_ao.h
-
库文件: libmi_ao.a/libmi_ao.so
-
-
注意
-
此接口仅能在MI_AO_Open成功后调用。
-
当此接口被调用时,会立刻暂停播放。
-
-
举例
1. ExecFunc(MI_AO_Pause(AoDevId),MI_SUCCESS);
2.10. MI_AO_Resume¶
-
功能
恢复音频输出设备。
-
语法
MI_S32 MI_AO_Resume(MI_AUDIO_DEV AoDevId);
-
形参
参数名称 描述 输入/输出 AoDevId 音频输出设备号 输入 -
返回值
-
0:成功。
-
非0:失败,参照错误码。
-
-
依赖
-
头文件: mi_ao.h
-
库文件: libmi_ao.a/libmi_ao.so
-
-
注意
-
此接口仅能在MI_AO_Pause成功后调用。
-
当此接口被调用时,会立刻恢复播放。
-
-
举例
1. ExecFunc(MI_AO_Resume(AoDevId),MI_SUCCESS);
2.11. MI_AO_SetVolume¶
-
功能
设置音频输出设备的音量。
-
语法
MI_AO_SetVolume(MI_AUDIO_DEV AoDevId, MI_S16 s16LeftVolume, MI_S16 s16RightVolume, MI_AO_GainFading_e enFading);
-
形参
参数名称 描述 输入/输出 AoDevId 音频输出设备号 输入 s16LeftVolume 左声道音量 输入 s16RightVolume 右声道音量 输入 eFading 音频增益变化的速度 输入 -
返回值
-
0:成功。
-
非0:失败,参照错误码。
-
-
依赖
-
头文件: mi_ao.h
-
库文件: libmi_ao.a/libmi_ao.so
-
-
注意
-
此接口仅能在MI_AO_Open成功后调用。
-
Gain和Volume含义相同,均是指增益或音量。
-
在3.55版本及以后版本,所有音量Gain值的数据类型由S8改为S16,如旧版本的函数原型: MI_AO_SetVolume(MI_AUDIO_DEV AoDevId, MI_S8 s8LeftVolume, MI_S8 s8RightVolume, MI_AO_GainFading_e enFading); 其他音量Gain相关的API同上。
-
Souffle系列芯片Gain值与其他系列芯片有所不同,Gain值不是对应的Db值,而是存在一个映射关系,范围[-508, 512]对应[-63.5Db, 64Db],其中0对应0Db,0.125dB/step。
-
Ifado系列芯片的as16Gains设置范围为[-63.5dB, 12dB],0.5dB/step。
-
Muffin系列芯片新增支持MI_AO_SetIfVolume设定,其Gain值设定范围与MI_AO_SetVolume相同。
-
-
举例
1. MI_S16 s16LeftVolume, s16RightVolume; 2. MI_AO_GainFading_e eGainFading; 3. s16LeftVolume = 0; 4. s16RightVolume = 0; 5. eGainFading = E_MI_AO_GAIN_FADING_OFF; 6. ExecFunc(MI_AO_SetVolume(AoDevId, s16LeftVolume, s16RightVolume, eGainFading), MI_SUCCESS);
2.12. MI_AO_GetVolume¶
-
功能
获取音频输出设备的音量。
-
语法
MI_S32 MI_AO_GetVolume(MI_AUDIO_DEV AoDevId, MI_S16 *ps16LeftVolume, MI_S16 *ps16RightVolume);
-
形参
参数名称 描述 输入/输出 AoDevId 音频输出设备号 输入 ps16LeftVolume 左声道音量指针 输出 ps16RightVolume 右声道音量指针 输出 -
返回值
-
0:成功。
-
非0:失败,参照错误码。
-
-
依赖
-
头文件: mi_ao.h
-
库文件: libmi_ao.a/libmi_ao.so
-
-
注意
- 此接口仅能在MI_AO_SetVolume成功后调用。
-
举例
1. MI_S16 s16LeftVolume, s16RightVolume; 2. ExecFunc(MI_AO_GetVolume(AoDevId, &s16LeftVolume, &s16RightVolume), MI_SUCCESS);
2.13. MI_AO_SetMute¶
-
功能
设置音频输出设备的静音参数。
-
语法
MI_S32 MI_AO_SetMute(MI_AUDIO_DEV AoDevId, MI_BOOL bLeftMute, MI_BOOL bRightMute, MI_AO_GainFading_e enFading);
-
形参
参数名称 描述 输入/输出 AoDevId 音频输出设备号 输入 bLeftMute 左声道静音参数 输入 bRightMute 右声道静音参数 输入 eFading 音频增益变化的速度,保留未使用 输入 -
返回值
-
0:成功。
-
非0:失败,参照错误码。
-
-
依赖
-
头文件: mi_ao.h
-
库文件: libmi_ao.a/libmi_ao.so
-
-
注意
-
此接口仅能在MI_AO_Open成功后调用。
-
当使用MI_AO_SetVolume调节音量,会自动退出静音状态。
-
-
举例
1. MI_BOOL bLeftMute = TRUE; 2. MI_BOOL bRightMute = TRUE; 3. MI_AO_GainFading_e eGainFading = E_MI_AO_GAIN_FADING_OFF; 4. ExecFunc(MI_AO_SetMute(AoDevId, bLeftMute, bRightMute, eGainFading), MI_SUCCESS);
2.14. MI_AO_GetMute¶
-
功能
获取音频输出设备的静音参数。
-
语法
MI_S32 MI_AO_GetMute(MI_AUDIO_DEV AoDevId, MI_BOOL *pbLeftMute, MI_BOOL *pbRightMute);
-
形参
参数名称 描述 输入/输出 AoDevId 音频输出设备号 输入 pbLeftMute 左声道静音参数指针 输出 pbRightMute 右声道静音参数指针 输出 -
返回值
-
0:成功。
-
非0:失败,参照错误码。
-
-
依赖
-
头文件: mi_ao.h
-
库文件: libmi_ao.a/libmi_ao.so
-
-
注意
- 此接口仅能在MI_AO_Open成功后调用。
-
举例
1. MI_BOOL bLeftMute; 2. MI_BOOL bRightMute; 3. ExecFunc(MI_AO_GetMute(AoDevId, bLeftMute, bRightMute), MI_SUCCESS);
2.15. MI_AO_SetIfVolume¶
-
功能
设置音频输出外设的音量。
-
语法
MI_S32 MI_AO_SetIfVolume(MI_AO_If_e enAoIf, MI_S16 s16LeftVolume, MI_S16 s16RightVolume);
-
形参
参数名称 描述 输入/输出 enAoIf 音频输出外设 输入 s16LeftVolume 左声道音量 输入 s16RightVolume 右声道音量 输入 -
返回值
-
0:成功。
-
非0:失败,参照错误码。
-
-
依赖
-
头文件: mi_ao.h
-
库文件: libmi_ao.a/libmi_ao.so
-
-
注意
-
目前仅Souffle系列芯片的interface支持该功能,硬件也由DPGA实现,在Codec框图中见IF Gain。
-
Gain(Volume)设定范围与MI_AO_SetVolume相同。
-
-
举例
1. MI_S16 s16LeftVolume = 0; 2. MI_S16 s16RightVolume = 0; 3. ExecFunc(MI_AO_SetIfVolume(E_MI_AO_IF_DAC_AB, s16LeftVolume, s16RightVolume), MI_SUCCESS);
2.16. MI_AO_GetIfVolume¶
-
功能
获取音频输出外设的音量。
-
语法
MI_S32 MI_AO_SetIfVolume(MI_AO_If_e enAoIf, MI_S16 s16LeftVolume, MI_S16 s16RightVolume);
-
形参
参数名称 描述 输入/输出 enAoIf 音频输出外设 输入 ps16LeftVolume 左声道音量指针 输出 ps16RightVolume 右声道音量指针 输出 -
返回值
-
0:成功。
-
非0:失败,参照错误码。
-
-
依赖
-
头文件: mi_ao.h
-
库文件: libmi_ao.a/libmi_ao.so
-
-
举例
1. MI_S16 s16LeftVolume = 0; 2. MI_S16 s16RightVolume = 0; 3. ExecFunc(MI_AO_GetIfVolume(E_MI_AO_IF_DAC_AB, &s16LeftVolume, &s16RightVolume), MI_SUCCESS);
2.17. MI_AO_SetIfMute¶
-
功能
设置音频输出外设的静音参数。
-
语法
MI_S32 MI_AO_SetIfMute(MI_AO_If_e enAoIf, MI_BOOL bLeftMute, MI_BOOL bRightMute);
-
形参
参数名称 描述 输入/输出 enAoIf 音频输出外设 输入 bLeftMute 左声道静音参数 输入 bRightMute 右声道静音参数 输入 -
返回值
-
0:成功。
-
非0:失败,参照错误码。
-
-
依赖
-
头文件: mi_ao.h
-
库文件: libmi_ao.a/libmi_ao.so
-
-
注意
- 是否支持此接口请参考具体Codec框图。
-
举例
1. MI_BOOL bLeftMute = 0; 2. MI_BOOL bRightMute = 0; 3. ExecFunc(MI_AO_SetIfMute(E_MI_AO_IF_DAC_AB, bLeftMute, bRightMute), MI_SUCCESS);
2.18. MI_AO_GetIfMute¶
-
功能
获取音频输出外设的静音参数。
-
语法
MI_S32 MI_AO_GetIfMute(MI_AO_If_e enAoIf, MI_BOOL *pbLeftMute, MI_BOOL *pbRightMute);
-
形参
参数名称 描述 输入/输出 enAoIf 音频输出外设 输入 pbLeftMute 左声道静音参数指针 输出 pbRightMute 右声道静音参数指针 输出 -
返回值
-
0:成功。
-
非0:失败,参照错误码。
-
-
依赖
-
头文件: mi_ao.h
-
库文件: libmi_ao.a/libmi_ao.so
-
-
举例
1. MI_BOOL bLeftMute = 0; 2. MI_BOOL bRightMute = 0; 3. ExecFunc(MI_AO_GetIfMute(E_MI_AO_IF_DAC_AB, &s16LeftVolume, &s16RightVolume), MI_SUCCESS);
2.19. MI_AO_SetI2SConfig¶
-
功能
设置I2S TX的配置信息。
-
语法
MI_S32 MI_AO_SetI2SConfig(MI_AO_If_e enAoI2SIf, const MI_AUDIO_I2sConfig_t *pstConfig);
-
形参
参数名称 描述 输入/输出 enAiI2Sif 音频I2S TX输出外设 输入 pstConfig 音频I2S TX的配置信息 输入 -
返回值
-
0:成功。
-
非0:失败,参照错误码。
-
-
依赖
-
头文件: mi_ao.h
-
库文件: libmi_ao.a/libmi_ao.so
-
-
注意
-
MI_AUDIO_I2sConfig_t中的enSampleRate必须和MI_AO_Attr_t中的enSampleRate一致,否则attach会报错。
-
当同一个I2S TX interface被所有device detach后,即没有device attach上该I2S TX interface,会重置I2S TX的参数,若需要attach到某一个device,必须先重新设定I2S 参数。
-
-
举例
1. MI_AUDIO_I2sConfig_t stAoI2sACfg; 2. memset(&stAoI2sACfg, 0x0, sizeof(stAoI2sACfg)); 3. stAoI2sACfg.enMode = E_MI_AUDIO_I2S_MODE_I2S_MASTER; 4. stAoI2sACfg.enFormat = E_MI_AUDIO_I2S_FMT_I2S_MSB; 5. stAoI2sACfg.enSampleRate = E_MI_AUDIO_SAMPLE_RATE_8000; 6. stAoI2sACfg.enMclk = E_MI_AUDIO_I2S_MCLK_0; 7. stAoI2sACfg.bSyncClock = TRUE; 8. stAoI2sACfg.u32TdmSlots = 2; 9. stAoI2sACfg.enBitWidth = E_MI_AUDIO_BIT_WIDTH_16; 10. ExecFunc(MI_AO_SetI2SConfig(E_MI_AO_IF_I2S_A, &stAoI2sACfg), MI_SUCCESS);
2.20. MI_AO_GetI2SConfig¶
-
功能
获取I2S TX的配置信息。
-
语法
MI_S32 MI_AO_GetI2SConfig(MI_AO_If_e enAoI2SIf, MI_AUDIO_I2sConfig_t *pstConfig);
-
形参
参数名称 描述 输入/输出 enAiI2SIf 音频I2S TX输出外设 输入 pstConfig 音频I2S TX的配置信息 输出 -
返回值
-
0:成功。
-
非0:失败,参照错误码。
-
-
依赖
-
头文件: mi_ao.h
-
库文件: libmi_ao.a/libmi_ao.so
-
-
举例
1. MI_AUDIO_I2sConfig_t stAoI2sACfg; 2. memset(&stAoI2sACfg, 0x0, sizeof(stAoI2sACfg)); 3. ExecFunc(MI_AO_GetI2SConfig(E_MI_AO_IF_I2S_A, &stAoI2sACfg), MI_SUCCESS);
2.21. MI_AO_AdjustSpeed¶
-
功能
调整音频输出设备的播放速度。
-
语法
MI_S32 MI_AO_AdjustSpeed(MI_AUDIO_DEV AoDevId, MI_S32 s32Speed);
-
形参
参数名称 描述 输入/输出 AoDevId 音频输出设备号 输入 s32Speed 播放采样率 输入 -
返回值
-
0:成功。
-
非0:失败,参照错误码。
-
-
依赖
-
头文件: mi_ao.h
-
库文件: libmi_ao.a/libmi_ao.so
-
-
注意
- 暂不支持此接口。
-
举例
1. ExecFunc(MI_AO_AdjustSpeed(AoDevId, 8000), MI_SUCCESS);
2.22. MI_AO_GetTimestamp¶
-
功能
获取音频输出设备当前的播放时间戳和缓存数据量。
-
语法
MI_S32 MI_AO_GetTimestamp(MI_AUDIO_DEV AoDevId, MI_U32 *pu32Remaining, MI_U64 *pu64TStamp);
-
形参
参数名称 描述 输入/输出 AoDevId 音频输出设备号 输入 pu32Remaining 当前的缓存数据量 输出 pu64TStamp 当前的播放时间戳,保留未使用 输出 -
返回值
-
0:成功。
-
非0:失败,参照错误码。
-
-
依赖
-
头文件: mi_ao.h
-
库文件: libmi_ao.a/libmi_ao.so
-
-
注意
-
此接口仅能在MI_AO_Open成功后调用。
-
此接口可用于替代Audio 2.0的MI_AO_QueryChnStat接口,整个缓存空间的大小可通过dump procfs信息看到。
-
-
举例
1. MI_U32 u32Remaining; 2. MI_U64 u64TStamp; 3. ExecFunc(MI_AO_GetTimestamp(AoDevId, &u32Remaining, &u64TStamp), MI_SUCCESS);
2.23. MI_AO_GetLatency¶
-
功能
获取音频输出设备的延迟。
-
语法
MI_S32 MI_AO_GetLatency(MI_AUDIO_DEV AoDevId, MI_U32 *pu32Latency);
-
形参
参数名称 描述 输入/输出 AoDevId 音频输出设备号 输入 pu32Latency 延迟时间(ms) 输出 -
返回值
-
0:成功。
-
非0:失败,参照错误码。
-
-
依赖
-
头文件: mi_ao.h
-
库文件: libmi_ao.a/libmi_ao.so
-
-
注意
-
此接口仅能在MI_AO_Open成功后调用。
-
此接口具体功能尚未实现。
-
-
举例
1. MI_U32 u32Latency; 2. ExecFunc(MI_AO_GetLatency(AoDevId, &u32Latency), MI_SUCCESS);
2.24. MI_AO_InitDev¶
-
功能
初始化音频输出设备。
-
语法
MI_S32 MI_AO_InitDev(MI_AO_InitParam_t *pstInitParam);
-
形参
参数名称 描述 输入/输出 pstInitParam 设备初始化参数 输入 -
返回值
-
0:成功。
-
非0:失败,参照错误码。
-
-
依赖
-
头文件: mi_ao.h
-
库文件: libmi_ao.a/libmi_ao.so
-
-
注意
-
本接口必须和MI_AO_DeinitDev成对使用,不可单独重复调用,否则返回失败。
-
仅用于STR状态唤醒后重新初始化AO模块。
-
2.25. MI_AO_DeInitDev¶
-
功能
反初始化音频输出设备。
-
语法
MI_S32 MI_AO_DeInitDev(void);
-
返回值
-
0:成功。
-
非0:失败,参照错误码。
-
-
依赖
-
头文件: mi_ao.h
-
库文件: libmi_ao.a/libmi_ao.so
-
-
注意
-
此函数必须在初始化设备后调用,否则返回失败。
-
如果本接口在app退出前没有调用,内部会自动反初始化设备。
-
本接口必须和MI_AO_InitDev成对使用,不可单独重复调用,否则返回失败。
-
2.26. MI_AO_GetAttr¶
-
功能
获取音频输出设备的属性。
-
语法
MI_S32 MI_AO_GetAttr(MI_AUDIO_DEV AoDevId, MI_AO_Attr_t *pstAttr);
-
形参
参数名称 描述 输入/输出 AoDevId 音频输出设备号 输入 pstAttr 音频输出设备属性 输出 -
返回值
-
0:成功。
-
非0:失败,参照错误码。
-
-
依赖
-
头文件: mi_ao.h
-
库文件: libmi_ao.a/libmi_ao.so
-
-
注意
- 此函数必须在打开设备成功后调用,否则返回失败。
2.27. MI_AO_SetChannelMode¶
-
功能
动态设置声道输出模式。
-
语法
MI_S32 MI_AO_SetChannelMode(MI_AUDIO_DEV AoDevId, MI_AO_ChannelMode_e enChannelMode);
-
形参
参数名称 描述 输入/输出 AoDevId 音频输出设备号 输入 enChannelMode 声道输出模式 输入 -
返回值
-
0:成功。
-
非0:失败,参照错误码。
-
-
依赖
-
头文件: mi_ao.h
-
库文件: libmi_ao.a/libmi_ao.so
-
-
注意
-
此函数仅可以在MI_AO_AttachIf成功后调用。
-
仅Mochi系列芯片支持此设定。
-
-
举例
简单例子如下:
2. ExecFunc(MI_AO_SetChannelMode(AoDevId, E_MI_AO_CHANNEL_MODE_ONLY_LEFT), MI_SUCCESS);
详细例子请参考MI_AO_Open。
2.28. MI_AO_Dup¶
-
功能
同步音频输出设备状态。
-
语法
MI_S32 MI_AO_Dup(MI_AUDIO_DEV AoDevId);
-
形参
参数名称 描述 输入/输出 AoDevId 音频输出设备号 输入 -
返回值
-
0:成功。
-
非0:失败,参照错误码。
-
-
依赖
-
头文件: mi_ao.h
-
库文件: libmi_ao.a/libmi_ao.so
-
-
注意
- 此接口仅适用于多进程和多OS环境。进程A调用MI_AI_EnableChnGroup进行初始化后,进程B也需要使用同一个chn group资源,则需要调用MI_AI_DupChnGroup获取相应的资源。当进程B使用完该chn group资源时也需要调用MI_AI_DisableChnGroup进行该资源的释放。同理,dualos的场景也需要遵循此规则,实际上dual os就是一种特殊的多进程情况。
3. AO数据类型¶
AO模块相关数据类型定义如下:
数据类型 | 定义 |
---|---|
MI_AUDIO_DEV | 定义音频输出设备编号 |
MI_AUDIO_Format_e | 定义音频输出设备的数据格式 |
MI_AUDIO_SoundMode_e | 定义音频输出设备的声音模式 |
MI_AUDIO_SampleRate_e | 定义音频采样率 |
MI_AO_ChannelMode_e | 定义音频的声道输出模式 |
MI_AO_Attr_t | 定义音频输出设备属性结构体 |
MI_AO_If_e | 定义音频外设接口 |
MI_AO_GainFading_e | 定义音频增益的变化速度 |
MI_AUDIO_I2sMode_e | 定义I2S TX的工作模式 |
MI_AUDIO_I2sBitWidth_e | 定义I2S TX的位宽 |
MI_AUDIO_I2sFormat_e | 定义I2S TX的传输数据格式 |
MI_AUDIO_I2sMclk_e | 定义I2S TX的Mclk时钟频率 |
MI_AUDIO_I2sConfig_t | 定义I2S TX的相关配置信息 |
MI_AO_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声道,不支持 -
相关数据类型及接口
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 TX, 其他的音频输出外设仅支持8/11.025/12/16/22.05/24/32/44.1/48kHz。
-
I2S TX可支持8/16/32/48/96/192kHz, 但使用96/192kHz只能单独attach I2S TX。
-
Muffin芯片I2S TX仅支持8/16/32/48/96 kHz。
-
-
相关数据类型及接口
3.5. MI_AO_ChannelMode_e¶
-
说明
定义音频设备的声道输出模式。
-
定义
typedef enum { E_MI_AO_CHANNEL_MODE_STEREO, E_MI_AO_CHANNEL_MODE_DOUBLE_MONO, E_MI_AO_CHANNEL_MODE_DOUBLE_LEFT, E_MI_AO_CHANNEL_MODE_DOUBLE_RIGHT, E_MI_AO_CHANNEL_MODE_EXCHANGE, E_MI_AO_CHANNEL_MODE_ONLY_LEFT, E_MI_AO_CHANNEL_MODE_ONLY_RIGHT, }MI_AO_ChannelMode_e;
-
成员
成员名称 描述 E_MI_AO_CHANNEL_MODE_STEREO 正常立体声模式 E_MI_AO_CHANNEL_MODE_DOUBLE_MONO 立体声:左右两个声道输出为左右声道混音数据 单声道:左右两个声道输出为同样的单声道数据 E_MI_AO_CHANNEL_MODE_DOUBLE_LEFT 立体声:左右两个声道输出为左声道数据 E_MI_AO_CHANNEL_MODE_DOUBLE_RIGHT 立体声:左右两个声道输出为右声道数据 E_MI_AO_CHANNEL_MODE_EXCHANGE 立体声:左右两个声道输出为左右声道互换数据 E_MI_AO_CHANNEL_MODE_ONLY_LEFT 立体声:左声道输出为左声道数据 单声道:左声道输出为单声道数据 E_MI_AO_CHANNEL_MODE_ONLY_RIGHT 立体声:右声道输出为右声道数据 单声道:右声道输出为单声道数据 -
注意事项
- Muffin不支持E_MI_AO_CHANNEL_MODE_DOUBLE_MONO(立体声) / E_MI_AO_CHANNEL_MODE_DOUBLE_LEFT(立体声) / E_MI_AO_CHANNEL_MODE_DOUBLE_RIGHT(立体声)。
-
相关数据类型及接口
3.6. MI_AO_Attr_t¶
-
说明
定义音频输出设备属性结构体。
-
定义
typedef struct MI_AO_Attr_s { MI_AUDIO_Format_e enFormat; MI_AUDIO_SoundMode_e enSoundMode; MI_AUDIO_SampleRate_e enSampleRate; MI_U32 u32PeriodSize; MI_AO_ChannelMode enChannelMode; MI_AUDIO_SampleRate_e enMixerSampleRate; } MI_AO_Attr_t;
-
成员
成员名称 描述 enFormat 音频数据格式,静态属性 enSoundMode 音频声音模式, 静态属性 enSampleRate 音频采样率, 静态属性 u32PeriodSize 起播条件的样本数,静态属性 enChannelMode 声道输出模式,静态属性 enMixerSampleRate (部分支持)混音后输出采样率。
静态属性,仅在混音的使用场景时生效,如果未设定该参数,默认为48K,其他场景下无需设定。 -
注意事项
- 该成员enMixerSampleRate目前仅Mochi系列芯片支持此设定。
-
相关数据类型及接口
3.7. MI_AO_If_e¶
-
说明
定义音频外设接口。
-
定义
typedef enum { E_MI_AO_IF_NONE = 0x0u, E_MI_AO_IF_DAC_AB = 0x1u, E_MI_AO_IF_DAC_CD = 0x02u, E_MI_AO_IF_I2S_A = 0x4u, E_MI_AO_IF_I2S_B = 0x8u, E_MI_AO_IF_ECHO_A = 0x10u, E_MI_AO_IF_HDMI_A = 0x20u, E_MI_AO_IF_MAX, } MI_AO_If_e;
-
成员
成员名称 描述 E_MI_AO_IF_NONE None E_MI_AO_IF_DAC_AB DAC0/ 1 E_MI_AO_IF_DAC_CD DAC2/ 3 E_MI_AO_IF_I2S_A I2S TX A E_MI_AO_IF_I2S_B I2S RX B E_MI_AO_IF_ECHO_A SRC数据(回声) E_MI_AO_IF_HDMI_A HDMI TX -
相关数据类型及接口
3.8. MI_AO_GainFading_e¶
-
说明
定义音频设备增益的变化速度。
-
定义
typedef enum{ E_MI_AO_GAIN_FADING_OFF = 0, E_MI_AO_GAIN_FADING_1_SAMPLE, E_MI_AO_GAIN_FADING_2_SAMPLE, E_MI_AO_GAIN_FADING_4_SAMPLE, E_MI_AO_GAIN_FADING_8_SAMPLE, E_MI_AO_GAIN_FADING_16_SAMPLE, E_MI_AO_GAIN_FADING_32_SAMPLE, E_MI_AO_GAIN_FADING_64_SAMPLE, }MI_AO_GainFading_e;
-
成员
成员名称 描述 E_MI_AO_GAIN_FADING_OFF 关闭Fading功能,设置增益立刻生效 E_MI_AO_GAIN_FADING_1_SAMPLE 开启Fading功能,1个采样点变化0.5dB E_MI_AO_GAIN_FADING_2_SAMPLE 开启Fading功能,2个采样点变化0.5dB E_MI_AO_GAIN_FADING_4_SAMPLE 开启Fading功能,4个采样点变化0.5dB E_MI_AO_GAIN_FADING_8_SAMPLE 开启Fading功能,8个采样点变化0.5dB E_MI_AO_GAIN_FADING_16_SAMPLE 开启Fading功能,16个采样点变化0.5dB E_MI_AO_GAIN_FADING_32_SAMPLE 开启Fading功能,32个采样点变化0.5dB E_MI_AO_GAIN_FADING_64_SAMPLE 开启Fading功能,64个采样点变化0.5dB -
相关数据类型及接口
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_AO_InitParam_t¶
-
说明
音频输出设备初始化参数。
-
定义
typedef struct MI_AO_InitParam_s { MI_AUDIO_DEV AoDevId; MI_U8 *u8Data; } MI_AO_InitParam_t;
-
成员
成员名称 描述 AoDevId 音频输出设备号 u8Data 参数指针(保留) -
相关数据类型及接口
4. 错误码¶
AO API 错误码如下表所示:
错误码 | 宏定义 | 描述 |
---|---|---|
0xA0052001 | MI_AO_ERR_INVALID_DEVID | 音频输出设备号无效 |
0xA0052003 | MI_AO_ERR_ILLEGAL_PARAM | 音频输出参数设置无效 |
0xA0052006 | MI_AO_ERR_NULL_PTR | 输入参数空指针错误 |
0xA0052007 | MI_AO_ERR_NOT_CONFIG | 音频输出设备属性未设置 |
0xA0052008 | MI_AO_ERR_NOT_SUPPORT | 操作不支持 |
0xA0052009 | MI_AO_ERR_NOT_PERM | 操作不允许 |
0xA005200C | MI_AO_ERR_NOMEM | 分配内存失败 |
0xA005200D | MI_AO_ERR_NOBUF | 音频输出缓存不足 |
0xA005200E | MI_AO_ERR_BUF_EMPTY | 音频输出缓存为空 |
0xA005200F | MI_AO_ERR_BUF_FULL | 音频输出缓存为满 |
0xA0052010 | MI_AO_ERR_SYS_NOTREADY | 音频输出系统未初始化 |
0xA0052012 | MI_AO_ERR_BUSY | 音频输出系统忙碌 |
0xA0052017 | MI_AO_ERR_NOT_ENABLED | 音频输出设备或信道没有使能 |
0xA005201D | MI_AO_ERR_NOVASPACE | 音频设备映射buffer失败 |
5. PROCFS及DEBUG功能介绍¶
5.1. Cat¶
-
调试信息
# cat proc/mi_modules/mi_ao/mi_ao0
-
调试信息分析
记录当前AO的使用状况以及device属性等,可以动态地获取到这些信息,方便调试和测试。
-
参数说明
参数 描述 AO Device Attr DevStatus AO设备状态
uninit:未初始化
opened:open成功Format 音频格式(位宽及大小端等)
目前仅支持S16_LE(16bit,小端模式)SoundMode 声音模式
mono:单声道
stereo:立体声SampleRate 采样率
8k/11.025k/12k/16k/22.05k/24k/32k/44.1k/48k/...PeriodSize AO起播水线(采样点数) ChannelMode AO通道模式(请参考API关键字说明)
Stereo
DoubleMono
DoubleLeft
DoubleRight
Exchange
OnlyLeft
OnlyRightMixerSampleRate (部分支持)混音后降频输出采样率
8k/16k/32k/48kDmaBufSize DMA buffer大小 DmaBusySize DMA buffer中已使用的大小 DmaFreeSize DMA buffer中未使用的大小 TmpBufSize Tmp临时buffer大小 bStart AO是否开启DMA bPause AO是否暂停DMA FrmCnt 写数据帧计数 bXrun (部分支持)当前是否处于Xrun状态,中断发生到reset期间为Xrun状态 XrunIsrCnt (部分支持)Xrun中断发生的次数 LastStart2XrunUs (部分支持)如果发生Xrun,则从Start到Xrun的耗时Us;如果XrunIsrCnt == 0,此时该参数无效 LastStart2XrunBytes (部分支持)如果发生Xrun,则从Start到Xrun共写到DMA buffer数据的size LastAppWriteSize (部分支持)APP最后一次调用MI_AO_Write送数据的size DpgaGain 数字增益:(左声道增益,右声道增益) DpgaMute DPGA静音:(左声道静音,右声道静音) MI If MI绑定的所有interface信息,即应用层绑定的所有interface信息 Mhal Left If MHAL RDMA_L绑定的所有interface信息 Mhal Right If MHAL RDMA_R绑定的所有interface信息 If Info Interface音量、静音等信息
Volume(左声道增益,右声道增益)
Mute(左声道静音,右声道静音)
bIsMixing(部分支持,当前Interface是否处于混音模式)AO I2S Status I2sMode I2S Tx的工作模式(仅interface为I2S Tx时有效)
i2s-master
i2s-slave
tdm-master
tdm-slaveI2sMclk I2S Tx的Mclk的频率(仅interface为I2S Tx时有效)
disable: 不使用Mclk
其他值为当前的Mclk频率I2sFmt I2S Tx的数据格式(仅interface为I2S Tx时有效)
I2S-MSB: I2S格式
LEFT-MSB: I2S左对齐格式bI2sSync I2S RX和TX是否共用clock(仅interface为I2S Tx时有效)
1: 4 wire mode,RX和TX共用clock
0: 6 wire mode,RX和TX都有独立的clockTdmSlots I2S Tx的TDM slot数目(仅interface为I2S Tx为TDM模式时有效) I2sBitWidth I2S TX的位宽(仅interface为I2S Tx,且需要支持TDM模式的芯片有效)
5.2. Echo¶
功能 | 动态启用/关闭AO设备DPGA静音模式 |
---|---|
命令 | echo set_dpga_mute [LeftMute] [RightMute] [Fading] > /proc/mi_modules/mi_ao/mi_ao[ID] |
参数说明 | [ON/on/1, OFF/off/0] 开启/关闭静音 [Fading]设置渐入渐出速度 [ID] 设备号 |
举例 | echo set_dpga_mute 1 0 0 > /proc/mi_modules/mi_ao/mi_ao0 |
功能 | 动态启用/关闭AO设备Interface静音模式 |
---|---|
命令 | echo set_inf_mute [If] [LeftMute] [RightMute] > /proc/mi_modules/mi_ao/mi_ao[ID] |
参数说明 | [If]需要设定的Interface [ON/on/1, OFF/off/0] 开启/关闭静音 [ID] 设备号 |
举例 | echo set_inf_mute 1 1 0 > /proc/mi_modules/mi_ao/mi_ao0 |
功能 | 动态修改AO DPGA音量大小 |
---|---|
命令 | echo set_dpga_volume [LeftVolume] [RightVolume] [Fading] > /proc/mi_modules/mi_ao/mi_ao[ID] |
参数说明 | [LeftVolume] [RightVolume] 左声道音量,右声道音量 [Fading]设置音量渐入渐出速度 |
举例 | echo set_dpga_volume -10 -10 0 > /proc/mi_modules/mi_ao/mi_ao0 |
功能 | (部分支持)动态修改AO Interface音量大小 |
---|---|
命令 | echo set_inf_volume [If] [LeftVolume] [RightVolume] > /proc/mi_modules/mi_ao/mi_ao[ID] |
参数说明 | [If]需要设定的Interface [LeftVolume] [RightVolume] 左声道音量,右声道音量 |
举例 | echo set_inf_volume 1 -10 -10 > /proc/mi_modules/mi_ao/mi_ao0 |
功能 | 动态开启/关闭AO设备dump数据功能 |
---|---|
命令 | echo dump_data [Path] [ON/on/1, OFF/off/0] > /proc/mi_modules/mi_ao/mi_ao[ID] |
参数说明 | [Path] dump数据的保存路径 [ON/on/1, OFF/off/0] 开启/关闭dump数据功能 |
举例 | echo dump /mnt 1 > /proc/mi_modules/mi_ao/mi_ao0 |
功能 | 动态开启/关闭AO设备的Singen功能 |
---|---|
命令 | echo singen [SinGen Index] [Enable] > /proc/mi_modules/mi_ao/mi_ao[ID] |
参数说明 | [SinGen Index] 需要控制的Singen ID [Enable] 开启/关闭Singen功能 |
举例 | echo singen 0 1 > /proc/mi_modules/mi_ao/mi_ao0 |
功能 | (部分支持)动态设置AO设备的channel mode |
---|---|
命令 | echo set_chn_mode [channelMode] > /proc/mi_modules/mi_ao/mi_ao[ID] |
参数说明 | [channelMode] 需要设定的channel mode |
举例 | echo set_chn_mode 0 > /proc/mi_modules/mi_ao/mi_ao0 |
5.3. MI User层Debug¶
功能 | 在运行APP前,通过export指定环境变量,dump MI user层APP送给AO的数据 |
---|---|
说明 | [MI_AO_DUMP_ENABLE] 使能dump MI user层APP送给AO的数据 [MI_AO_DUMP_PATH] 指定dump数据的路径 |
举例 | export MI_AO_DUMP_ENABLE=1 export MI_AO_DUMP_PATH=/mnt |
6. Insmod参数及MODPARAM.json介绍¶
6.1. 参数名、支持平台及使用方式¶
参数名 | 使用insmod参数的平台 | 使用MODPARAM.json的平台 | 默认值 | 是否支持客户配置 | 作用 |
---|---|---|---|---|---|
DmaBufferSize | Muffin/Mochi/Ifado | Maruko/Souffle/Ifado | (通过参数计算得出) | Y | 同时调整AO DMA和TMP Buffer的大小 |
6.2. Insmod参数用法举例¶
修改举例:
insmod mi_ao.ko DmaBufferSize=32 # 单位K,必须是4K对齐
6.3. MODPARAM.json参数用法举例¶
修改举例 vim /config/modparam.json:
{ "E_MI_MODULE_ID_AO" : { "DmaBufferSize" : 32 // 单位K,必须是4K对齐 } }