2012-01-31 45 views
6

在iOS的5.0文档中指出,规范的音频数据的类型是16位的符号的int(link)类型:什么是规范的音频样本数据在IOS 5

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

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 

时再跳跃到DEF为CA_PREFER_FIXED_POINT我看到:

#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被定义为1,无论是在模拟器上还是在我的iPod上。

所以,我的问题:

  • 什么所述规范类型?是否总是SInt16在设备上?
  • 上面的第三行评估为“真”的是什么情况?我的意思是,哪个设备运行iPhone OS并使用某个列出的CPU?
  • 有没有一个用例,我应该重新定义CA_PREFER_FIXED_POINT为0(当为iPhone编程时)?

回答

7

再次阅读链接的内容,而这条线在你的头:

#define kAudioUnitSampleFractionBits 24 

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

其他音频处理的规范类型,例如新的iOS 5滤波器音频单元,是8.24带符号的定点。

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

3

在其Core Audio Essentials苹果澄清有关规范的音频数据格式

规范的音频数据格式根据不同的平台,核心音频有 一个或两个“规范”的音频数据格式,在这个意义上,这些 格式可以是:

  • 要求像在转化
  • 格式F侧中间格式或 在核心音频服务进行了优化
  • 默认,或承担的格式,当您没有另行指定ASBD

的规范格式的Core Audio如下:

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

但其它音频处理非交叉存取的线性PCM:如果你看看到CoreAudioTypes.h在iOS 8,你会发现一个讨论:

“canonical”标志已被弃用。 CA_PREFER_FIXED_POINT是 不鼓励,因为iOS上的浮点性能使得 定点不再是真正的首选。所有Apple提供的 AudioUnits支持浮点。更换应该做的与所指定的或预期 格式的慎重考虑,但 往往kAudioFormatFlagsCanonical可以 kAudioFormatFlagsNativeFloatPacked取代, kAudioFormatFlagsAudioUnitCanonicalkAudioFormatFlagsNativeFloatPacked | kAudioFormatFlagIsNonInterleaved