iOS 5中的规范音频样本数据类型是什么

时间:2012-01-31 20:32:11

标签: iphone ios audio core-audio

在iOS 5.0文档中,声明规范音频数据类型是16位符号int(link):

  

输入和输出的规范音频数据样本类型。

     

typedef SInt16 AudioSampleType;

     

讨论

     

iPhone OS中输入和输出的规范音频样本类型是   具有16位整数样本的线性PCM。

但是,如果我右键点击AudioSampleType上的“跳转到定义”,我会在CoreAudioTypes.h中看到以下定义:

#if !CA_PREFER_FIXED_POINT
typedef Float32     AudioSampleType;
typedef Float32     AudioUnitSampleType;
#else
typedef SInt16      AudioSampleType;
typedef SInt32      AudioUnitSampleType;
#define kAudioUnitSampleFractionBits 24
#endif

再次为CA_PREFER_FIXED_POINT跳转到def时,我看到了:

#if !defined(CA_PREFER_FIXED_POINT)
    #if TARGET_OS_IPHONE
        #if (TARGET_CPU_X86 || TARGET_CPU_X86_64 || TARGET_CPU_PPC || TARGET_CPU_PPC64) && !TARGET_IPHONE_SIMULATOR
            #define CA_PREFER_FIXED_POINT 0
        #else
            #define CA_PREFER_FIXED_POINT 1
        #endif
    #else
        #define CA_PREFER_FIXED_POINT 0
    #endif
#endif

在运行时检查我的代码,我发现CA_PREFER_FIXED_POINT在模拟器和iPod上都被定义为1。

所以,我的问题:

  • 规范类型?设备上总是 SInt16吗?
  • 在什么情况下上面的第3行评估为'true'?我的意思是,哪个设备运行iPhone OS并使用列出的CPU之一?
  • 是否有一个用例,我应该将CA_PREFER_FIXED_POINT重新定义为0(为iPhone编程时)?

2 个答案:

答案 0 :(得分:7)

阅读链接的内容,然后再次在标题中输入以下内容:

#define kAudioUnitSampleFractionBits 24

音频输入输出的规范类型相当于SInt16。

其他音频处理的规范类型,例如新的iOS 5过滤器音频单元,是8.24签名的定点。

如果您使用自己的DSP代码进行近实时iOS音频处理,请使用不同类型进行基准测试,就像在一些最新的ARM内核上一样,32位浮点数序列通常比使用上述任何一种都快规范类型,并且在NEON asm代码中编码得更快。

答案 1 :(得分:3)

在其Core Audio Essentials Apple澄清规范音频数据格式

  

规范音频数据格式根据平台,Core Audio具有   在这些意义上的一个或两个“规范”音频数据格式   格式可能是:

     
      
  • 在转化中必须作为中间格式
  •   
  • 其格式   Core Audio中的服务已经过优化
  •   
  • 当您未另行指定ASBD
  • 时的默认格式或假定格式   
     

Core Audio中的规范格式如下:

     
      
  • iOS输入和输出带有16位整数样本的线性PCM
  •   
  • iOS音频单元和其他音频处理具有8.24位定点样本的非交错线性PCM
  •   
  • Mac输入和输出具有32位浮点样本的线性PCM
  •   
  • Mac音频单元和其他音频处理具有32位浮点样本的非交错线性PCM
  •   

但是:如果您查看iOS 8中的CoreAudioTypes.h,您会发现有关该问题的讨论:

  

不推荐使用“规范”标志。 CA_PREFER_FIXED_POINT是   气馁,因为iOS上的浮点性能就是这样   固定点不再是真正的首选。所有Apple提供的   AudioUnits支持浮点数。应该用。替换   仔细考虑指定或预期的格式,但是   通常kAudioFormatFlagsCanonical可以替换为kAudioFormatFlagsNativeFloatPacked   kAudioFormatFlagsAudioUnitCanonical,和   kAudioFormatFlagsNativeFloatPacked | kAudioFormatFlagIsNonInterleaved   {{1}}。