如何保证进程在iOS中准确启动
我们以时间间隔(bpm)播放节拍器音频文件,同时录制音频文件。然而,目前两个线程的开始时间并不完全同时,并且存在轻微的时间差,这对于音乐来说是不允许的 我们可以使用什么策略来保证两个进程在完全相同的时间(或几毫秒以下)启动如何保证进程在iOS中准确启动,ios,c,core-audio,Ios,C,Core Audio,我们以时间间隔(bpm)播放节拍器音频文件,同时录制音频文件。然而,目前两个线程的开始时间并不完全同时,并且存在轻微的时间差,这对于音乐来说是不允许的 我们可以使用什么策略来保证两个进程在完全相同的时间(或几毫秒以下)启动 谢谢 我可以想出三种方法来完成这项工作(但显然我从未测试过它们) 您的每个线程都应该提前完成它们所能完成的所有初始化,然后等待一个“事件”。我能想到的几个时间事件: 使用通知-两个线程都侦听一些“启动”通知。这应该相当快 让两个线程都执行keyValue侦听-因此它们都在侦
谢谢 我可以想出三种方法来完成这项工作(但显然我从未测试过它们) 您的每个线程都应该提前完成它们所能完成的所有初始化,然后等待一个“事件”。我能想到的几个时间事件:
- 使用通知-两个线程都侦听一些“启动”通知。这应该相当快
- 让两个线程都执行keyValue侦听-因此它们都在侦听对已知对象(如appDelegate(或singleton))或它们都知道的任何对象(delegate?)上的某些属性的更改
- 初始化完成后,让每个调用都有一个委托。当两个都“就绪”时,代理可以一个接一个地(在主线程上)发送消息到“开始”
你也可以用NSLock和friends进行实验——不确定你会得到什么样的延迟。Key Value Observing非常快速和轻量级,适用于任何线程。我可以想出三种方法来实现这一点(但显然我从未测试过它们) 您的每个线程都应该提前完成它们所能完成的所有初始化,然后等待一个“事件”。我能想到的几个时间事件:
- 使用通知-两个线程都侦听一些“启动”通知。这应该相当快
- 让两个线程都执行keyValue侦听-因此它们都在侦听对已知对象(如appDelegate(或singleton))或它们都知道的任何对象(delegate?)上的某些属性的更改
- 初始化完成后,让每个调用都有一个委托。当两个都“就绪”时,代理可以一个接一个地(在主线程上)发送消息到“开始”
你也可以用NSLock和friends进行实验——不确定你会得到什么样的延迟。Key Value Observing非常快速和轻量级,可以在任何线程上工作。实现这一点的最准确和可靠的方法是在CoreAudio音频渲染/输入处理程序中实现音频录制和节拍器播放,而不是使用更高级别的API和依靠同步两个线程。@davidh答案中的任何机制都不能保证内核执行线程,尽管它们可能大部分时间都可以在负载较轻的系统上工作 回调是在管理CoreAudio的实时线程上调用的,并与硬件音频时钟同步,硬件音频时钟可能与内核的计时器异步
您需要将metronome示例加载到内存中,并在初始化时转换为输出格式-可能使用AudioToolbox API之一。音频渲染回调只是在适当的时间将其复制到输出缓冲区。实现这一点的最准确和可靠的方法是在CoreAudio音频渲染/输入处理程序中实现音频录制和节拍器播放,而不是使用更高级别的API和依靠同步两个线程。@davidh答案中的任何机制都不能保证内核执行线程,尽管它们可能大部分时间都可以在负载较轻的系统上工作 回调是在管理CoreAudio的实时线程上调用的,并与硬件音频时钟同步,硬件音频时钟可能与内核的计时器异步
您需要将metronome示例加载到内存中,并在初始化时转换为输出格式-可能使用AudioToolbox API之一。音频渲染回调只是在适当的时间将其复制到输出缓冲区。在iOS下,您不能启动新进程(除非它在越狱环境中)。@EricPostpischil您不能在iOS中分叉进程。但是,您可以创建新线程。OP在这里合并了
进程
和线程
@埃里克:真的吗?iOS允许您使用fork
?我不这么认为。@rmaddy:啊,是的,好吧,iOS允许我使用fork
,但你不允许。很抱歉。但是,OP创建了两个线程,只想同步它们。因此,“进程”显然是用在英语意义上的,而不是操作系统意义上的。OP询问的是如何同步两件事,而不是如何创建一个新进程。@EricPostpischil是的,谢谢,我们使用的是两件事。在iOS下,您不能启动新进程(除非它处于越狱环境)。@EricPostpischil您不能fork
iOS中的进程。但是,您可以创建新线程。OP在这里合并了进程
和线程
@埃里克:真的吗?iOS允许您使用fork
?我不这么认为。@rmaddy:啊,是的,好吧,iOS允许我使用fork
,但你不允许。很抱歉。但是,OP创建了两个线程,只想同步它们。因此,“进程”显然是用在英语意义上的,而不是操作系统意义上的。OP询问的是如何同步两件事,而不是如何创建一个新流程。@EricPostFischil是的,谢谢,我们使用的是两件事。谢谢,我们将进一步研究。谢谢,我们将进一步研究。