2

我想知道objective-c中音频数据最适用的缓冲区实现类型是什么。我在 iPhone 上处理音频数据,我在录制或播放时对音频数据进行一些直接的数据操作/DSP,因此性能很重要。几个月以来我一直在做 iPhone 开发。目前我正在处理元素类型为 SInt16 或 Float32 的 c 数组,但我正在寻找更好的东西。

AFAIK,指针迭代的 c 数组的性能在目标 c 环境中是无与伦比的。但是,指针算术和 c 数组很容易出错。您始终必须确保您不会越界访问数组。如果这样做,您不会立即收到运行时错误。而且您必须手动确保正确分配和释放数组。

因此,我正在寻找替代品。有哪些高性能替代品?Objective-c 中有什么类似于 c++ 风格的 std::vector 的吗?

类似的意思是:

  • 很棒的表演
    • 可使用基于指针/迭代器的循环进行迭代
    • 没有将 Float32 或 SInt16 等基本数据类型装箱/拆箱到objective-c 对象的开销(顺便说一句,objective-c 中“基本数据类型”的正确词是什么?)
  • 边界检查
  • 可以将其他列表或数组的块复制/读取/写入到我的搜索列表实现中和从中取出
  • 包括内存管理

我已经搜索并阅读了很多内容,当然NSData并且NSMutableArray是上述解决方案之一。但是,由于基本数据类型的装箱/拆箱开销,它们不会使处理成本加倍吗?代码看起来非常丑陋,就像一个简单的“设置”操作变成了某个恐龙的名字replaceObjectAtIndex:withObject:,这不是我关心的问题,但它仍然巧妙地让我觉得这个类不是为我设计的。

4

2 回答 2

3

NSMutableData满足您的要求之一,因为它将 Objective-C 内存管理语义带到了普通的 C 缓冲区。你可以这样做:

NSMutableData* data = [NSMutableData dataWithLength: sizeof(Float32) * numberOfFloats];
Float32* cFloatArray = (Float32*)[data mutableBytes];

然后您可以将cFloatArray其视为标准 C 数组并使用指针迭代。当NSMutableData对象被释放时,支持它的内存将被释放。它不会为您提供边界检查,但它提供内存管理帮助,同时保持 C 数组的性能。

此外,如果您需要工具帮助解决边界检查问题,请阅读 Xcode 的 Malloc Scribble、Malloc Guard Edges 和 Guard Malloc 选项。这些将使运行时对边界问题更加敏感在生产中没有用,但有助于解决开发过程中的问题。

于 2013-05-03T10:42:39.190 回答
2

框架中提供的容器Foundation几乎没有提供音频处理,总体上相当重量级,也不提供外部迭代器。

此外,iOS 或 MacOSX 中与样本缓冲区交互的音频 API 都不是基于 Objective-C 的,或者采用 Foundation 框架容器的任何参数。

最有可能的是,您希望将 Accelerate Framework 用于 DSP 操作,它的 API 都适用于floats 或int16s 的数组。

虽然所有的 API 都是 C 风格的,但 C++ 和 STL 显然是满足您需求的首选武器,并且以 Objective-C++ 的名义与应用程序的其余部分完美交互。STL 经常编译成与手工 C 语言一样高效的代码。

要对缓冲区进行内存管理,也许可以使用std::array- 如果您想要边界检查,std::shared_ptr或者std::unique_ptr如果您不担心,可以使用自定义删除器。

预期an 的地方iterator- 例如算法函数<algorithm>- 通常也可以使用指向基本类型的指针 - 例如您的样本缓冲区。

于 2013-05-03T10:39:29.973 回答