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 音频设备号 输入 -
返回值
-
0 成功
-
非0 失败,参照错误码。
-
-
依赖
-
头文件: 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 音频输出通道号 输入 -
返回值
-
0 成功
-
非0 失败,参照错误码。
-
-
依赖
-
头文件: 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 音频输入通道号 输入 -
返回值
-
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_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开始,而是与实际的采样率值相同。
-
相关数据类型及接口
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从模式 -
注意事项
主模式与从模式是否支持会依据不同的芯片而有区别。
-
相关数据类型及接口
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 此模式仅应用在音频采集 -
相关数据类型及接口
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 左对齐格式,最高位优先 -
相关数据类型及接口
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 -
相关数据类型及接口
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模式的芯片有效) -
相关数据类型及接口
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 工作属性 -
相关数据类型及接口
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 保留,不使用 -
相关数据类型及接口
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) -
相关数据类型及接口
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 参数指针(保留) -
相关数据类型及接口
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 -
相关数据类型及接口
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 Device Attr (AO设备属性) AoDev AO设备名字 SamR Sample Rate(采样率): 8000, 11025, 16000, 22050, 24000, 32000, 44100, 48000 BitWidth 采样精度: 16bit SondMod 声音模式
mono:单声道
stereo:立体声PtNumPerFrm 每帧的采样点个数 VolumeDb AO设备的增益(左声道,右声道) bMuteEnable AO设备是否静音(左声道,右声道) bStartPcmOut 是否起播 ChnCnt AO设备通道数 TotalFrmCnt APP送给AO设备的帧数 TotalSize APP送给AO设备的数据量 MixVolumeDb 侧音音量增益(仅部分soc和部分device支持) I2sMode I2S Tx的工作模式(仅设备为I2S Tx时有效)
i2s-mas: I2S master
i2s-sla: I2S slave
tdm-mas: TDM master
tdm-sla: TDM slaveI2sMclk I2S Tx的Mclk的频率(仅设备为I2S Tx时有效)
disable: 不使用Mclk
其他值为当前的Mclk频率I2sFmt I2S Tx的数据格式(仅设备为I2S Tx时有效)
I2S-MSB: I2S格式
LEFT-MSB: I2S左对齐格式bI2sSync I2S RX和TX是否共用clock(仅设备为I2S Tx时有效)
1: 4 wire mode,RX和TX共用clock
0: 6 wire mode,RX和TX都有独立的clockTdmSlots I2S Tx的TDM slot数目(仅设备为I2S Tx为TDM模式时有效) I2sBitWidth I2S Tx的位宽(仅设备为I2S Tx,且需要支持TDM模式的芯片有效) AO Chn Status (AO 通道信息) AoDev AO设备的名字 AoChn AO通道号 RunTime AO通道的使能时间(秒) AO Chn Usr Queue Status (AO 通道Queue信息) AoDev AO设备的名字 AoChn AO通道号 MaxSize AO通道Queue的大小(byte) RemainSize AO通道Queue中当前的数据量(byte) TotalSize APP往AO通道送的数据量(byte) RunTime AO通道Queue已创建的时间(秒)
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] 设备号 |
功能 | 动态修改AO通道volume大小 |
---|---|
命令 | 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 |
功能 | 动态修改AO通道回采数据的volume大小 |
---|---|
命令 | echo set_ao_src_volume [ChnID] [-60 ~ 30dB] > proc/mi_modules/mi_ao/mi_ao[ID] |
参数说明 | [ChnID] AO设备物理通道号 [-60 ~ 30dB] AO设备物理通道的回采音量 |
举例 | echo set_ao_src_volume 0 0 > proc/mi_modules/mi_ao/mi_ao0 |
功能 | 动态修改侧音的volume大小(仅部分soc和device支持) |
---|---|
命令 | echo set_ao_mix_volume [-60 ~ 30dB] > proc/mi_modules/mi_ao/mi_ao[ID] |
参数说明 | [-60 ~ 30dB] 侧音音量大小 |
举例 | echo set_ao_mix_volume 10 > proc/mi_modules/mi_ao/mi_ao0 |
功能 | 动态开启/关闭AO设备dump数据功能 |
---|---|
命令 | echo dump [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 /tmp 1 > proc/mi_modules/mi_ao/mi_ao0 |
5.3. MI User层Debug¶
功能 | 在运行APP前,通过export指定环境变量,dump MI user层APP送给AO的数据 |
---|---|
说明 | [MI_AO_DUMP_PCM_ENABLE] 使能dump MI user层APP送给AO的数据 [MI_AO_DUMP_PATH] 指定dump数据的路径 |
举例 | export MI_AO_DUMP_PCM_ENABLE=1 export MI_AO_DUMP_PATH=/mnt |