【问题标题】:What is the canonical audio sample data type in iOS 5iOS 5 中的规范音频样本数据类型是什么
【发布时间】:2012-02-23 14:00:39
【问题描述】:

在 iOS 5.0 文档中声明规范音频数据类型是 16 位有符号整数 (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 跳转到定义时再次:

#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 行评估为“真”?我的意思是,哪个设备运行 iPhone 操作系统并使用列出的 CPU 之一?
  • 是否存在我应该将CA_PREFER_FIXED_POINT 重新定义为 0 的用例(为 iPhone 编程时)?

【问题讨论】:

    标签: iphone ios audio core-audio


    【解决方案1】:

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

    Canonical Audio Data Formats 根据平台,Core Audio 有 一种或两种“规范”音频数据格式,即这些 格式可能是:

    • 需要作为转换中的中间格式
    • 的格式 Core Audio 中的一项服务已优化
    • 默认或假定的格式,当您没有另外指定 ASBD 时

    Core Audio 中的规范格式如下:

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

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

    “规范”标志已弃用。 CA_PREFER_FIXED_POINT 是 不鼓励,因为 iOS 上的浮点性能是这样的 固定点不再是真正的首选。所有 Apple 提供 AudioUnits 支持浮点数。更换应与 仔细考虑指定或预期的格式,但 通常kAudioFormatFlagsCanonical可以替换为 kAudioFormatFlagsNativeFloatPacked,和 kAudioFormatFlagsAudioUnitCanonicalkAudioFormatFlagsNativeFloatPacked | kAudioFormatFlagIsNonInterleaved.

    【讨论】:

      【解决方案2】:

      阅读链接的内容,并再次阅读标题中的这一行:

      #define kAudioUnitSampleFractionBits 24
      

      音频inputoutput的规范类型等价于SInt16。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-10-03
        • 1970-01-01
        • 1970-01-01
        • 2012-10-29
        • 2012-04-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多