Core Audio iOS:检索已捕获和将要渲染的样本的过去和未来时间戳

And*_*ard 5 core-audio ios remoteio

我有一个非常简单的 iOS Core Audio 应用程序,其结构如下:

Remote I/O Unit Input Bus --> Render Callback --> Remote I/O Unit Output Bus

由远程 I/O 输出总线调用的渲染回调函数通过调用AudioUnitRender()远程 I/O 输入总线从输入硬件中提取样本。然后它处理/影响这些样本,写入提供的样本AudioBufferList*并返回,导致通过输出硬件播放受影响的样本。一切正常。

我的问题是我如何知道或计算出以下的准确时间:

  • 样本由输入硬件捕获
  • 样本实际上是在输出硬件上播放的

讨论

一个AudioTimeStamp结构体被传递到渲染回调中,并带有有效的mHostTime, mSampleTime&mRateScalar值。我不清楚这个时间戳到底反映了什么。该文件指出:

inTimeStamp 与此音频单元渲染调用关联的时间戳。

这听起来像它所代表的渲染被调用时,却怎么也该关联(如果有的话),以在其中输入样本的时间进行拍摄和输出样本将被呈现?

一些在线资源谈到使用mach_absolute_time()CACurrentMediaTime()计算当前主机时间,但是我似乎无法再次建立从当前主机时间到过去或未来主机时间的连接。

以下引用来自 Apple 邮件列表线程的三个时间戳,包括用于过去输入数据和未来输出数据的单独时间戳。这正是我正在寻找的,但是我相信这是在 OS X 上运行并使用 AUHAL I/O。我找不到在 iOS 上检索这些时间戳的方法。

因此,CoreAudio 的工作方式是 I/O proc 触发并为您提供 3 个时间戳:(1) 是输入数据的时间戳 - 如果有的话。这将始终至少是过去的缓冲区大小 (2) 是现在的时间戳 - 当 I/O proc 被唤醒运行时 (3) 是您将提供的输出数据的时间戳。这将始终是未来的某个时间 - 通常是未来的缓冲区大小。( http://lists.apple.com/archives/coreaudio-api/2005/Sep/msg00220.html )

我怀疑我可能遗漏了一些明显的东西,所以希望有人能对此有所了解。

提前致谢。

inv*_*ame 1

如果您尝试考虑实际捕获时间和实际输出时间,也许您可​​以检查音频会话中的硬件延迟属性。音频单元还具有延迟属性。不确定这是否会给您带来所需的准确性。