在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
吗?CA_PREFER_FIXED_POINT
重新定义为0(为iPhone编程时)?答案 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}}。