MI SRC API

REVISION HISTORY

Revision No.
Description
Date
1.0
  • Initial release
  • 09/12/2020
    1.1
  • Modified API
  • 10/15/2020
    1.2
  • Added new low pass filter
  • 06/01/2021
    1.21
  • Added some details about point number
  • 08/18/2022
    1.22
  • Added some details about channel number
  • 12/15/2022
    1.3
  • Added 24kHz sample rate
  • 12/20/2023

    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的取值范围:≤1536

    • 举例

      #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.mode = SRC_8k_to_48k;
          src_struct.order = ORDER_HIGH;
          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;
              }
      
              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算法句柄类型
    SrcFilterOrder 定义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,
      
          SRC_24k_to_8k,
      
          SRC_24k_to_16k,
      
          SRC_24k_to_32k,
      
          SRC_24k_to_48k,
      
          SRC_8k_to_24k,
      
          SRC_16k_to_24k,
      
          SRC_32k_to_24k,
      
          SRC_48k_to_24k
      
      }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
      SRC_24k_to_8k 24K重采样到8K
      SRC_24k_to_16k 24K重采样到16K
      SRC_24k_to_32k 24K重采样到32K
      SRC_24k_to_48k 24K重采样到48K
      SRC_8k_to_24k 8K重采样到24K
      SRC_16k_to_24k 16K重采样到24K
      SRC_32k_to_24k 32K重采样到24K
      SRC_48k_to_24k 24K重采样到24K
    • 注意事项

      无。

    • 相关数据类型及接口

      IaaSrc_GetBufferSize


    3.3. SRCStructProcess

    • 说明

      定义Src算法的初始化参数结构体类型。

    • 定义

      typedef struct{
      
          SrcInSrate WaveIn_srate;
      
          SrcConversionMode mode;
      
          unsigned int channel;
      
          SrcFilterOrder order;
      
          unsigned int point_number;
      
      }SRCStructProcess;
      
    • 成员

      成员名称 描述
      WaveIn_srate 输入源数据的采样频率
      mode 采样频率转换的模式,请根据源数据采样频率与输出数据采样频率搭配做选择。
      channel 源数据的通道数,可支持4声道
      order 低通滤波器阶数
      point_number 输入讯号每帧包含的点数,预设小于1536,并须符合转换后依然为整数。下面指令可确认
      strings libSRC_LINUX.so | grep PN
    • 注意事项

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

      IaaSrc_Init


    3.4. SrcInSrate

    • 说明

      定义Src算法的采样率类型。

    • 定义

      typedef enum{
      
          SRATE_8K = 8,
      
          SRATE_16K = 16,
      
          SRATE_32K = 32,
      
          SRATE_48K = 48,
      
          SRATE_24K = 24
      
      }SrcInSrate;
      
    • 成员

      成员名称 描述
      SRATE_8K 8K采样频率
      SRATE_16K 16K采样频率
      SRATE_32K 32K采样频率
      SRATE_48K 48K采样频率
      SRATE_24K 24K采样频率
    • 注意事项

      无。

    • 相关数据类型及接口

      SRCStructProcess


    3.5. SRC_HANDLE

    • 说明

      定义Src算法的句柄类型。

    • 定义

      typedef void* SRC_HANDLE;
      
    • 成员

      成员名称 描述
    • 注意事项

      无。

    • 相关数据类型及接口

      IaaSrc_Init

      IaaSrc_Run

      IaaSrc_Release


    3.6. SrcFilterOrder

    • 说明

      定义Src算法的低通滤波器阶数。

    • 定义

      typedef enum{
          ORDER_LOW = 0,
          ORDER_HIGH = 1
      }SrcFilterOrder;
      
    • 成员

      成员名称 描述
      ORDER_LOW 阶数低
      ORDER_HIGH 阶数高,滤波效果较好
    • 注意事项

      无。

    • 相关数据类型及接口

      SRCStructProcess


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