MI AO API


1. 概述


1.1. 模块说明

音频输出(Audio Output, AO)主要实现配置及启用音频输出设备、发送音频帧数据、以及音量设置等功能。


1.2. Audio Codec框图

图1-1 Tiramisu系列芯片

图1-2 Ikayaki系列芯片


1.3. 流程框图

图1-3

在2.17及以后的API版本上,MI_AI/MI_AO已不包含相关的算法功能,仅保持基本的采集/播放功能,版本信息请在SDK的mi_ao.h中查看。我们建议以上图的流程来串接相应的音频算法功能。


1.4. 关键字说明

  • Device

    与其他模块的Device概念不同,AO的Device指代的是不同的外部输出设备,如Line out/I2S TX/HDMI等。

  • Channel

    AO的Channel指代的是软件上的声道数。


2. API 参考


2.1. 功能模块API

表2-1

API名 功能
MI_AO_SetPubAttr 设置AO设备属性
MI_AO_GetPubAttr 获取AO设备属性
MI_AO_Enable 启用AO设备
MI_AO_Disable 禁用AO设备
MI_AO_EnableChn 启用AO通道
MI_AO_DisableChn 禁用AO通道
MI_AO_SendFrame 发送音频帧
MI_AO_PauseChn 暂停AO 通道
MI_AO_ResumeChn 恢复AO 通道
MI_AO_ClearChnBuf 清除AO通道中当前的音频数据缓存
MI_AO_QueryChnStat 查询AO 通道中当前的音频数据缓存状态
MI_AO_SetVolume 设置AO 设备/通道音量大小
MI_AO_GetVolume 获取AO 设备/通道音量大小
MI_AO_SetMute 设置AO设备/通道静音状态
MI_AO_GetMute 获取AO设备/通道静音状态
MI_AO_ClrPubAttr 清除AO设备属性
MI_AO_SetChnParam 设置AO通道属性
MI_AO_GetChnParam 获取AO通道属性
MI_AO_SetSrcGain 设置AO设备的回声参考增益
MI_AO_InitDev 初始化AO设备
MI_AO_DeinitDev 反初始化AO设备
MI_AO_DupChn 同步AO通道状态

2.2. MI_AO_SetPubAttr

  • 功能

    设置AO设备属性。

  • 语法

    MI_S32 MI_AO_SetPubAttr(MI_AUDIO_DEV AoDevId,  MI_AUDIO_Attr_t *pstAttr);
    
  • 形参

    表2-2

    参数名称 描述 输入/输出
    AoDevId 音频设备号 输入
    pstAttr AO设备属性指针 输入
  • 返回值

    • 0 成功。

    • 非0 失败,参照错误码

  • 依赖

    • 头文件: mi_ao.h

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

  • 注意

    音频输出设备属性包括采样率、采样精度、工作模式、每帧的采样点数、通道数目和I2S的配置参数。若需要对接Codec,这些属性应与待对接Codec 要求一致。

    • 采样率

      采样率指一秒内的采样点数,采样率越高表明失真度越小,处理的数据量也就随之增加。一般来说语音使用8k 采样率,音频使用32k或以上的采样率;

      目前仅支持8/11.025/12/16/22.05/24/32/44.1/48kHz采样率。若需要对接Codec,设置时请确认对接的Audio Codec 是否支持所要设定的采样率。

    • 采样精度

      采样精度指某个通道的采样点数据宽度。目前采样精度仅支持16bit。

    • 工作模式

      音频输入目前支持I2S主模式、I2S从模式、Tdm主模式、Tdm从模式,但芯片支持的工作模式不尽相同。

    • 每帧的采样点数

      当音频采样率较高时,建议相应地增加每帧的采样点数目。若发现采集到的声音断续,则需要增大每帧的采样点数。

    • 通道数目

      通道数目指声道数,1为单声道,2为立体声。

    • I2S的配置参数

      I2S的配置参数指定I2S Mclk的频率、I2S传输的数据格式、I2S使用的是4-wire mode还是6-wire mode,I2S的Tdm slot数以及I2S收发数据的位宽。

  • 举例

    下面的代码实现初始化AO设备、送一帧音频数据、反初始化AO设备

    1.  MI_S32 ret;
    
    2.  MI_AUDIO_Attr_t stAttr;
    
    3.  MI_AUDIO_Attr_t stGetAttr;
    
    4.  MI_AUDIO_DEV AoDevId = 0;
    
    5.  MI_AO_CHN AoChn = 0;
    
    6.  MI_U8 u8Buf[1024];
    
    7.  MI_AUDIO_Frame_t stAoSendFrame;
    
    8.  stAttr.eBitwidth = E_MI_AUDIO_BIT_WIDTH_16;
    
    9.  stAttr.eSamplerate = E_MI_AUDIO_SAMPLE_RATE_8000;
    
    10. stAttr.eSoundmode = E_MI_AUDIO_SOUND_MODE_MONO;
    
    11. stAttr.eWorkmode = E_MI_AUDIO_MODE_I2S_MASTER;
    
    12. stAttr.u32PtNumPerFrm = 1024;
    
    13. stAttr.u32ChnCnt = 1;
    
    14. MI_SYS_Init();
    
    15. /* set ao public attr */
    
    16. ret = MI_AO_SetPubAttr(AoDevId, &stAttr);
    
    17. if(MI_SUCCESS != ret)
    
    18. {
    
    19.     printf("set ao %d attr err:0x%x\n", AoDevId, ret);
    
    20.     return ret;
    
    21. }
    
    22. ret = MI_AO_GetPubAttr(AoDevId, &stGetAttr);
    
    23. if(MI_SUCCESS != ret)
    
    24. {
    
    25.     printf("get ao %d attr err:0x%x\n", AoDevId, ret);
    
    26.     return ret;
    
    27. }
    
    28. /* enable ao device */
    
    29. ret = MI_AO_Enable(AoDevId);
    
    30. if(MI_SUCCESS != ret)
    
    31. {
    
    32.     printf("enable ao dev %d err:0x%x\n", AoDevId, ret);
    
    33.     return ret;
    
    34. }
    
    35. ret = MI_AO_EnableChn(AoDevId, AoChn);
    
    36. if (MI_SUCCESS != ret)
    
    37. {
    
    38.     printf("enable ao dev %d chn %d err:0x%x\n", AoDevId, AoChn, ret);
    
    39.     return ret;
    
    40. }
    
    41. memset(&stAoSendFrame, 0x0, sizeof(MI_AUDIO_Frame_t));
    
    42. stAoSendFrame.u32Len = 1024;
    
    43. stAoSendFrame.apVirAddr[0] = u8Buf;
    
    44. stAoSendFrame.apVirAddr[1] = NULL;
    
    45. do{
    
    46.     ret = MI_AO_SendFrame(AoDevId, AoChn, &stAoSendFrame, -1);
    
    47. }while(ret == MI_AO_ERR_NOBUF);
    
    48. ret = MI_AO_DisableChn(AoDevId, AoChn);
    
    49. if (MI_SUCCESS != ret)
    
    50. {
    
    51.     printf("disable ao dev %d chn %d err:0x%x\n", AoDevId, AoChn, ret);
    
    52.     return ret;
    
    53. }
    
    54. /* disable ao device */
    
    55. ret = MI_AO_Disable(AoDevId);
    
    56. if(MI_SUCCESS != ret)
    
    57. {
    
    58.     printf("disable ao dev %d err:0x%x\n", AoDevId, ret);
    
    59.     return ret;
    
    60. }
    
    61. MI_SYS_Exit();
    

2.3. MI_AO_GetPubAttr

  • 功能

    获取AO设备属性。

  • 语法

    MI_S32 MI_AO_GetPubAttr(MI_AUDIO_DEV AoDevId,  MI_AUDIO_Attr_t *pstAttr);
    
  • 形参

    表2-3

    参数名称 描述 输入/输出
    AoDevId 音频设备号 输入
    pstAttr AO设备属性指针。 输出
  • 返回值

    • 0 成功。

    • 非0 失败,参照错误码

  • 依赖

    • 头文件: mi_ao.h

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

  • 注意

    • 获取的属性为前一次配置的属性。

    • 如果从来没有配置过属性,则返回失败。

  • 举例

    请参考MI_AO_SetPubAttr举例部分。


2.4. MI_AO_Enable

  • 功能

    启用AO设备。

  • 语法

    MI_S32 MI_AO_Enable(MI_AUDIO_DEV AoDevId);
    
  • 形参

    表2-4

    参数名称 描述 输入/输出
    AoDevId 音频设备号 输入
  • 返回值

  • 依赖

    • 头文件: mi_ao.h

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

  • 注意

    • 必须在启用前配置AO设备属性,否则返回属性未配置错误

    • 如果AO设备已经处于启用状态,则直接返回成功。

  • 举例

    请参考MI_AO_SetPubAttr 的举例部分。


2.5. MI_AO_Disable

  • 功能

    禁用AO设备。

  • 语法

    MI_S32 MI_AO_Disable(MI_AUDIO_DEV AoDevId);
    
  • 形参

    表2-5

    参数名称 描述 输入/输出
    AoDevId 音频设备号 输入
  • 返回值

    • 0 成功。

    • 非0 失败,参照错误码

  • 依赖

    • 头文件: mi_ao.h

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

  • 注意

    • 如果AO设备已经处于禁用状态,则直接返回成功

    • 禁用AO设备前必须先禁用该设备下已启用的所有AO通道

    • 只要是修改设备属性,都必须先调用MI_AO_Disable,再重新设置设备属性,使用AO设备/通道。

  • 举例

    请参考MI_AO_SetPubAttr 的举例部分。


2.6. MI_AO_EnableChn

  • 功能

    启用AO通道

  • 语法

    MI_S32 MI_AO_EnableChn(MI_AUDIO_DEV AoDevId, MI_AO_CHN  AoChn);
    
  • 形参

    表2-6

    参数名称 描述 输入/输出
    AoDevId 音频设备号 输入
    AoChn 音频输出通道号 输入
  • 返回值

  • 依赖

    • 头文件: mi_ao.h

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

  • 注意

    • 启用AO通道前,必须先启用其所属的AO设备,否则返回设备未启动的错误码
  • 举例

    请参考MI_AO_SetPubAttr 的举例部分。


2.7. MI_AO_DisableChn

  • 功能

    禁用AI通道

  • 语法

    MI_S32 MI_AO_DisableChn( AoDevId, AoChn);
    
  • 形参

    表2-7

    参数名称 描述 输入/输出
    AoDevId 音频设备号 输入
    AoChn 音频输出通道号 输入
  • 返回值

    • 0 成功。

    • 非0 失败,参照错误码

  • 依赖

    • 头文件: mi_ao.h

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

  • 注意

    在禁用AO通道前,需要将该通道上使能的音频算法禁用。

  • 举例

    请参考MI_AO_SetPubAttr 的举例部分。


2.8. MI_AO_SendFrame

  • 功能

    发送AO 音频帧。

  • 语法

    MI_S32 MI_AO_SendFrame(MI_AUDIO_DEV AoDevId, MI_AO_CHN AoChn, *pstData, MI_S32 s32MilliSec);
    
  • 形参

    表2-8

    参数名称 描述 输入/输出
    AoDevId 音频设备号 输入
    AoChn 音频输出通道号。 仅支持使用通道0。 输入
    pstData 音频帧结构体指针。 输入
    s32MilliSec 设置数据的超时时间
    -1 表示阻塞模式,无数据时一直等待;
    0 表示非阻塞模式,无数据时则报错返回;
    >0表示阻塞s32MilliSec毫秒,超时则报错返回。
    输入
  • 返回值

    • 0 成功。

    • 非0 失败,参照错误码

  • 依赖

    • 头文件: mi_ao.h

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

  • 注意

    • s32MilliSec 的值必须大于等于-1,等于-1 时采用阻塞模式发送数据,等于0时采用非阻塞模式发送数据,大于0时,阻塞s32MilliSec 毫秒后,仍然发送不成功则返回超时并报错

    • 调用该接口发送音频帧到AO 输出时,必须先使能对应的AO 通道。

  • 举例

    请参考MI_AO_SetPubAttr 的举例部分。


2.9. MI_AO_PauseChn

  • 功能

    暂停AO 通道

  • 语法

    MI_S32 MI_AO_PauseChn(MI_AUDIO_DEV AoDevId, MI_AO_CHN AoChn);
    
  • 形参

    表2-9

    参数名称 描述 输入/输出
    AoDevId 音频设备号 输入
    AoChn 音频输入通道号 输入
  • 返回值

    • 0 成功。

    • 非0 失败,参照错误码

  • 依赖

    • 头文件: mi_ao.h

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

  • 注意

    • AO 通道为禁用状态时,不允许调用此接口暂停AO通道。
  • 举例

    下面的代码实现暂停和恢复AO播放。

    1.  MI_S32 ret;  
    2.  MI_AUDIO_Attr_t stAttr;  
    3.  MI_AUDIO_Attr_t stGetAttr;  
    4.  MI_AUDIO_DEV AoDevId = 0;  
    5.  MI_AO_CHN AoChn = 0;  
    6.  MI_U8 u8Buf[1024];  
    7.  MI_AUDIO_Frame_t stAoSendFrame;  
    8.    
    9.  stAttr.eBitwidth = E_MI_AUDIO_BIT_WIDTH_16;  
    10. stAttr.eSamplerate = E_MI_AUDIO_SAMPLE_RATE_8000;  
    11. stAttr.eSoundmode = E_MI_AUDIO_SOUND_MODE_MONO;  
    12. stAttr.eWorkmode = E_MI_AUDIO_MODE_I2S_MASTER;  
    13. stAttr.u32PtNumPerFrm = 1024;  
    14. stAttr.u32ChnCnt = 1;  
    15.   
    16. MI_SYS_Init();  
    17.   
    18. /* set ao public attr*/  
    19. ret = MI_AO_SetPubAttr(AoDevId, &stAttr);  
    20. if(MI_SUCCESS != ret)  
    21. {  
    22.     printf("set ao %d attr err:0x%x\n", AoDevId, ret);  
    23.     return ret;  
    24. }  
    25.   
    26. ret = MI_AO_GetPubAttr(AoDevId, &stGetAttr);  
    27. if(MI_SUCCESS != ret)  
    28. {  
    29.     printf("get ao %d attr err:0x%x\n", AoDevId, ret);  
    30.     return ret;  
    31. }  
    32.   
    33. /* enable ao device*/  
    34. ret = MI_AO_Enable(AoDevId);  
    35. if(MI_SUCCESS != ret)  
    36. {  
    37.     printf("enable ao dev %d err:0x%x\n", AoDevId, ret);  
    38.     return ret;  
    39. }  
    40.   
    41. ret = MI_AO_EnableChn(AoDevId, AoChn);  
    42. if (MI_SUCCESS != ret)  
    43. {  
    44.     printf("enable ao dev %d chn %d err:0x%x\n", AoDevId, AoChn, ret);  
    45.     return ret;  
    46. }  
    47.   
    48. memset(&stAoSendFrame, 0x0, sizeof(MI_AUDIO_Frame_t));  
    49. stAoSendFrame.u32Len = 1024;  
    50. stAoSendFrame.apVirAddr[0] = u8Buf;  
    51. stAoSendFrame.apVirAddr[1] = NULL;  
    52.   
    53. do{  
    54.     ret = MI_AO_SendFrame(AoDevId, AoChn, &stAoSendFrame, -1);  
    55. }while(ret == MI_AO_ERR_NOBUF);  
    56.   
    57. ret = MI_AO_PauseChn(AoDevId, AoChn);  
    58. if (MI_SUCCESS != ret)  
    59. {  
    60.     printf("pause ao dev %d chn %d err:0x%x\n", AoDevId, AoChn, ret);  
    61.     return ret;  
    62. }  
    63.   
    64. ret = MI_AO_ResumeChn(AoDevId, AoChn);  
    65. if (MI_SUCCESS != ret)  
    66. {  
    67.     printf("resume ao dev %d chn %d err:0x%x\n", AoDevId, AoChn, ret);  
    68.     return ret;  
    69. }  
    70.   
    71. ret = MI_AO_DisableChn(AoDevId, AoChn);  
    72. if (MI_SUCCESS != ret)  
    73. {  
    74.     printf("disable ao dev %d chn %d err:0x%x\n", AoDevId, AoChn, ret);  
    75.     return ret;  
    76. }  
    77.   
    78. /* disable ao device */  
    79. ret = MI_AO_Disable(AoDevId);  
    80. if(MI_SUCCESS != ret)  
    81. {  
    82.     printf("disable ao dev %d err:0x%x\n", AoDevId, ret);  
    83.     return ret;  
    84. }  
    85.   
    86. MI_SYS_Exit();
    

2.10. MI_AO_ResumeChn

  • 功能

    恢复AO 通道。

  • 语法

    MI_S32 MI_AO_ResumeChn (MI_AUDIO_DEV AoDevId,   MI_AO_CHN AoChn);
    
  • 形参

    表2-10

    参数名称 描述 输入/输出
    AoDevId 音频设备号 输入
    AoChn 音频输入通道号 输入
  • 返回值

    • 0 成功。

    • 非0 失败,参照错误码

  • 依赖

    • 头文件: mi_ao.h

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

  • 注意

    • AO 通道暂停后可以通过调用此接口重新恢复。

    • AO 通道为暂停状态或使能状态下,调用此接口返回成功;否则调用将返回错误。

  • 举例

    请参考MI_AO_PauseChn举例部分。


2.11. MI_AO_ClearChnBuf

  • 功能

    清除AO 通道中当前的音频数据缓存。

  • 语法

    MI_S32 MI_AO_ClearChnBuf (MI_AUDIO_DEV AoDevId,   MI_AO_CHN AoChn);
    
  • 形参

    表2-11

    参数名称 描述 输入/输出
    AoDevId 音频设备号 输入
    AoChn 音频输入通道号 输入
  • 返回值

  • 依赖

    • 头文件: mi_ao.h

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

  • 注意

    • AO通道成功启用后再调用此接口。
  • 举例

    下面的代码实现获取AO通道缓存情况并清除缓存。

    1.  MI_S32 ret;  
    2.  MI_AUDIO_Attr_t stAttr;  
    3.  MI_AUDIO_Attr_t stGetAttr;  
    4.  MI_AUDIO_DEV AoDevId = 0;  
    5.  MI_AO_CHN AoChn = 0;  
    6.  MI_U8 u8Buf[1024];  
    7.  MI_AUDIO_Frame_t stAoSendFrame;  
    8.  MI_AO_ChnState_t stStatus;  
    9.    
    10. stAttr.eBitwidth = E_MI_AUDIO_BIT_WIDTH_16;  
    11. stAttr.eSamplerate = E_MI_AUDIO_SAMPLE_RATE_8000;  
    12. stAttr.eSoundmode = E_MI_AUDIO_SOUND_MODE_MONO;  
    13. stAttr.eWorkmode = E_MI_AUDIO_MODE_I2S_MASTER;  
    14. stAttr.u32PtNumPerFrm = 1024;  
    15. stAttr.u32ChnCnt = 1;  
    16.   
    17. MI_SYS_Init();  
    18.   
    19. /* set ao public attr*/  
    20. ret = MI_AO_SetPubAttr(AoDevId, &stAttr);  
    21. if(MI_SUCCESS != ret)  
    22. {  
    23.     printf("set ao %d attr err:0x%x\n", AoDevId, ret);  
    24.     return ret;  
    25. }  
    26.   
    27. ret = MI_AO_GetPubAttr(AoDevId, &stGetAttr);  
    28. if(MI_SUCCESS != ret)  
    29. {  
    30.     printf("get ao %d attr err:0x%x\n", AoDevId, ret);  
    31.     return ret;  
    32. }  
    33.   
    34. /* enable ao device*/  
    35. ret = MI_AO_Enable(AoDevId);  
    36. if(MI_SUCCESS != ret)  
    37. {  
    38.     printf("enable ao dev %d err:0x%x\n", AoDevId, ret);  
    39.     return ret;  
    40. }  
    41.   
    42. /* enable ao chn */  
    43. ret = MI_AO_EnableChn(AoDevId, AoChn);  
    44. if (MI_SUCCESS != ret)  
    45. {  
    46.     printf("enable ao dev %d chn %d err:0x%x\n", AoDevId, AoChn, ret);  
    47.     return ret;  
    48. }  
    49.   
    50. /* send frame */  
    51. memset(&stAoSendFrame, 0x0, sizeof(MI_AUDIO_Frame_t));  
    52. stAoSendFrame.u32Len = 1024;  
    53. stAoSendFrame.apVirAddr[0] = u8Buf;  
    54. stAoSendFrame.apVirAddr[1] = NULL;  
    55.   
    56. do{  
    57.     ret = MI_AO_SendFrame(AoDevId, AoChn, &stAoSendFrame, -1);  
    58. }while(ret == MI_AO_ERR_NOBUF);  
    59.   
    60. /* get chn stat */  
    61. ret = MI_AO_QueryChnStat(AoDevId, AoChn, &stStatus);  
    62. if (MI_SUCCESS != ret)  
    63. {  
    64.     printf("query chn status ao dev %d chn %d err:0x%x\n", AoDevId, AoChn, ret);  
    65.     return ret;  
    66. }  
    67.   
    68. /* clear chn buf */  
    69. ret = MI_AO_ClearChnBuf(AoDevId, AoChn);  
    70. if (MI_SUCCESS != ret)  
    71. {  
    72.     printf("clear chn buf ao dev %d chn %d err:0x%x\n", AoDevId, AoChn, ret);  
    73.     return ret;  
    74. }  
    75.   
    76. /* disable ao chn */  
    77. ret = MI_AO_DisableChn(AoDevId, AoChn);  
    78. if (MI_SUCCESS != ret)  
    79. {  
    80.     printf("disable ao dev %d chn %d err:0x%x\n", AoDevId, AoChn, ret);  
    81.     return ret;  
    82. }  
    83.   
    84. /* disable ao device */  
    85. ret = MI_AO_Disable(AoDevId);  
    86. if(MI_SUCCESS != ret)  
    87. {  
    88.     printf("disable ao dev %d err:0x%x\n", AoDevId, ret);  
    89.     return ret;  
    90. }  
    91.   
    92. MI_SYS_Exit();
    

2.12. MI_AO_QueryChnStat

  • 功能

    查询AO 通道中当前的音频数据缓存状态。

  • 语法

    MI_S32 MI_AO_QueryChnStat(MI_AUDIO_DEV AoDevId,  MI_AO_CHN AoChn, MI_AO_ChnState_t  *pstStatus);
    
  • 形参

    表2-12

    参数名称 描述 输入/输出
    AoDevId 音频设备号 输入
    AoChn 音频输出通道号 输入
    pstStatus 缓存状态结构体指针 输出
  • 返回值

    • 0 成功。

    • 非0 失败,参照错误码

  • 依赖

    • 头文件: mi_ao.h

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

  • 注意

    • AO通道成功启用后再调用此接口。
  • 举例

    请参考MI_AO_ClearChnBuf 举例部分。


2.13. MI_AO_SetVolume

  • 功能

    设置AO设备/通道音量大小。

  • 语法

    MI_AO API Version <= 2.13:
    MI_S32 MI_AO_SetVolume(MI_AUDIO_DEV AoDevId, MI_S32 s32VolumeDb);
    
    MI_AO API Version为2.14:
    MI_S32 MI_AO_SetVolume(MI_AUDIO_DEV AoDevId, MI_S32 s32VolumeDb, MI_AO_GainFading_e eFading);
    
    MI_AO API Version >= 2.15
    MI_S32 MI_AO_SetVolume(MI_AUDIO_DEV AoDevId, MI_AO_CHN AoChn, MI_S32 s32VolumeDb, MI_AO_GainFading_e eFading);
    
  • 形参

    表2-13

    参数名称 描述 输入/输出
    AoDevId 音频设备号 输入
    AoChn 音频通道号 输入
    s32VolumeDb 音频设备音量大小(-60 – 30,以dB为单位) 输入
    eFading 音频增益变化的速度 输入
  • 返回值

    • 0 成功。

    • 非0 失败,参照错误码

  • 依赖

    • 头文件: mi_ao.h

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

  • 注意

    • AO设备成功启用后再调用此接口。
  • 举例

    下面的代码实现设置或获取AO的音量参数

    1.  MI_S32 ret;  
    2.  MI_AUDIO_Attr_t stAttr;  
    3.  MI_AUDIO_Attr_t stGetAttr;  
    4.  MI_AUDIO_DEV AoDevId = 0;  
    5.  MI_AO_CHN AoChn = 0;  
    6.  MI_U8 u8Buf[1024];  
    7.  MI_AUDIO_Frame_t stAoSendFrame;  
    8.  MI_S32 s32VolumeDb = 0;  
    9.    
    10. stAttr.eBitwidth = E_MI_AUDIO_BIT_WIDTH_16;  
    11. stAttr.eSamplerate = E_MI_AUDIO_SAMPLE_RATE_8000;  
    12. stAttr.eSoundmode = E_MI_AUDIO_SOUND_MODE_MONO;  
    13. stAttr.eWorkmode = E_MI_AUDIO_MODE_I2S_MASTER;  
    14. stAttr.u32PtNumPerFrm = 1024;  
    15. stAttr.u32ChnCnt = 1;  
    16.   
    17. MI_SYS_Init();  
    18.   
    19. /* set ao public attr*/  
    20. ret = MI_AO_SetPubAttr(AoDevId, &stAttr);  
    21. if(MI_SUCCESS != ret)  
    22. {  
    23.     printf("set ao %d attr err:0x%x\n", AoDevId, ret);  
    24.     return ret;  
    25. }  
    26.   
    27. ret = MI_AO_GetPubAttr(AoDevId, &stGetAttr);  
    28. if(MI_SUCCESS != ret)  
    29. {  
    30.     printf("get ao %d attr err:0x%x\n", AoDevId, ret);  
    31.     return ret;  
    32. }  
    33.   
    34. /* enable ao device*/  
    35. ret = MI_AO_Enable(AoDevId);  
    36. if(MI_SUCCESS != ret)  
    37. {  
    38.     printf("enable ao dev %d err:0x%x\n", AoDevId, ret);  
    39.     return ret;  
    40. }  
    41.   
    42. /* enable ao chn */  
    43. ret = MI_AO_EnableChn(AoDevId, AoChn);  
    44. if (MI_SUCCESS != ret)  
    45. {  
    46.     printf("enable ao dev %d chn %d err:0x%x\n", AoDevId, AoChn, ret);  
    47.     return ret;  
    48. }  
    49.   
    50. /* set ao volume */  
    51. ret = MI_S32 MI_AO_SetVolume(AoDevId, AoChn, s32VolumeDb, E_MI_AO_GAIN_FADING_OFF);  
    52. if (MI_SUCCESS != ret)  
    53. {  
    54.     printf("set volume ao dev %d chn %d err:0x%x\n", AoDevId, AoChn, ret);  
    55.     return ret;  
    56. }  
    57.   
    58. /* get ao volume */ 
    59. ret = MI_S32 MI_AO_GetVolume(AoDevId, AoChn, &s32VolumeDb);  
    60. if (MI_SUCCESS != ret)  
    61. {  
    62.     printf("get volume ao dev %d chn %d err:0x%x\n", AoDevId, AoChn, ret);  
    63.     return ret;  
    64. }  
    65.   
    66. 
    67.   
    68. /* send frame */  
    69. memset(&stAoSendFrame, 0x0, sizeof(MI_AUDIO_Frame_t));  
    70. stAoSendFrame.u32Len = 1024;  
    71. stAoSendFrame.apVirAddr[0] = u8Buf;  
    72. stAoSendFrame.apVirAddr[1] = NULL;  
    73.   
    74. do{  
    75.     ret = MI_AO_SendFrame(AoDevId, AoChn, &stAoSendFrame, -1);  
    76. }while(ret == MI_AO_ERR_NOBUF);  
    77.   
    78.   
    79. /* disable ao chn */  
    80. ret = MI_AO_DisableChn(AoDevId, AoChn);  
    81. if (MI_SUCCESS != ret)  
    82. {  
    83.     printf("disable ao dev %d chn %d err:0x%x\n", AoDevId, AoChn, ret);  
    84.     return ret;  
    85. }  
    86.   
    87. /* disable ao device */  
    88. ret = MI_AO_Disable(AoDevId);  
    89. if(MI_SUCCESS != ret)  
    90. {  
    91.     printf("disable ao dev %d err:0x%x\n", AoDevId, ret);  
    92.     return ret;  
    93. }  
    94.   
    95. MI_SYS_Exit();
    

2.14. MI_AO_GetVolume

  • 功能

    获取AO设备/通道音量大小。

  • 语法

    MI_AO API Version <= 2.14:
    
    MI_S32 MI_AO_GetVolume(MI_AUDIO_DEV AoDevId, MI_S32   *ps32VolumeDb);
    
    MI_AO API Version >= 2.15:
    
    MI_S32 MI_AO_GetVolume(MI_AUDIO_DEV AoDevId, MI_AO_CHN AoChn, MI_S32 *ps32VolumeDb);
    
  • 形参

    表2-14

    参数名称 描述 输入/输出
    AoDevId 音频设备号 输入
    AoChn 音频通道号 输入
    ps32VolumeDb 音频设备音量大小指针 输出
  • 返回值

    • 0 成功。

    • 非0 失败,参照错误码

  • 依赖

    • 头文件: mi_ao.h

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

  • 注意

    • AO设备成功启用后再调用此接口。
  • 举例

    请参考MI_AO_SetVolume的举例部分。


2.15. MI_AO_SetMute

  • 功能

    设置AO 设备/通道的静音状态。

  • 语法

    MI_AO API Version <= 2.14:
    
    MI_S32 MI_AO_SetMute(MI_AUDIO_DEV AoDevId, MI_BOOL   bEnable);
    
    MI_AO API Version >= 2.15:
    
    MI_S32 MI_AO_SetMute(MI_AUDIO_DEV AoDevId, MI_AO_CHN AoChn, MI_BOOL bEnable);
    
  • 形参

    表2-15

    参数名称 描述 输入/输出
    AoDevId 音频设备号 输入
    AoChn 音频通道号 输入
    bEnable 音频设备是否启用静音
    TRUE:启用静音功能; FALSE:关闭静音功能。
    输入
  • 返回值

    • 0 成功。

    • 非0 失败,参照错误码

  • 依赖

    • 头文件: mi_ao.h

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

  • 注意

    • AO设备成功启用后再调用此接口。
  • 举例

    下面的代码实现获取和设置静音状态。

    1.  MI_S32 ret;  
    2.  MI_AUDIO_Attr_t stAttr;  
    3.  MI_AUDIO_Attr_t stGetAttr;  
    4.  MI_AUDIO_DEV AoDevId = 0;  
    5.  MI_AO_CHN AoChn = 0;  
    6.  MI_U8 u8Buf[1024];  
    7.  MI_AUDIO_Frame_t stAoSendFrame;  
    8.  MI_BOOL bMute = TRUE;  
    9.    
    10. stAttr.eBitwidth = E_MI_AUDIO_BIT_WIDTH_16;  
    11. stAttr.eSamplerate = E_MI_AUDIO_SAMPLE_RATE_8000;  
    12. stAttr.eSoundmode = E_MI_AUDIO_SOUND_MODE_MONO;  
    13. stAttr.eWorkmode = E_MI_AUDIO_MODE_I2S_MASTER;  
    14. stAttr.u32PtNumPerFrm = 1024;  
    15. stAttr.u32ChnCnt = 1;  
    16.   
    17. MI_SYS_Init();  
    18.   
    19. /* set ao public attr*/  
    20. ret = MI_AO_SetPubAttr(AoDevId, &stAttr);  
    21. if(MI_SUCCESS != ret)  
    22. {  
    23.     printf("set ao %d attr err:0x%x\n", AoDevId, ret);  
    24.     return ret;  
    25. }  
    26.   
    27. ret = MI_AO_GetPubAttr(AoDevId, &stGetAttr);  
    28. if(MI_SUCCESS != ret)  
    29. {  
    30.     printf("get ao %d attr err:0x%x\n", AoDevId, ret);  
    31.     return ret;  
    32. }  
    33.   
    34. /* enable ao device*/  
    35. ret = MI_AO_Enable(AoDevId);  
    36. if(MI_SUCCESS != ret)  
    37. {  
    38.     printf("enable ao dev %d err:0x%x\n", AoDevId, ret);  
    39.     return ret;  
    40. }  
    41.   
    42. /* enable ao chn */  
    43. ret = MI_AO_EnableChn(AoDevId, AoChn);  
    44. if (MI_SUCCESS != ret)  
    45. {  
    46.     printf("enable ao dev %d chn %d err:0x%x\n", AoDevId, AoChn, ret);  
    47.     return ret;  
    48. }  
    49.   
    50. /* set ao mute */  
    51. ret = MI_AO_SetMute(AoDevId, AoChn, bMute);  
    52. if (MI_SUCCESS != ret)  
    53. {  
    54.     printf("mute ao dev %d Chn%d err:0x%x\n", AoDevId, AoChn, ret);  
    55.     return ret;  
    56. }  
    57.   
    58. /* get ao mute status */  
    59. ret = MI_AO_GetMute(AoDevId, AoChn, &bMute);  
    60. if (MI_SUCCESS != ret)  
    61. {  
    62.     printf("get mute status ao dev %d Chn %d err:0x%x\n", AoDevId, AoChn, ret);  
    63.     return ret;  
    64. }  
    65.   
    66. /* send frame */  
    67. memset(&stAoSendFrame, 0x0, sizeof(MI_AUDIO_Frame_t));  
    68. stAoSendFrame.u32Len = 1024;  
    69. stAoSendFrame.apVirAddr[0] = u8Buf;  
    70. stAoSendFrame.apVirAddr[1] = NULL;  
    71.   
    72. do{  
    73.     ret = MI_AO_SendFrame(AoDevId, AoChn, &stAoSendFrame, -1);  
    74. }while(ret == MI_AO_ERR_NOBUF);  
    75.   
    76.   
    77. /* disable ao chn */  
    78. ret = MI_AO_DisableChn(AoDevId, AoChn);  
    79. if (MI_SUCCESS != ret)  
    80. {  
    81.     printf("disable ao dev %d chn %d err:0x%x\n", AoDevId, AoChn, ret);  
    82.     return ret;  
    83. }  
    84.   
    85. /* disable ao device */  
    86. ret = MI_AO_Disable(AoDevId);  
    87. if(MI_SUCCESS != ret)  
    88. {  
    89.     printf("disable ao dev %d err:0x%x\n", AoDevId, ret);  
    90.     return ret;  
    91. }  
    92.   
    93. MI_SYS_Exit();
    

2.16. MI_AO_GetMute

  • 功能

    获取AO 设备/通道的静音状态。

  • 语法

    MI_AO API Version <= 2.14:
    
    MI_S32 MI_AO_GetMute(MI_AUDIO_DEV AoDevId, MI_BOOL   *pbEnable);
    
    MI_AO API Version >= 2.15:
    
    MI_S32 MI_AO_GetMute(MI_AUDIO_DEV AoDevId, MI_AO_CHN AoChn, MI_BOOL *pbEnable);
    
  • 形参

    表2-16

    参数名称 描述 输入/输出
    AoDevId 音频设备号 输入
    AoChn 音频通道号 输入
    p**bEnable** 音频设备静音状态指针 输出
  • 返回值

    • 0 成功。

    • 非0 失败,参照错误码

  • 依赖

    • 头文件: mi_ao.h

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

  • 注意

    • AO设备成功启用后再调用此接口。
  • 举例

    请参考MI_AO_SetMute举例部分


2.17. MI_AO_ClrPubAttr

  • 功能

    清除AO设备属性。

  • 语法

    MI_S32 MI_AO_ClrPubAttr(MI_AUDIO_DEV AoDevId);
    
  • 形参

    表2-17

    参数名称 描述 输入/输出
    AoDevId 音频设备号 输入
  • 返回值

    • 0 成功。

    • 非0 失败,参照错误码

  • 依赖

    • 头文件: mi_ao.h

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

  • 注意

    • 清除设备属性前,需要先停止设备。
  • 举例

    下面的代码实现设置和清除AO设备的属性。

    1.  MI_S32 ret;  
    2.  MI_AUDIO_Attr_t stAttr;  
    3.  MI_AUDIO_DEV AoDevId = 0;  
    4.    
    5.  stAttr.eBitwidth = E_MI_AUDIO_BIT_WIDTH_16;  
    6.  stAttr.eSamplerate = E_MI_AUDIO_SAMPLE_RATE_8000;  
    7.  stAttr.eSoundmode = E_MI_AUDIO_SOUND_MODE_MONO;  
    8.  stAttr.eWorkmode = E_MI_AUDIO_MODE_I2S_MASTER;  
    9.  stAttr.u32PtNumPerFrm = 1024;  
    10. stAttr.u32ChnCnt = 1;  
    11.   
    12. MI_SYS_Init();  
    13.   
    14. /* set ao public attr*/  
    15. ret = MI_AO_SetPubAttr(AoDevId, &stAttr);  
    16. if(MI_SUCCESS != ret)  
    17. {  
    18.     printf("set ao %d attr err:0x%x\n", AoDevId, ret);  
    19.     return ret;  
    20. }  
    21.   
    22. /* clear ao public attr */  
    23. ret = MI_AO_ClrPubAttr(AoDevId);  
    24. if (MI_SUCCESS != ret)  
    25. {  
    26.     printf("clear ao %d attr err:0x%x\n", AoDevId, ret);  
    27.     return ret;  
    28. }  
    29.   
    30. MI_SYS_Exit();
    

2.18. MI_AO_SetChnParam

  • 功能

    设置音频通道参数。

  • 语法

    MI_S32 MI_AO_SetChnParam(MI_AUDIO_DEV AoDevId,   MI_AO_CHN AoChn, MI_AO_ChnParam_t  *pstChnParam);
    
  • 形参

    表2-18

    参数名称 描述 输入/输出
    AoDevId 音频设备号 输入
    AoChn 音频输出通道号
    取值范围:[0, MI_AUDIO_MAX_CHN_NUM)
    输入
    pstChnParam 音频通道参数结构体指针 输入
  • 返回值

    • 0 成功。

    • 非0 失败,参照错误码

  • 依赖

    • 头文件: mi_ao.h

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

  • 举例

    下面的代码实现通道参数的设置和获取。

    1.  MI_S32 ret;  
    2.  MI_AUDIO_Attr_t stAttr;  
    3.  MI_AUDIO_Attr_t stGetAttr;  
    4.  MI_AUDIO_DEV AoDevId = 0;  
    5.  MI_AO_CHN AoChn = 0;  
    6.  MI_U8 u8Buf[1024];  
    7.  MI_AUDIO_Frame_t stAoSendFrame;  
    8.  MI_AO_ChnParam_t stChnParam;  
    9.    
    10.   
    11. stAttr.eBitwidth = E_MI_AUDIO_BIT_WIDTH_16;  
    12. stAttr.eSamplerate = E_MI_AUDIO_SAMPLE_RATE_8000;  
    13. stAttr.eSoundmode = E_MI_AUDIO_SOUND_MODE_MONO;  
    14. stAttr.eWorkmode = E_MI_AUDIO_MODE_I2S_MASTER;  
    15. stAttr.u32PtNumPerFrm = 1024;  
    16. stAttr.u32ChnCnt = 1;  
    17.   
    18. MI_SYS_Init();  
    19.   
    20. /* set ao public attr*/  
    21. ret = MI_AO_SetPubAttr(AoDevId, &stAttr);  
    22. if(MI_SUCCESS != ret)  
    23. {  
    24.     printf("set ao %d attr err:0x%x\n", AoDevId, ret);  
    25.     return ret;  
    26. }  
    27.   
    28. /* get ao public attr */  
    29. ret = MI_AO_GetPubAttr(AoDevId, &stGetAttr);  
    30. if(MI_SUCCESS != ret)  
    31. {  
    32.     printf("get ao %d attr err:0x%x\n", AoDevId, ret);  
    33.     return ret;  
    34. }  
    35.   
    36. /* enable ao device*/  
    37. ret = MI_AO_Enable(AoDevId);  
    38. if(MI_SUCCESS != ret)  
    39. {  
    40.     printf("enable ao dev %d err:0x%x\n", AoDevId, ret);  
    41.     return ret;  
    42. }  
    43.   
    44. /* enable ao chn */  
    45. ret = MI_AO_EnableChn(AoDevId, AoChn);  
    46. if (MI_SUCCESS != ret)  
    47. {  
    48.     printf("enable ao dev %d chn %d err:0x%x\n", AoDevId, AoChn, ret);  
    49.     return ret;  
    50. }  
    51.   
    52. memset(&stChnParam, 0x0, sizeof(stChnParam));  
    53. stChnParam.stChnGain.bEnableGainSet = TRUE;  
    54. stChnParam.stChnGain.s16Gain = 0;  
    55.   
    56. /* set chn param */  
    57. ret = MI_AO_SetChnParam(AoDevId, AoChn, &stChnParam);  
    58. if (MI_SUCCESS != ret)  
    59. {  
    60.     printf("set chn param ao dev %d chn %d err:0x%x\n", AoDevId, AoChn, ret);  
    61.     return ret;  
    62. }  
    63.   
    64. memset(&stChnParam, 0x0, sizeof(stChnParam));  
    65.   
    66. ret = MI_AO_GetChnParam(AoDevId, AoChn, &stChnParam);  
    67. if (MI_SUCCESS != ret)  
    68. {  
    69.     printf("get chn param ao dev %d chn %d err:0x%x\n", AoDevId, AoChn, ret);  
    70.     return ret;  
    71. }  
    72.   
    73. /* send frame */  
    74. memset(&stAoSendFrame, 0x0, sizeof(MI_AUDIO_Frame_t));  
    75. stAoSendFrame.u32Len = 1024;  
    76. stAoSendFrame.apVirAddr[0] = u8Buf;  
    77. stAoSendFrame.apVirAddr[1] = NULL;  
    78.   
    79. do{  
    80.     ret = MI_AO_SendFrame(AoDevId, AoChn, &stAoSendFrame, -1);  
    81. }while(ret == MI_AO_ERR_NOBUF);  
    82.   
    83. /* disable ao chn */  
    84. ret = MI_AO_DisableChn(AoDevId, AoChn);  
    85. if (MI_SUCCESS != ret)  
    86. {  
    87.     printf("disable ao dev %d chn %d err:0x%x\n", AoDevId, AoChn, ret);  
    88.     return ret;  
    89. }  
    90.   
    91. /* disable ao device */  
    92. ret = MI_AO_Disable(AoDevId);  
    93. if(MI_SUCCESS != ret)  
    94. {  
    95.     printf("disable ao dev %d err:0x%x\n", AoDevId, ret);  
    96.     return ret;  
    97. }  
    98.   
    99. MI_SYS_Exit();
    

2.19. MI_AO_GetChnParam

  • 功能

    获取音频通道参数。

  • 语法

    MI_S32 MI_AO_GetChnParam(MI_AUDIO_DEV AoDevId,   MI_AO_CHN AoChn, MI_AO_ChnParam_t  *pstChnParam);
    
  • 形参

    表2-19

    参数名称 描述 输入/输出
    AoDevId 音频设备号 输入
    AoChn 音频输出通道号
    取值范围:[0, MI_AUDIO_MAX_CHN_NUM)
    输入
    pstChnParam 音频通道参数结构体指针 输出
  • 返回值

    • 0 成功。

    • 非0 失败,参照错误码

  • 依赖

    • 头文件: mi_ao.h

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

  • 举例

    请参考MI_AO_SetChnParam举例部分。


2.20. MI_AO_SetSrcGain

  • 功能

    设置AO数据的回声参考增益。

  • 语法

    MI_S32 MI_AO_SetSrcGain(MI_AUDIO_DEV AoDevId, MI_S32   s32VolumeDb);
    
  • 形参

    表2-20

    参数名称 描述 输入/输出
    AoDevId 音频设备号 输入
    s32VolumeDb 音频设备音量大小(-60 - 30dB) 输入
  • 返回值

    • 0 成功。

    • 非0 失败,参照错误码

  • 依赖

    • 头文件: mi_ao.h

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

  • 注意

    • AO设备成功启用后再调用此接口。
  • 举例

    下面的代码实现设置Src gian。

    1.  MI_S32 ret;  
    2.  MI_AUDIO_Attr_t stAttr;  
    3.  MI_AUDIO_Attr_t stGetAttr;  
    4.  MI_AUDIO_DEV AoDevId = 0;  
    5.  MI_AO_CHN AoChn = 0;  
    6.  MI_U8 u8Buf[1024];  
    7.  MI_AUDIO_Frame_t stAoSendFrame;  
    8.    
    9.  stAttr.eBitwidth = E_MI_AUDIO_BIT_WIDTH_16;  
    10. stAttr.eSamplerate = E_MI_AUDIO_SAMPLE_RATE_8000;  
    11. stAttr.eSoundmode = E_MI_AUDIO_SOUND_MODE_MONO;  
    12. stAttr.eWorkmode = E_MI_AUDIO_MODE_I2S_MASTER;  
    13. stAttr.u32PtNumPerFrm = 1024;  
    14. stAttr.u32ChnCnt = 1;  
    15.   
    16. MI_SYS_Init();  
    17.   
    18. /* set ao public attr*/  
    19. ret = MI_AO_SetPubAttr(AoDevId, &stAttr);  
    20. if(MI_SUCCESS != ret)  
    21. {  
    22.     printf("set ao %d attr err:0x%x\n", AoDevId, ret);  
    23.     return ret;  
    24. }  
    25.   
    26. /* get ao public attr */  
    27. ret = MI_AO_GetPubAttr(AoDevId, &stGetAttr);  
    28. if(MI_SUCCESS != ret)  
    29. {  
    30.     printf("get ao %d attr err:0x%x\n", AoDevId, ret);  
    31.     return ret;  
    32. }  
    33.   
    34. /* enable ao device*/  
    35. ret = MI_AO_Enable(AoDevId);  
    36. if(MI_SUCCESS != ret)  
    37. {  
    38.     printf("enable ao dev %d err:0x%x\n", AoDevId, ret);  
    39.     return ret;  
    40. }  
    41.   
    42. ret = MI_AO_SetSrcGain(AoDevId, 0);  
    43. if(MI_SUCCESS != ret)  
    44. {  
    45.     printf("set src gain ao dev %d err:0x%x\n", AoDevId, ret);  
    46.     return ret;  
    47. }  
    48.   
    49. /* disable ao device */  
    50. ret = MI_AO_Disable(AoDevId);  
    51. if(MI_SUCCESS != ret)  
    52. {  
    53.     printf("disable ao dev %d err:0x%x\n", AoDevId, ret);  
    54.     return ret;  
    55. }  
    56.   
    57. MI_SYS_Exit();
    

2.21. MI_AO_InitDev

  • 功能

    初始化AO设备。

  • 语法

    MI_S32 MI_AO_InitDev(MI_AO_InitParam_t *pstInitParam);
    
  • 形参

    表2-21

    参数名称 描述 输入/输出
    pstInitParam 设备初始化参数 输入
  • 返回值

    • 0 成功。

    • 非0 失败,参照错误码

  • 依赖

    • 头文件: mi_ao.h

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

  • 注意

    本接口必须和MI_AO_DeinitDev成对使用,不可单独重复调用,否则返回失败。仅用于STR状态唤醒后重新初始化AO模块。


2.22. MI_AO_DeInitDev

  • 功能

    反初始化AO设备。

  • 语法

    MI_S32 MI_AO_DeInitDev(void);
    
  • 返回值

    • 0 成功。

    • 非0 失败,参照错误码

  • 依赖

    • 头文件: mi_ao.h

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

  • 注意

    • 此函数必须在初始化设备后调用,否则返回失败。

    • 如果本接口在app退出前没有调用,内部会自动反初始化设备。

    • 本接口必须和MI_AO_InitDev成对使用,不可单独重复调用,否则返回失败。


2.23. MI_AO_DupChn

  • 功能

    同步AO通道状态。

  • 语法

    MI_S32 MI_AO_DupChn(MI_AUDIO_DEV AoDevId, MI_AO_CHN AoChn)
    
  • 形参

    参数名称 描述 输入/输出
    AoDevId 音频设备号 输入
    AoChn 音频输入通道号。取值范围:[0, MI_AUDIO_MAX_CHN_NUM)。 输入
  • 返回值

    • 0 成功。

    • 非0 失败,参照错误码

  • 依赖

    • 头文件: mi_ao.h

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

  • 注意

    此接口仅适用于dual os环境。在rtos环境下已初始化AO通道,切换到Linux环境时,用于同步AO通道的状态。


3. AO 数据类型


3.1. AO模块相关数据类型定义

表3-1

数据类型 定义
MI_AUDIO_DEV 定义音频输入/输出设备编号
MI_AUDIO_MAX_CHN_NUM 定义音频输入/输出设备的最大通道数
MI_AO_CHN 定义音频输出通道
MI_AUDIO_SampleRate_e 定义音频采样率
MI_AUDIO_Bitwidth_e 定义音频采样精度
MI_AUDIO_Mode_e 定义音频输入输出工作模式
MI_AUDIO_SoundMode_e 定义音频声道模式
MI_AUDIO_I2sFmt_e 定义I2S传输的格式
MI_AUDIO_I2sMclk_e 定义I2S Mclk的时钟频率
MI_AUDIO_I2sConfig_t 定义I2S的相关配置信息
MI_AUDIO_Attr_t 定义音频输入输出设备属性结构体
MI_AO_ChnState_t 音频输出通道的数据缓存状态结构体
MI_AUDIO_Frame_t 定义音频帧数据结构体
MI_AO_ChnParam_t 定义音频通道属性结构体
MI_AO_ChnGainConfig_t 定义音频通道增益设置结构体
MI_AO_InitParam_t 定义音频设备初始化参数
MI_AO_GainFading_e 定义音频增益的变化速度

3.2. MI_AUDIO_DEV

  • 说明

    定义音频输入/输出设备编号。

  • 定义

    typedef MI_S32 MI_AUDIO_DEV
    
  • 注意事项

    以下为AO Dev ID和各个芯片物理设备的对照表

    表3-2

    0 1 2 3 4 5
    Pretzel(最多同时使用2个device id) Line outDAC0/1 I2s Tx
    Macaron(最多同时使用1个device id) Line outDAC0/1 I2s Tx
    Taiyaki(最多同时使用1个device id) Line outDAC0/1 I2s Tx Hdmi Hdmi + Line out
    Takoyaki (最多同时使用1个device id) Line outDAC0/1 I2s Tx Hdmi Hdmi + Line out
    Pudding (最多同时使用1个device id) Line outDAC0/1 I2s Tx
    Ispahan (最多同时使用1个device id) Line outDAC0/1 I2s Tx
    Tiramisu(最多同时使用2个device id) Line outDAC0/1 I2s Tx DAC0 DAC1 Hdmi+ Line out
    Ikayaki (最多同时使用2个device id) Line outDAC0/1 I2s Tx DAC0 DAC1 HeadPhone

    以下为不同系列chip的规格差异

    表3-3

    Line out I2S Tx Hdmi HeadPhone
    Pretzel 支持2路8/16/32/48KHz采样率 支持标准I2S模式和TDM模式,TDM模式可扩展到8路,支援4-wire 和6-wire 模式,可提供Mclk。支持8/16/32/48KHz采样率。 不支持 不支持
    Macaron 支持2路8/16/32/48KHz采样率 只支持标准I2S模式,且只能作为master,仅支持4-wire 模式,不可提供Mclk。支持8/16/32/48KHz采样率。 不支持 不支持
    Taiyaki 支持2路8/16/32/48KHz采样率 只支持标准I2S模式,且只能作为master,仅支持4-wire 模式,不可提供Mclk。支持8/16/32/48KHz采样率。 支持 不支持
    Takoyaki 支持2路8/16/32/48KHz采样率 只支持标准I2S模式,且只能作为master,仅支持4-wire 模式,不可提供Mclk。支持8/16/32/48KHz采样率。 支持 不支持
    Pudding 支持2路8/16/32/48KHz采样率 支持标准I2S模式和TDM模式,TDM模式可扩展到8路,支援4-wire 和6-wire 模式,可提供Mclk。支持8/16/32/48KHz采样率。 不支持 不支持
    Ispahan 支持2路8/16/32/48KHz采样率 只支持标准I2S模式,且只能作为master,仅支持4-wire 模式,不可提供Mclk。支持8/16/32/48KHz采样率。 不支持 不支持
    Tiramisu 支持4路8/16/32/48KHz采样率 支持标准I2S模式和TDM模式,TDM模式可扩展到8路,支援4-wire 和6-wire 模式,可提供Mclk。支持8/16/32/48KHz采样率。 支持 不支持
    Ikayaki 支持3路8/16/32/48KHz采样率 支持标准I2S模式和TDM模式,TDM模式可扩展到8路,支援4-wire 和6-wire 模式,可提供Mclk。支持8/16/32/48KHz采样率。 不支持 支持

3.3. MI_AUDIO_MAX_CHN_NUM

  • 说明

    定义音频输入/输出设备的最大通道数。

  • 定义

    #define MI_AUDIO_MAX_CHN_NUM 16
    

3.4. MI_AO_CHN

  • 说明

    定义音频输出通道。

  • 定义

    typedef MI_S32 MI_AO_CHN
    

3.5. MI_AUDIO_SampleRate_e

  • 说明

    定义音频采样率。

  • 定义

    typedef enum
    
    {
    
        E_MI_AUDIO_SAMPLE_RATE_8000 = 8000, /* 8kHz sampling rate */
    
        E_MI_AUDIO_SAMPLE_RATE_11052 = 11025, /* 11.025kHz sampling rate */
    
        E_MI_AUDIO_SAMPLE_RATE_12000 = 12000, /* 12kHz sampling rate */
    
        E_MI_AUDIO_SAMPLE_RATE_16000 = 16000, /* 16kHz sampling rate */
    
        E_MI_AUDIO_SAMPLE_RATE_22050 = 22050, /* 22.05kHz sampling rate */
    
        E_MI_AUDIO_SAMPLE_RATE_24000 = 24000, /* 24kHz sampling rate */
    
        E_MI_AUDIO_SAMPLE_RATE_32000 = 32000, /* 32kHz sampling rate */
    
        E_MI_AUDIO_SAMPLE_RATE_44100 = 44100, /* 44.1kHz sampling rate */
    
        E_MI_AUDIO_SAMPLE_RATE_48000 = 48000, /* 48kHz sampling rate */
    
        E_MI_AUDIO_SAMPLE_RATE_96000 = 96000, /* 96kHz sampling rate */
    
        E_MI_AUDIO_SAMPLE_RATE_INVALID,
    
    }MI_AUDIO_SampleRate_e;;
    
  • 成员

    表3-4

    成员名称 描述
    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采样率
  • 注意事项

    这里枚举值不是从0开始,而是与实际的采样率值相同。

  • 相关数据类型及接口

    MI_AUDIO_Attr_t


3.6. MI_AUDIO_Bitwidth_e

  • 说明

    定义音频采样精度。

  • 定义

    typedef enum
    
    {
    
        E_MI_AUDIO_BIT_WIDTH_16 =0, /* 16bit width */
    
        E_MI_AUDIO_BIT_WIDTH_24 =1, /* 24bit width */
    
        E_MI_AUDIO_BIT_WIDTH_32 =2, /* 32bit width */
    
        E_MI_AUDIO_BIT_WIDTH_MAX,
    
    }MI_AUDIO_BitWidth_e;
    
  • 成员

    表3-5

    成员名称 描述
    E_MI_AUDIO_BIT_WIDTH_16 采样精度为16bit 位宽
    E_MI_AUDIO_BIT_WIDTH_24 采样精度为24bit 位宽
    E_MI_AUDIO_BIT_WIDTH_32 采样精度为32bit 位宽
  • 注意事项

    目前芯片只支持16bit 位宽,但Pretzzel/Pudding/Tiramisu系列芯片的I2S可以支持32bit收发,且对于此系列芯片来说只有高16bit有效。


3.7. MI_AUDIO_Mode_e

  • 说明

    定义音频输入输出设备工作模式。

  • 定义

    typedef enum
    
    {
    
        E_MI_AUDIO_MODE_I2S_MASTER, /* I2S master mode */
    
        E_MI_AUDIO_MODE_I2S_SLAVE, /* I2S slave mode */
    
        E_MI_AUDIO_MODE_TDM_MASTER, /* TDM master mode */
    
        E_MI_AUDIO_MODE_TDM_SLAVE, /* TDM slave mode */
    
        E_MI_AUDIO_MODE_MAX,
    
    }MI_AUDIO_Mode_e;
    
  • 成员

    表3-6

    成员名称 描述
    E_MI_AUDIO_MODE_I2S_MASTER I2S主模式
    E_MI_AUDIO_MODE_I2S_SLAVE I2S从模式
    E_MI_AUDIO_MODE_TDM_MASTER TDM主模式
    E_MI_AUDIO_MODE_TDM_SLAVE TDM从模式
  • 注意事项

    主模式与从模式是否支持会依据不同的芯片而有区别。

  • 相关数据类型及接口

    MI_AUDIO_Attr_t


3.8. MI_AUDIO_SoundMode_e

  • 说明

    定义音频声道模式。

  • 定义

    typedef enum
    
    {
    
        E_MI_AUDIO_SOUND_MODE_MONO =0, /* mono */
    
        E_MI_AUDIO_SOUND_MODE_STEREO =1, /* stereo */
    
        E_MI_AUDIO_SOUND_MODE_QUEUE =2, /* queue */
    
        E_MI_AUDIO_SOUND_MODE_MAX,
    
    }MI_AUDIO_SoundMode_e
    
  • 成员

    表3-7

    成员名称 描述
    E_MI_AUDIO_SOUND_MODE_MONO 单声道
    E_MI_AUDIO_SOUND_MODE_STEREO 双声道
    E_MI_AUDIO_SOUND_MODE_QUEUE 此模式仅应用在音频采集
  • 相关数据类型及接口

    MI_AUDIO_Attr_t


3.9. MI_AUDIO_I2sFmt_e

  • 说明

    I2S 格式设定。

  • 定义

    typedef enum
    
    {
    
        E_MI_AUDIO_I2S_FMT_I2S_MSB,
    
        E_MI_AUDIO_I2S_FMT_LEFT_JUSTIFY_MSB,
    
    }MI_AUDIO_I2sFmt_e;
    
  • 成员

    表3-8

    成员名称 描述
    E_MI_AUDIO_I2S_FMT_I2S_MSB I2S 标准格式,最高位优先
    E_MI_AUDIO_I2S_FMT_LEFT_JUSTIFY_MSB I2S 左对齐格式,最高位优先
  • 相关数据类型及接口

    MI_AUDIO_I2sConfig_t


3.10. MI_AUDIO_I2sMclk_e

  • 说明

    I2S 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;
    
  • 成员

    表3-9

    成员名称 描述
    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.11. MI_AUDIO_I2sConfig_t

  • 说明

    定义I2S属性结构体。

  • 定义

    typedef struct MI_AUDIO_I2sConfig_s
    
    {
    
        MI_AUDIO_I2sFmt_e eFmt;
    
        MI_AUDIO_I2sMclk_e eMclk;
    
        MI_BOOL bSyncClock;
    
        MI_U32 u32TdmSlots;
    
        MI_AUDIO_BitWidth_e eI2sBitWidth;
    
    }MI_AUDIO_I2sConfig_t;
    
  • 成员

    表3-10

    成员名称 描述
    eFmt I2S 格式设置。 静态属性。
    eMclk I2S MCLK 时钟频率。 静态属性。
    bSyncClock AO 同步AI时钟 静态属性。
    u32TdmSlots I2S TDM slot的数目(仅TDM模式下有效)
    eI2sBitWidth I2S 收发的数据位宽(仅支持TDM模式的芯片有效)
  • 相关数据类型及接口

    MI_AUDIO_Attr_t


3.12. MI_AUDIO_Attr_t

  • 说明

    定义音频输入输出设备属性结构体。

  • 定义

    typedef struct MI_AUDIO_Attr_s
    
    {
    
        MI_AUDIO_SampleRate_e eSamplerate; /*sample rate*/
    
        MI_AUDIO_BitWidth_e eBitwidth; /*bitwidth*/
    
        MI_AUDIO_Mode_e eWorkmode; /*master or slave mode*/
    
        MI_AUDIO_SoundMode_e eSoundmode; /*momo or stereo*/
    
        MI_U32 u32FrmNum; /*frame num in buffer*/
    
        MI_U32 u32PtNumPerFrm; /*number of samples*/
    
        MI_U32 u32CodecChnCnt; /*channel number on Codec */
    
        MI_U32 u32ChnCnt;
    
        union{
    
            MI_AUDIO_I2sConfig_t stI2sConfig;
    
        }WorkModeSetting;
    
    }MI_AUDIO_Attr_t;
    
  • 成员

    表3-11

    成员名称 描述
    eSamplerate 音频采样率。 静态属性。
    eBitwidth 音频采样精度(从模式下,此参数必须和音频AD/DA 的采样精度匹配)。 静态属性。
    eWorkmode 音频输入输出工作模式。 静态属性。
    eSoundmode 音频声道模式。 静态属性。
    u32FrmNum 缓存帧数目。 保留,未使用。
    u32PtNumPerFrm 每帧的采样点个数。 取值范围为:128, 128*2,…,128*N。 静态属性。
    u32CodecChnCnt 支持的codec通道数目。 保留,未使用。
    u32ChnCnt 支持的通道数目,实际可使能的最大通道数。取值:1、2、4、8、16。(输入最多支持MI_AUDIO_MAX_CHN_NUM 个通道,输出最多支持2 个通道)
    stI2sConfig; 设置I2S 工作属性
  • 相关数据类型及接口

    MI_AO_SetPubAttr


3.13. MI_AO_ChnState_t

  • 说明

    音频输出通道的数据缓存状态结构体。

  • 定义

    typedef struct MI_AO_ChnState_s

    {

    MI_U32 u32ChnTotalNum;
    
    MI_U32 u32ChnFreeNum;
    
    MI_U32 u32ChnBusyNum;
    

    } MI_AO_ChnState_t;

  • 成员

    表3-12

    成员名称 描述
    u32ChnTotalNum 输出通道总的缓存字节数。
    u32ChnFreeNum 可用的空闲缓存字节数。
    u32ChnBusyNum 被占用缓存字节数。

3.14. MI_AUDIO_Frame_t

  • 说明

    定义音频帧结构体。

  • 定义

    typedef struct MI_AUDIO_Frame_s
    {
        MI_AUDIO_BitWidth_e eBitwidth;
        MI_AUDIO_SoundMode_e eSoundmode;
        void *apVirAddr[MI_AUDIO_MAX_CHN_NUM];
        MI_U64 u64TimeStamp;
        MI_U32 u32Seq;
        MI_U32 u32Len[MI_AUDIO_MAX_CHN_NUM];
        MI_U32 au32PoolId[2];
        void *apSrcPcmVirAddr[MI_AUDIO_MAX_CHN_NUM];
        MI_U32 u32SrcPcmLen[MI_AUDIO_MAX_CHN_NUM]; 
    }MI_AUDIO_Frame_t;
    
  • 成员

    表3-13

    成员名称 描述
    eBitwidth 音频采样精度
    eSoundmode 音频声道模式
    apVirAddr[2] 音频帧数据虚拟地址
    u64TimeStamp 音频帧时间戳
    以µs为单位
    u32Seq 音频帧序号
    u32Len 音频帧长度
    以byte 为单位
    u32PoolId[2] 音频帧缓存池ID (保留)
    apSrcPcmVirAddr 音频帧原始数据虚拟地址(仅对MI_AI有效)
    u32SrcPcmLen 音频帧原始数据的长度(仅对MI_AI有效)
    以byte为单位
  • 注意事项

    • 每个channel的缓冲数据量为u32Len[channel index]。

    • 单声道数据直接存放,立体声数据按左右声道交错存放,每个声道的采样点数为u32PtNumPerFrm,总的长度为u32Len。


3.15. MI_AO_ChnParam_t

  • 说明

    定义音频通道参数设置结构体。

  • 定义

    typedef struct MI_AO_ChnParam_s
    
    {
    
        MI_AO_ChnGainConfig_t) stChnGain;
    
        MI_U32 u32Reserved;
    
    } MI_AO_ChnParam_t;
    
  • 成员

    表3-14

    成员名称 描述
    stChnGain 音频通道增益设置结构体
    u32Reserved 保留,不使用
  • 相关数据类型及接口

    MI_AO_SetChnParam

    MI_AO_GetChnParam


3.16. MI_AO_ChnGainConfig_t

  • 说明

    定义音频通道增益设置结构体。

  • 定义

    typedef struct MI_AO_ChnGainConfig_s
    
    {
    
        MI_BOOL bEnableGainSet;
    
        MI_S16 s16Gain;
    
    }MI_AO_ChnGainConfig_t;
    
  • 成员

    表3-15

    成员名称 描述
    bEnableGainSet 是否使能增益设置
    s16Gain 增益(-60 – 30dB)
  • 相关数据类型及接口

    MI_AO_ChnParam_t


3.17. MI_AO_InitParam_t

  • 说明

    AO设备初始化参数。

  • 定义

    typedef struct MI_AO_InitParam_s
    
    {
    
        MI_U32 u32DevId;
    
        MI_U8 *u8Data;
    
    } MI_AO_InitParam_t;
    
  • 成员

    表3-16

    成员名称 描述
    u32DevId 音频设备号
    u8Data 参数指针(保留)
  • 相关数据类型及接口

    MI_AO_InitDev


3.18. MI_AO_GainFading_e

  • 说明

    AO增益的变化速度。

  • 定义

    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


4. 错误码


AO API 错误码如表4-1所示:

表4-1

错误码 宏定义 描述
0xA0052001 MI_AO_ERR_INVALID_DEVID 音频输出设备号无效
0xA0052002 MI_AO_ERR_INVALID_CHNID 音频输出信道号无效
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 音频输出设备或信道没有使能

5. PROCFS介绍


5.1. cat

  • 调试信息

    # cat proc/mi_modules/mi_ao/mi_ao0
    

  • 调试信息分析

    记录当前AO的使用状况以及device属性等,可以动态地获取到这些信息,方便调试和测试。

  • 参数说明

    参数 描述
    AO DevX Attr (AO设备属性) AoDev AO设备名字
    SampR Sample Rate(采样率)
    8k/11.025k/12k/16k/22.05k/24k/32k/44.1k/48k
    BitWidth 采样精度
    16bit
    SondMod 声音模式
    mono:单声道
    stereo:立体声
    PtNumPerFrm 每帧的采样点数
    VolumeDb AO设备的增益(左声道,右声道)
    bStartPcmOut 是否起播
    ChnCnt AO设备通道数
    TotalFrmCnt APP送给AO设备的帧数
    TotalSize APP送给AO设备的数据量
    I2sMode I2S 的工作模式
    i2s-mas:I2S master
    i2s-sla:I2S slave
    tdm-mas:TDM master
    tdm-sla:TDM slave
    I2sMclk I2S 的Mclk的频率
    disable:不使用Mclk
    其他值为当前的Mclk频率
    I2sFmt I2S的数据格式
    I2S-MSB:I2S格式
    LEFT-MSB:I2S左对齐格式
    bI2sSync I2S RX和TX是否共用clock
    1: 4 wire mode,RX和TX共用clock
    0: 6 wire mode,RX和TX都有独立的clock
    TdmSlots I2S TDM模式下slot数目(仅在TDM模式下有效)
    I2sBitWidth I2S的位宽
    AO Chn Status (AO 通道信息) AoDev AO设备名字
    AoChn AO通道号
    bMuteEnable AO通道是否使能静音
    1:Enable
    0:Disable
    RunTime AO通道的使用时间(秒)


5.2. echo

功能
动态启用/关闭AO设备静音模式
命令 echo set_ao_mute [ON/on/1, OFF/off/0] > proc/mi_modules/mi_ao/mi_ao[ID]
参数说明 [ON/on/1, OFF/off/0] 开启/关闭静音
[ID] 设备号
举例 echo set_ao_mute 1 > proc/mi_modules/mi_ao/mi_ao[ID]
功能
动态修改AO 通道音量大小
命令 echo set_ao_volume [ChnID] [-60~30db] > proc/mi_modules/mi_ao/mi_ao[ID]
参数说明 [ChnID] AO设备物理通道号
[-60~30db] AO设备物理通道的音量
举例 echo set_ao_volume 0 0 > proc/mi_modules/mi_ao/mi_ao0