【问题标题】:How to guarantee a process starts at an exact time in iOS如何保证进程在 iOS 中的确切时间开始
【发布时间】:2013-12-05 18:27:53
【问题描述】:

我们以时间间隔 (bpm) 播放节拍器音频文件,同时录制音频文件。但是目前两个线程的启动时间并不完全同时,并且存在细微的时间差,这对于音乐来说是不允许的。

我们可以使用哪些策略来保证两个进程在完全相同的时间(或几毫秒内)启动?

谢谢!

【问题讨论】:

  • 在 iOS 下不能启动新进程(除非是越狱环境)。
  • @EricPostpischil 你不能fork iOS 中的进程。但是,您可以创建新线程。 OP 在这里将processthread 混为一谈。 stackoverflow.com/questions/12088155/…
  • @EricPostpischil 真的吗? iOS允许你使用fork?我不这么认为。
  • @rmaddy:啊,是的,好吧,iOS 确实允许我使用fork,但不允许你使用。对于那个很抱歉。但是,OP 已经创建了两个线程并且只想同步它们。所以很明显,“进程”是在英语意义上使用的,而不是操作系统意义上的。 OP 询问的是如何同步两件事,而不是如何创建一个新进程。
  • @EricPostpischil 是的,谢谢,我们正在使用两个。

标签: ios c core-audio


【解决方案1】:

我可以想到三种方法来完成这项工作(但显然我从未测试过它们)。

您的每个线程都应该预先完成所有可以进行的初始化,然后等待“事件”。我能想到的几个计时事件:

  • 使用通知 - 两个线程都监听一些“开始”通知。这应该很快。

  • 让两个线程都进行 keyValue 侦听 - 因此它们都在侦听已知对象上某些属性的更改,例如 appDelegate(或单例)或它们都知道的任何对象(委托?)

  • 在初始化完成后,每次调用一个委托。当两者都“准备好”时,委托可以一个接一个地(在主线程上)向每个人发送一条消息以“开始”。

您还可以尝试使用 NSLock 和朋友 - 不确定您会得到什么样的延迟。 Key-Value Observing 非常快速且轻量级,适用于任何线程。

【讨论】:

  • 谢谢,会进一步调查。
【解决方案2】:

实现这一点的最准确和最可靠的方法是在 CoreAudio 音频渲染/输入处理程序中实现音频记录和节拍器播放,而不是使用更高级别的 API 并依赖于同步两个线程。 @David H 的答案中的任何机制都没有为内核执行线程提供任何保证,尽管它们可能大部分时间都可以在轻负载的系统上工作。

回调在管理给 CoreAudio 的实时线程上调用,并与硬件音频时钟同步 - 这可能与内核的计时器异步。

您需要将节拍器样本加载到内存中并在初始化时转换为输出格式 - 可能使用 AudioToolbox API 之一。音频渲染回调只是在适当的时候将其复制到输出缓冲区。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-11
    • 2011-08-15
    相关资源
    最近更新 更多