MI SRC API

Version 1.2


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
  • 注意事项

    无。

  • 相关数据类型及接口

    IaaSrc_GetBufferSize


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]
  • 注意事项

    • 无。
  • 相关数据类型及接口

    IaaSrc_Init


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采样频率
  • 注意事项

    无。

  • 相关数据类型及接口

    SRCStructProcess


3.5. SRC_HANDLE

  • 说明

    定义Src算法的句柄类型。

  • 定义

    typedef void* SRC_HANDLE;
    
  • 成员

    成员名称 描述
  • 注意事项

    无。

  • 相关数据类型及接口

    IaaSrc_Init

    IaaSrc_Run

    IaaSrc_Release


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顺序错误