1

我正在尝试为我的内部工作构建 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。重要的是它们之间没有时间间隔/延迟。但它有延迟一段时间。

  1. Main 高优先级 NSThread

    NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(midiTimerTickTick) object:nil];
            [thread setThreadPriority:1];
            [thread start];
            [thread release];
    
  2. 创建线程的方法

    -(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;
            }
        }        
    }
    
  3. 在 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
        }];
    }
    
4

1 回答 1

1

首先,我会查看Michael Tyson的A Tasty Pixel博客,了解一些基本的计时信息。您当前的方法效率非常低,并且会无缘无故地使用许多 cpu 周期。本质上,CPU 一直在对高优先级线程进行比较,这不是一个好主意。

解决问题的最佳方法是深入研究 Core Audio。如果您的应用程序在前台或后台,这将允许您实时安排您的示例,但是,这确实需要一些时间来学习。快速完成您想做的事情的一个好方法是运行同样由 Michael 构建的Amazing Audio Engine ,但它为快速启动和运行核心音频提供了强大的支持。

于 2013-12-19T18:40:17.557 回答