我正在尝试为内部工作构建iOS应用。这个程序是简单的步骤MIDI音序器。
此应用程序现在所做的所有操作都是在同一iPad上向“网络 session ”发送简单的midi消息-该 session 的人们称为“Virtual Midi”,对不起,我不知道正确的名字是什么-但这无关紧要,这部分对我来说效果很好,后台应用程序(例如animoog,ThumbJam等)可以很好地接收此消息...
唯一的主要问题是我遇到的问题。 当我在LOOP中发送MIDI音符(大约1 / 8、1 / 16,没关系)和时,应用程序将转到后台(当按下主屏幕按钮时),并且我正在其他应用程序中旅行邮件,Safari或在animoog中执行某些操作,然后每次都挂住/越野车/。 ,延迟工作。例如“Genome Midi Sequencer”-当我旅行并在Mail,Safari或其他应用程序中做某事时不拖拉-换句话说,即使任何当前应用程序占用了CPU中的所有资源- Genome Midi Sequencer仍在发送midi消息没有延迟。为什么?
如何构建相同的超高优先级NSThread? ,即使我打开了其他应用程序并加载了CPU,它也将毫无延迟地工作吗?我注意到,当“Genome”应用程序发送midi时,当我滚动或触摸收件箱中的字母时,然后会拖拽Mail应用程序-这是正确的,因为iOS将Genome放在首位。 我也要这样。
这是我发送Midi消息的方式:
我正在循环中发送Midi笔记。听起来像Dm,Dm,Dm,Dm .....每个1/8。而且重要的是,它们之间没有时间间隔/延迟。 但这是越野车,但会延迟一些时间。
NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(midiTimerTickTick) object:nil];
[thread setThreadPriority:1];
[thread start];
[thread release];
-(void) midiTimerTickTick{
uint64_t nextTime = mach_absolute_time();
uint64_t timerInterval = 1000*1000*8;
while (true){
if(mach_absolute_time() >= nextTime)
{
//do work
[self sendMidiMessage]; //Here piano playing
//++
nextTime+=timerInterval;
}
}
}
- (void)applicationDidEnterBackground:(UIApplication *)application
{
bgTask = [application beginBackgroundTaskWithExpirationHandler:^{
[application endBackgroundTask:bgTask]; //Tell the system that we are done with the tasks
bgTask = UIBackgroundTaskInvalid; //Set the task to be invalid
//System will be shutting down the app at any point in time now
}];
}
最佳答案
首先,我将检查迈克尔·泰森(Michael Tyson)的A Tasty Pixel博客,以获取一些基本的计时信息。您当前的方法效率很低,并且会无缘无故地使用许多cpu周期。本质上,CPU一直在对高优先级线程进行比较,这不是一个好主意。
解决问题的最佳方法是深入研究Core Audio。如果您的应用程序位于前台或后台,这将允许您实时安排采样时间,但是学习起来确实需要一些时间。快速开始您要执行的操作的一种好方法是运行也是由Michael构建的Amazing Audio Engine,但它对快速启动和运行核心音频提供了强大的支持。
关于ios - 超高优先级后台工作或QUARTZ精度,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20388796/