MI AO API
1. 概述¶
1.1. 模块说明¶
音频输出(Audio Output, AO)主要实现配置及启用音频输出设备、发送音频帧数据、以及音量设置等功能。
1.2. Audio Codec框图¶
图1-1 Tiramisu系列芯片
图1-2 Tiramisu系列芯片
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 位宽,但部分芯片的I2S可以支持32bit收发。
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_AUDIO_I2sConfig_t;
-
成员
表3-10
成员名称 描述 eFmt I2S 格式设置。 静态属性。 eMclk I2S MCLK 时钟频率。 静态属性。 bSyncClock AO 同步AI时钟 静态属性。 -
相关数据类型及接口
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
※ 注意事项 无。
- 相关数据类型及接口 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 | 音频输出设备或信道没有使能 |