一、操作接口
1、启用 AO 重采样
- HI_S32 HI_MPI_AO_EnableReSmp(AUDIO_DEV AoDevId, AO_CHN AoChn,AUDIO_SAMPLE_RATE_E enInSampleRate);
- AoDevId:音频设备号。
- 取值范围:
- 音频输入设备 ID:0
- 音频输出设备 ID:[0,1,2]
- AoChn:音频输出通道号。支持的通道范围由 AO 设备属性中的最大通道个数 u32ChnCnt 决定(即在初始化的时候配置的值)
- enInSampleRate:音频重采样的输入采样率。
- 返回值:
2、禁用 AO 重采样。
- HI_S32 HI_MPI_AO_DisableReSmp(AUDIO_DEV AoDevId, AO_CHN AoChn);
- AoDevId:音频设备号。
- 取值范围:
- 音频输入设备 ID:0
- 音频输出设备 ID:[0,1,2]
- AoChn:音频输出通道号。支持的通道范围由 AO 设备属性中的最大通道个数 u32ChnCnt 决定(即在初始化的时候配置的值)
- 返回值:
二、使用方法:
1、注意事项
- HI_MPI_AO_EnableReSmp应该在启用 AO 通道之后(HI_MPI_AO_Enable),绑定 AO 通道之前(HI_MPI_SYS_Bind),调用此接口启用重采样功能。
- 允许重复启用重采样功能,但必须保证后配置的重采样输入采样率与之前配置的重采样输入采样率一样。
2、例子
//使能Ao
HI_S32 SAMPLE_COMM_AUDIO_StartAo(AUDIO_DEV AoDevId, HI_S32 s32AoChnCnt,
AIO_ATTR_S* pstAioAttr, AUDIO_SAMPLE_RATE_E enInSampleRate, HI_BOOL bResampleEn, HI_VOID* pstAoVqeAttr, HI_U32 u32AoVqeType)
{
HI_S32 i;
HI_S32 s32Ret;
if (SAMPLE_AUDIO_HDMI_AO_DEV == AoDevId)
{
#ifdef HI_ACODEC_TYPE_HDMI
pstAioAttr->u32ClkSel = 0;
SAMPLE_COMM_AUDIO_StartHdmi(pstAioAttr);
#endif
}
if (pstAioAttr->u32ClkChnCnt == 0)
{
pstAioAttr->u32ClkChnCnt = pstAioAttr->u32ChnCnt;
}
s32Ret = HI_MPI_AO_SetPubAttr(AoDevId, pstAioAttr);
if (HI_SUCCESS != s32Ret)
{
printf("%s: HI_MPI_AO_SetPubAttr(%d) failed with %#x!\n", __FUNCTION__, \
AoDevId, s32Ret);
return HI_FAILURE;
}
//使能Ao
s32Ret = HI_MPI_AO_Enable(AoDevId);
if (HI_SUCCESS != s32Ret)
{
printf("%s: HI_MPI_AO_Enable(%d) failed with %#x!\n", __FUNCTION__, AoDevId, s32Ret);
return HI_FAILURE;
}
for (i = 0; i < s32AoChnCnt; i++)
{
s32Ret = HI_MPI_AO_EnableChn(AoDevId, i);
if (HI_SUCCESS != s32Ret)
{
printf("%s: HI_MPI_AO_EnableChn(%d) failed with %#x!\n", __FUNCTION__, i, s32Ret);
return HI_FAILURE;
}
//重采样
if (HI_TRUE == bResampleEn)
{
printf("AoDevId=%d, s32AoChnCnt=%d, enInSampleRate=%d\n", AoDevId, i, enInSampleRate);
s32Ret = HI_MPI_AO_DisableReSmp(AoDevId, i);
s32Ret |= HI_MPI_AO_EnableReSmp(AoDevId, i, enInSampleRate);
if (HI_SUCCESS != s32Ret)
{
printf("%s: HI_MPI_AO_EnableReSmp(%d,%d) failed with %#x!\n", __FUNCTION__, AoDevId, i, s32Ret);
return HI_FAILURE;
}
}
if (NULL != pstAoVqeAttr)
{
HI_BOOL bAoVqe = HI_TRUE;
switch (u32AoVqeType)
{
case 0:
s32Ret = HI_SUCCESS;
bAoVqe = HI_FALSE;
break;
case 1:
s32Ret = HI_MPI_AO_SetVqeAttr(AoDevId, i, (AO_VQE_CONFIG_S *)pstAoVqeAttr);
break;
default:
s32Ret = HI_FAILURE;
break;
}
if (s32Ret)
{
printf("%s: SetAoVqe%d(%d,%d) failed with %#x\n", __FUNCTION__, u32AoVqeType, AoDevId, i, s32Ret);
return s32Ret;
}
if (bAoVqe)
{
s32Ret = HI_MPI_AO_EnableVqe(AoDevId, i);
if (s32Ret)
{
printf("%s: HI_MPI_AI_EnableVqe(%d,%d) failed with %#x\n", __FUNCTION__, AoDevId, i, s32Ret);
return s32Ret;
}
}
}
}
return HI_SUCCESS;
}
HI_S32 SAMPLE_COMM_AUDIO_AoBindAdec(AUDIO_DEV AoDev, AO_CHN AoChn, ADEC_CHN AdChn)
{
MPP_CHN_S stSrcChn,stDestChn;
stSrcChn.enModId = HI_ID_ADEC;
stSrcChn.s32DevId = 0;
stSrcChn.s32ChnId = AdChn;
stDestChn.enModId = HI_ID_AO;
stDestChn.s32DevId = AoDev;
stDestChn.s32ChnId = AoChn;
return HI_MPI_SYS_Bind(&stSrcChn, &stDestChn);
}
int main()
{
......
s32Ret = SAMPLE_COMM_AUDIO_StartAo(AoDev, stAioAttr.u32ChnCnt, &stAioAttr, AUDIO_SAMPLE_RATE_16000, HI_TRUE, NULL, 0);
if (s32Ret != HI_SUCCESS)
{
SAMPLE_DBG(s32Ret);
return HI_FAILURE;
}
s32Ret = SAMPLE_COMM_AUDIO_AoBindAdec(AoDev, AoChn, AdChn);
if (s32Ret != HI_SUCCESS)
{
SAMPLE_DBG(s32Ret);
return HI_FAILURE;
}
......
}
三、重采样结果
1、在demo中测试
音频重采样的输入采样率 |
输出采样率 |
音频效果 |
16K |
16K |
无法进行重采样 |
32K |
16K |
声音速度变快 |
16K |
8K |
声音速度正常,音量变低 |
8K |
16K |
声音速度变慢 |
16K |
32K |
声音正常 |
32K |
48K |
声音变快 |
2、使用解码器的程序测试
音频重采样的输入采样率 |
输出采样率 |
音频效果 |
8K |
8K |
无法进行重采样,声音播放正常 |
16K |
8K |
声音速度变快,变尖,卡顿,proc/umap/ao文件中的空buff每秒增加13 |
32K |
8K |
声音速度变快,变尖,卡顿,proc/umap/ao文件中的空buff每秒增加19~20 |
48K |
8K |
声音速度变快,变尖,卡顿,proc/umap/ao文件中的空buff每秒增加21 |