我们正在以时间间隔(bpm)播放节拍器音频文件,同时录制音频文件。但是目前两个线程的开始时间并不完全同时存在,并且存在轻微的时间差异,对于音乐而言,这是不允许的。
我们可以使用哪些策略来保证两个进程在完全相同的时间(或几毫秒)内启动?
谢谢!
答案 0 :(得分:3)
我可以想到三种方法来完成这项工作(但显然我从未测试过它们)。
每个线程都应该预先进行所有初始化,然后等待“事件”。我能想到的几个时间事件:
使用通知 - 两个线程都会侦听一些“开始”通知。那应该相当快。
让两个线程都进行keyValue监听 - 所以他们都在监听已知对象上某些属性的更改,比如appDelegate(或单例),或者他们都知道的任何对象(委托?)
在初始化完成后,每次调用一个委托。当两者都“准备好”时,代表可以一个接一个地发送消息(在主线程上)到“开始”。
你也可以尝试使用NSLock和朋友 - 不确定你会在那里遇到什么样的延迟。键值观察非常快速且轻量级,适用于任何线程。
答案 1 :(得分:1)
实现这一目标的最准确可靠的方法是在CoreAudio音频渲染/输入处理程序中实现音频记录和节拍器播放,而不是使用更高级别的API并依赖于同步两个线程。 @David H的答案中的所有机制都没有提供有关内核执行线程的任何保证,尽管它们大部分时间都可能在轻负载系统上运行。
回调是在管理到CoreAudio的实时线程上调用的,并且与硬件音频时钟同步 - 这可能与内核的定时器异步。
您需要将节拍器样本加载到内存中并在初始化时转换为输出格式 - 可能使用其中一个AudioToolbox API。音频渲染回调只是在适当的时候将其复制到输出缓冲区。