我正在尝试为我的内部工作构建iOS应用程序。这个应用程序是简单的midi音序器。 此应用程序现在正在做的就是将简单的midi消息发送到同一台iPad上的“网络会话” - 这个会话的人称之为“Virtual Midi”,抱歉我不知道正确的名称是什么 - 但这不是问题,这部分对我来说工作正常,后台应用程序(如animoog,ThumbJam等)收到此消息很好......
唯一的主要问题是我遇到问题。 当我在LOOP中发送midi音符(大约1 / 8,1 / 16,无论如何)和当应用程序进入后台时(当我按下主页按钮时)我正在其他应用程序中旅行,例如Mail,Safari,或者在animoog中做某事,然后每次都是lug / buggy。,延迟工作。例如“Genome Midi Sequencer” - 在我旅行时没有拖拽并在Mail,Safari或其他应用程序中执行某些操作 - 换句话说即使任何当前应用程序占用CPU中的所有资源 - Genome Midi音序器仍然发送midi消息,没有任何延迟。为什么?
如何构建相同的超高优先级NSThread?,即使我打开其他应用程序并加载CPU,它也能顺利运行?我注意到当“Genome”应用程序发送midi并且我滚动或触摸收件箱字母时,然后邮件应用程序拖拽 - 这是正确的,因为iOS为Genome提供了优先权。 我想要一样。
以下是我发送midi消息的方式:
我在循环中发送Midi音符。所以它听起来像Dm,Dm,Dm,Dm ......每1/8。重要的是他们之间没有间隙/延迟。 但是有些时间延迟了。
主要优先级为NSThread
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;
}
}
}
在AppDelegate.m文件中
- (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
}];
}
答案 0 :(得分:1)
首先,我会查看Michael Tyson撰写的A Tasty Pixel博客,了解一些基本的时间信息。您当前的方法效率非常低,并且会毫无理由地使用许多cpu周期。本质上,CPU在高优先级线程上不断进行比较,这不是一个好主意。
解决问题的最佳方法是深入研究Core Audio。如果您的应用位于前台或后台,这将允许您实时安排样本,但是,它确实需要一些时间来学习。快速完成您想要做的事情的一个好方法是运行由Michael建立的Amazing Audio Engine,但是对于快速启动并运行核心音频有很好的支持。