MI AO API


REVISION HISTORY

Revision No.
Description
Date
3.50
  • Initial release
  • 12/04/2020
    3.51
  • Audio new architecture
  • 07/19/2021
  • Added procfs introduction
  • 08/25/2021
    3.52
  • Added MI_AO_GetAttr
  • 09/08/2021
  • Modified version: Audio 3.0 Version starts from 3.50(3.0 to 3.49 are Audio 2.0 versions)
  • 12/29/2021
    3.53
  • Added Mochi info
  • 02/17/2022

    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.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选择多个数据数据源,可支持选择½/4个数据源(数据源可以相同也可以不同),每个数据源各有两声道,即选择2/4/8个声道的数据由WDMA写到DRAM,起到多路开关的作用。而接近输出外设接口(如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.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的作用。

      1. E_MI_AO_CHANNEL_MODE_STEREO

        正常的立体声模式。

      2. E_MI_AO_CHANNEL_MODE_DOUBLE_MONO

        Double Mono单声道,左右两个声道输出为同样的单声道数据。

        Double Mono立体声,左右两个声道输出为左右声道混音后的数据,左右声道输出相同(Muffin系列不支持)。

      3. E_MI_AO_CHANNEL_MODE_DOUBLE_LEFT

        Double Left立体声,左右两个声道输出为左声道数据(Muffin系列不支持)。

      4. E_MI_AO_CHANNEL_MODE_DOUBLE_RIGHT

        Double Right立体声,左右两个声道输出为右声道数据(Muffin系列不支持)。

      5. E_MI_AO_CHANNEL_MODE_EXCHANGE

        Exchange立体声,左右两个声道输出为左右声道互换数据。

      6. E_MI_AO_CHANNEL_MODE_ONLY_LEFT

        Only Left单声道,只有左声道输出为单声道数据。

        Only Left立体声,只有左声道输出为立体声数据。

      7. E_MI_AO_CHANNEL_MODE_ONLY_RIGHT

        Only Right单声道,只有右声道输出为单声道数据。

        Only Right立体声,只有右声道输出为立体声数据。

    • Gain

      AO的Gain在audio3.0架构上分成两类,一类是与Device相关联的DPGA Gain,即audio codec框图中的DPGA,另一类则是Interface所独有的Gain。对于AO而言,目前仅能通过Dpga调整Gain。

    • Format

      Format,即用什么数据形式来表示一个音频采样样本,目前仅支持S16_LE格式(PCM Linear 16bit (Little Endian))。

    • Sample Rate

      Sample Rate,即播放采样率。

    • Period Size

      对于AO Device而言,Period Size表示AO Device默认的起播条件(缓存中的样本数大于Period Size,才会起播)。

    • I2S参数

      1. I2S Mode

        I2S Mode决定了I2S的工作模式,是标准的I2S模式还是Tdm I2S模式(2Channel或多channel),是Master还是Slave(Master提供同步时钟,Slave接收同步时钟)。一般来说,工作模式没有什么限制,能与外接的Codec时钟匹配上即可。

      2. I2S BitWidth

        I2S 收发数据的位宽,目前可支持16/32bit,但硬件只能处理16bit,意味着位宽为32bit时,低16bit为无效数据。

      3. I2S Format

        I2S的Format即I2S的对齐方式,目前仅支持I2S Philips以及Left-justified对齐。下图分别为这两种格式的波形图。

        I2S Philips的对齐格式,样本数据的第一个数据位出现在WCLK(即左右通道切换时钟)跳变的第一个BCLK(即串行时钟)后。左对齐格式,样本数据的第一个数据位出现在WCLK(即左右通道切换时钟)跳变的第一个BCLK(即串行时钟)内,且WCLK的极性与I2S Philips的对齐格式相反。

      4. I2S Sample Rate

        I2S 收发的采样频率。

      5. Mclk

        Mclk,称为主时钟,也叫系统时钟(System Clock),一般是采样频率的256或384倍,作用是为了使系统间能够更好的同步,并不是必须的。目前仅支持12.288M,16.384M,18.432M,24.576M,24M,48M等。

      6. 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。

      7. Slot

        Slot表示I2S 传输的声道数,目前I2S模式下支持2slot,Tdm模式下支持4/8/16slot,但I2S TX的有效数据为2slot,当对I2S TX设置大于2的slot个数时,除了slot0和slot1,其他的均为无效数据。

    • 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系列不支持)

    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)

        声道输出模式决定了音频数据在音频设备的输出模式。

    • 举例

      简单例子如下:

      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_S8 s8LeftVolume, s8RightVolume;      
      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. s8LeftVolume = 0;      
      37. s8RightVolume = 0;      
      38. eGainFading = E_MI_AO_GAIN_FADING_OFF;    
      39. ExecFunc(MI_AO_SetVolume(AoDevId, s8LeftVolume, s8RightVolume, 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_OpenMI_AO_AttachIf组合。

      • 如果音频输出设备已经处于开启状态,则直接返回成功。

      • 配置文件模板如下:

        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: 0[4-wire mode] 1[6-wire mode]  
        41. bSyncClock = 0  
        42. ; u32TdmSlots determines the slot number of I2S Tx  
        43. u32TdmSlots = 2
        

        上面的配置信息,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 = 0表示4-wire模式,u32TdmSlots表示接收2通道数据。注意使用时需把注释行删掉。

        AO template.ini

    • 举例

      1.  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

    • 注意

      • 如果音频输出设备已经处于关闭状态,则直接返回成功。
    • 举例

      简单例子如下:

      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。

    • 举例

      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

    • 注意

    • 举例

      简单例子如下:

      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_OpenMI_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_S8 s8LeftVolume, MI_S8 s8RightVolume, MI_AO_GainFading_e enFading);
      
    • 形参

      参数名称 描述 输入/输出
      AoDevId 音频输出设备号 输入
      s8LeftVolume 左声道音量(-60 ~ 30dB, 1dB/step) 输入
      s8RightVolume 右声道音量(-60 ~ 30dB, 1dB/step) 输入
      eFading 音频增益变化的速度 输入
    • 返回值

      • 0:成功。

      • 非0:失败,参照错误码

    • 依赖

      • 头文件: mi_ao.h

      • 库文件: libmi_ao.a/libmi_ao.so

    • 注意

    • 举例

      1.  MI_S8 s8LeftVolume, s8RightVolume;  
      2.  MI_AO_GainFading_e eGainFading;  
      3.  s8LeftVolume = 0;  
      4.  s8RightVolume = 0;  
      5.  eGainFading = E_MI_AO_GAIN_FADING_OFF;  
      6.  ExecFunc(MI_AO_SetVolume(AoDevId, s8LeftVolume, s8RightVolume, eGainFading), MI_SUCCESS);
      

    2.12. MI_AO_GetVolume

    • 功能

      获取音频输出设备的音量。

    • 语法

      MI_S32 MI_AO_GetVolume(MI_AUDIO_DEV AoDevId, MI_S8 *ps8LeftVolume, MI_S8 *ps8RightVolume);
      
    • 形参

      参数名称 描述 输入/输出
      AoDevId 音频输出设备号 输入
      ps8LeftVolume 左声道音量指针 输出
      ps8RightVolume 右声道音量指针 输出
    • 返回值

      • 0:成功。

      • 非0:失败,参照错误码

    • 依赖

      • 头文件: mi_ao.h

      • 库文件: libmi_ao.a/libmi_ao.so

    • 注意

    • 举例

      1. MI_S8 s8LeftVolume, s8RightVolume;
      
      2. ExecFunc(MI_AO_GetVolume(AoDevId, &s8LeftVolume, &s8RightVolume), 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

    • 注意

    • 举例

      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_S8 s8LeftVolume, MI_S8 s8RightVolume);
      
    • 形参

      参数名称 描述 输入/输出
      enAoIf 音频输出外设 输入
      s8LeftVolume 左声道音量 输入
      s8RightVolume 右声道音量 输入
    • 返回值

      • 0:成功。

      • 非0:失败,参照错误码

    • 依赖

      • 头文件: mi_ao.h

      • 库文件: libmi_ao.a/libmi_ao.so

    • 注意

      • 目前没有interface支持该功能。
    • 举例

      1. MI_S8 s8LeftVolume = 0;
      
      2. MI_S8 s8RightVolume = 0;
      
      3. ExecFunc(MI_AO_SetIfVolume(E_MI_AO_IF_DAC_AB, s8LeftVolume, s8RightVolume), MI_SUCCESS);
      

    2.16. MI_AO_GetIfVolume

    • 功能

      获取音频输出外设的音量。

    • 语法

      MI_S32 MI_AO_SetIfVolume(MI_AO_If_e enAoIf, MI_S8 s8LeftVolume, MI_S8 s8RightVolume);
      
    • 形参

      参数名称 描述 输入/输出
      enAoIf 音频输出外设 输入
      ps8LeftVolume 左声道音量指针 输出
      ps8RightVolume 右声道音量指针 输出
    • 返回值

      • 0:成功。

      • 非0:失败,参照错误码

    • 依赖

      • 头文件: mi_ao.h

      • 库文件: libmi_ao.a/libmi_ao.so

    • 举例

      1. MI_S8 s8LeftVolume = 0;
      
      2. MI_S8 s8RightVolume = 0;
      
      3. ExecFunc(MI_AO_GetIfVolume(E_MI_AO_IF_DAC_AB, &s8LeftVolume, &s8RightVolume), 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

    • 注意

      • 目前仅DAC_AB支持此接口。
    • 举例

      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, &s8LeftVolume, &s8RightVolume), 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

    • 注意

    • 举例

      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成功后调用。
    • 举例

      简单例子如下:

      2.  ExecFunc(MI_AO_SetChannelMode(AoDevId, E_MI_AO_CHANNEL_MODE_ONLY_LEFT), MI_SUCCESS);
      

      详细例子请参考MI_AO_Open

    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)
    • 相关数据类型及接口

      MI_AO_Attr_t

    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,
      
      }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 六声道,不支持。
      E_MI_AUDIO_SOUND_MODE_8CH 八声道,不支持。
    • 相关数据类型及接口

      MI_AO_Attr_t

    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。

    • 相关数据类型及接口

      MI_AO_Attr_t

    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(立体声)。
    • 相关数据类型及接口

      MI_AO_Attr_t

    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,其他场景下无需设定(暂不支持)。
    • 相关数据类型及接口

      MI_AO_Open

    3.7. MI_AO_If_e

    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
    • 相关数据类型及接口

      MI_AO_SetVolume

      MI_AO_SetMute

    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从模式
    • 注意事项

      • 主模式与从模式是否支持会依据不同的芯片而有区别。
    • 相关数据类型及接口

      MI_AUDIO_I2sConfig_t)

    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。
    • 相关数据类型及接口

      MI_AUDIO_I2sConfig_t)

    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 左对齐格式,最高位优先
    • 相关数据类型及接口

      MI_AUDIO_I2sConfig_t)

    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,
      
      } 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
    • 相关数据类型及接口

      MI_AUDIO_I2sConfig_t)

    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模式下有效)
    • 相关数据类型及接口

      MI_AO_SetI2SConfig

      MI_AO_GetI2SConfig

    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 参数指针(保留)
    • 相关数据类型及接口

      MI_AO_InitDev

    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介绍

    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通道模式
      Stereo:立体声
      DoubleMono:目前仅支持,播MONO-左右声道输出相同
      DoubleLeft:输出两路左声道
      DoubleRight:输出两路右声道
      Exchange:左右声道交换
      OnlyLeft:目前仅支持MONO-左声道输出
      OnlyRight:目前仅支持MONO-右声道输出
      MixerSampleRate 混音后降频输出采样率
      8k/16k/32k/48k(暂时无效)
      DmaBufSize Dma buffer大小
      DmaBusySize Dma buffer已使用的大小
      DmaFreeSize Dma buffer未使用的大小
      TmpBufSize Tmp临时buffer大小
      bStart AO是否开启DMA
      bPause AO是否暂停DMA
      FrmCnt 写数据帧计数
      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(左声道静音,右声道静音)
      AO I2S Status I2sMode I2S Tx的工作模式(仅interface为I2S Tx时有效)
      i2s-master
      i2s-slave
      tdm-master
      tdm-slave
      I2sMclk 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都有独立的clock
      TdmSlots 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_ao[ID]
    功能
    动态启用/关闭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_ao[ID]
    功能
    动态修改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] 左声道音量,右声道音量
    举例 暂不支持
    功能
    动态开启/关闭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