我正在尝试为我的内部工作构建 iOS 应用程序。这个应用程序是简单的步进 MIDI 音序器。这个应用程序现在所做的就是向同一 iPad 上的“网络会话”发送简单的 midi 消息——这个会话人们称之为“虚拟 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,这将不会有任何延迟?我注意到当“基因组”应用程序发送 midi 并且我滚动或触摸收件箱信件时,邮件应用程序会拖拽 - 这是正确的,因为 iOS 将基因组放在首位。我想要同样的。
这是我发送 MIDI 消息的方式:
我正在循环发送 Midi 笔记。所以听起来像 Dm,Dm,Dm,Dm ......每个 1/8。重要的是它们之间没有时间间隔/延迟。但它有延迟一段时间。
Main 高优先级 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 }]; }