MI SRC API
1. 概述¶
1.1. 算法说明¶
SRC(Sample Rate Conversion)重采样,用于对音频流做采样频率转换,以获取不同采样频率的音频流。
1.2. 关键词说明¶
- 采样频率: 每秒从连续讯号中取样的样本数。
1.3. 注意¶
为方便调试和确认算法效果,需要用户应用自行实现替换算法参数和抓取音频数据的逻辑。
2. API 参考¶
2.1. 功能模块API¶
API名 | 功能 |
---|---|
IaaSrc_GetBufferSize | 获取Src算法运行需要的内存大小 |
IaaSrc_Init | 初始化Src算法 |
IaaSrc_Run | Src算法处理 |
IaaSrc_Release | 释放Src算法资源 |
2.2. IaaSrc_GetBufferSize¶
-
功能
获取Src算法运行所需要的内存大小。
-
语法
unsigned int IaaSrc_GetBufferSize(SrcConversionMode mode);
-
形参
参数名称 描述 输入/输出 SrcConversionMode mode 采样率转换类型 输入 -
返回值
返回值为Src算法运行所需要的内存大小。
-
依赖
-
头文件: AudioSRCProcess.h
-
库文件: libSRC_LINUX.so/ libSRC_LINUX.a
-
-
注意
该接口仅返回需要的内存大小,申请和释放内存的动作需应用来处理。
-
举例
请参考IaaSrc_Run举例部分。
2.3. IaaSrc_Init¶
-
功能
初始化Src算法。
-
语法
SRC_HANDLE IaaSrc_Init(char *workingBufferAddress, SRCStructProcess *src_struct);
-
形参
参数名称 描述 输入/输出 working_buffer_address Src算法所使用的内存地址 输入 SRCStructProcess Src算法的初始化结构体指针 输入 -
返回值
返回值 结果 非NULL 成功 NULL 失败 -
依赖
-
头文件: AudioSRCProcess.h
-
库文件: libSRC_LINUX.so/ libSRC_LINUX.a
-
-
注意
无。
-
举例
请参考IaaSrc_Run举例部分。
2.4. IaaSrc_Run¶
-
功能
Src算法处理。
-
语法
ALGO_SRC_RET IaaSrc_Run(SRC_HANDLE handle, short *audio_input, short *audio_output, int* output_size);
-
形参
参数名称 描述 输入/输出 handle Src算法handle 输入 audio_input 重采样前的数据指针 输入 audio_output 重采样输出的数据指针 输出 output_size 重采样输出的数据长度,会根据SRCStructProcess中设定的point_number和SRC mode转换的比例而改变。
举例:从8K转换到48K,则Point number等比例上升至六倍。输出 -
返回值
返回值 结果 0 成功 非0 失败,参照 错误码 -
依赖
-
头文件: AudioSRCProcess.h
-
库文件: libSRC_LINUX.so/ libSRC_LINUX.a
-
-
注意
-
audio_output存放的buffer也需要应用程序申请传入。
-
Npoints的取值范围:128, 512,1024
-
-
举例
#include <stdio.h> #include <stdlib.h> #include "AudioSRCProcess.h" /* 0:Fixed input file 1:User input file */ #define IN_PARAMETER 1 int main(int argc, char *argv[]) { SRCStructProcess src_struct; /*********************User change section start*******************/ /* * Audio file bit wide:The user modifies as needed, * for example:16, 8 */ int srcFileBitWide = 16; /* * The user modifies as needed,for example:1, 2 */ src_struct.channel = 1; /* * The user modifies as needed,for example: * SRATE_8K, SRATE_16K, SRATE_32K, SRATE_48K */ src_struct.WaveIn_srate = SRATE_8K; /* * The user modifies as needed,for example: * SRC_8k_to_16k, SRC_8k_to_32k, SRC_48k_to_8k ... */ src_struct.mode = SRC_8k_to_48k; /* * The user modifies as needed,for example: * 256, 512, 1024 and 1536 (Please select among these values) */ src_struct.point_number = 1536; /*********************User change section end*******************/ SrcConversionMode mode = src_struct.mode; SRC_HANDLE handle; ALGO_SRC_RET ret; int output_size; unsigned int workingBufferSize; char *workingBufferAddress = NULL; int freadBufferSize; char *freadBuffer = NULL; int fwriteBufferSize; char *fwriteBuffer = NULL; int nBytesRead; int nPoints = src_struct.point_number; int MaxFactor = SRATE_48K / SRATE_8K;//The biggest factor FILE* fpIn; //input file FILE* fpOut; //output file char src_file[128] = {0}; char dst_file[128] = {0}; #if IN_PARAMETER if(argc < 3) { printf("Please enter the correct parameters!\n"); return -1; } sscanf(argv[1], "%s", src_file); sscanf(argv[2], "%s", dst_file); #else sprintf(src_file, "%s", "./8K_16bit_MONO_30s.wav"); if(argc < 2) { printf("Please enter the correct parameters!\n"); return -1; } sscanf(argv[1], "%s", dst_file); #endif fpIn = fopen(src_file, "rb"); if(NULL == fpIn) { printf("fopen in_file failed !\n"); return -1; } printf("fopen in_file success !\n"); fpOut = fopen(dst_file, "wb"); if(NULL == fpOut) { printf("fopen out_file failed !\n"); return -1; } printf("fopen out_file success !\n"); //(1)IaaSrc_GetBufferSize workingBufferSize = IaaSrc_GetBufferSize(mode); workingBufferAddress = (char *)malloc(sizeof(char) * workingBufferSize); if(NULL == workingBufferAddress) { printf("malloc SRC workingBuffer failed !\n"); return -1; } printf("malloc SRC workingBuffer success !\n"); //(2)IaaSrc_Init handle = IaaSrc_Init(workingBufferAddress, &src_struct); if(NULL == handle) { printf("SRC:IaaSrc_Init failed !\n"); return -1; } printf("SRC:IaaSrc_Init success !\n"); freadBufferSize = src_struct.channel * nPoints * srcFileBitWide / 8; freadBuffer = (char *)malloc(freadBufferSize); if(NULL == freadBuffer) { printf("malloc freadBuffer failed !\n"); return -1; } printf("malloc freadBuffer success !\n"); fwriteBufferSize = MaxFactor * freadBufferSize; fwriteBuffer = (char *)malloc(fwriteBufferSize); if(NULL == fwriteBuffer) { printf("malloc fwriteBuffer failed !\n"); return -1; } printf("malloc fwriteBuffer success !\n"); #if 0 /*Consider whether the input file has a header*/ fread(freadBuffer, sizeof(char), 44, fpIn); //Remove the 44 bytes header #endif while(1) { nBytesRead = fread(freadBuffer, 1, freadBufferSize, fpIn); if(nBytesRead != freadBufferSize) { printf("needBytes =%d nBytesRead = %d\n", freadBufferSize, nBytesRead); break; } //(3)IaaSrc_Run ret = IaaSrc_Run(handle, (short *)freadBuffer, (short *)fwriteBuffer, &output_size); if(ret < 0) { printf("SRC:IaaSrc_Run failed !\n"); return -1; } //printf("ret = %d\n", ret); fwriteBufferSize = src_struct.channel * output_size * srcFileBitWide / 8; fwrite(fwriteBuffer, 1, fwriteBufferSize, fpOut); } fclose(fpIn); fclose(fpOut); //(4)IaaSrc_Release ret = IaaSrc_Release(handle); if(ret) { printf("IaaSrc_Release failed !\n"); return -1; } printf("IaaSrc_Release success !\n"); free(workingBufferAddress); free(freadBuffer); free(fwriteBuffer); return 0; }
2.5. IaaSrc_Release¶
-
功能
释放Src算法资源。
-
语法
ALGO_SRC_RET IaaSrc_Release(SRC_HANDLE handle);
-
形参
参数名称 描述 输入/输出 handle Src算法handle 输入 -
返回值
返回值 结果 0 成功 非0 失败,参照 错误码 -
依赖
-
头文件: AudioSRCProcess.h
-
库文件: libSRC_LINUX.so/ libSRC_LINUX.a
-
-
注意
无。
-
举例
请参考IaaSrc_Run举例部分。
3. SRC 数据类型¶
3.1. SRC模块相关数据类型定义¶
数据类型 | 定义 |
---|---|
SrcConversionMode | Src算法采样率转换类型 |
SRCStructProcess | Src算法初始化参数结构体类型 |
SrcInSrate | Src算法的采样率类型 |
SRC_HANDLE | Src算法句柄类型 |
3.2. SrcConversionMode¶
-
说明
定义Src算法的采样率转换类型。
-
定义
typedef enum{ SRC_8k_to_16k, SRC_8k_to_32k, SRC_8k_to_48k, SRC_16k_to_8k, SRC_16k_to_32k, SRC_16k_to_48k, SRC_32k_to_8k, SRC_32k_to_16k, SRC_32k_to_48k, SRC_48k_to_8k, SRC_48k_to_16k, SRC_48k_to_32k }SrcConversionMode;
-
成员
成员名称 描述 SRC_8k_to_16k 8K重采样到16K SRC_8k_to_32k 8K重采样到32K SRC_8k_to_48k 8K重采样到48K SRC_16k_to_8k 16K重采样到8K SRC_16k_to_32k 16K重采样到32K SRC_16k_to_48k 16K重采样到48K SRC_32k_to_8k 32K重采样到8K SRC_32k_to_16k 32K重采样到16K SRC_32k_to_48k 32K重采样到48K SRC_48k_to_8k 48K重采样到8K SRC_48k_to_16k 48K重采样到16K SRC_48k_to_32k 48K重采样到32K -
注意事项
无。
-
相关数据类型及接口
3.3. SRCStructProcess¶
-
说明
定义Src算法的初始化参数结构体类型。
-
定义
typedef struct{ SrcInSrate WaveIn_srate; SrcConversionMode mode; unsigned int channel; unsigned int point_number; }SRCStructProcess;
-
成员
成员名称 描述 WaveIn_srate 源数据的采样频率 mode 采样频率转换的模式,请根据源数据采样频率与输出数据采样频率搭配做选择。 channel 源数据的通道数 point_number 输入给SRC的点数,IaaSrc_Run里面的output_size会随着此变量与sampling rate转换的比例而改变。
如: point_number为128,SRC mode为SRC_8k_to_48k,则output_size为128×6=768,建议根据所需去设定点数。
可设定值:[256, 512, 1024, 1536, 2880] -
注意事项
- 无。
-
相关数据类型及接口
3.4. SrcInSrate¶
-
说明
定义Src算法的采样率类型。
-
定义
typedef enum{ SRATE_8K = 8, SRATE_16K = 16, SRATE_32K = 32, SRATE_48K = 48 }SrcInSrate;
-
成员
成员名称 描述 SRATE_8K 8K采样频率 SRATE_16K 16K采样频率 SRATE_32K 32K采样频率 SRATE_48K 48K采样频率 -
注意事项
无。
-
相关数据类型及接口
3.5. SRC_HANDLE¶
-
说明
定义Src算法的句柄类型。
-
定义
typedef void* SRC_HANDLE;
-
成员
成员名称 描述 -
注意事项
无。
-
相关数据类型及接口
4. 错误码 ¶
SRC API 错误码如下表所示:
表 4‑1 SRC API错误码
错误码 | 宏定义 | 描述 |
---|---|---|
0x00000000 | ALGO_SRC_RET_SUCCESS | 运行成功 |
0x10000601 | ALGO_SRC_INIT_ERROR | 算法尚未初始化 |
0x10000602 | ALGO_SRC_RET_INVALID_MODE | 模式参数设置无效 |
0x10000603 | ALGO_SRC_RET_INVALID_HANDLE | HANDLE无效 |
0x10000604 | ALGO_SRC_RET_INVALID_CHANNEL | 通道数不支持 |
0x10000605 | ALGO_SRC_RET_INVALID_POINT_NUMBER | 每帧点数不支援 |
0x10000606 | ALGO_SRC_RET_INVALID_SAMPLE_RATE | 采样频率不支持 |
0x10000607 | ALGO_SRC_RET_API_CONFLICT | 其他API正在运行 |
0x10000608 | ALGO_SRC_RET_INVALID_CALLING | 呼叫API顺序错误 |