1

内部作業用の iOS アプリを構築しようとしています。このアプリはシンプルなステップ MIDI シーケンサーです。このアプリが現在行っていることはすべて、同じ iPad の「ネットワーク セッション」に単純な MIDI メッセージを送信することです。私には問題なく動作し、バックグラウンド アプリ (animoog、ThumbJam など) はこのメッセージを正常に受信します...

唯一の主な問題は、私が問題に直面したことです。LOOP で MIDI ノートを送信しているとき(約 1/8、1/16 など)、アプリケーションがバックグラウンドに移行しているとき (ホーム ボタンを押したとき)、メール、Safari などの他のアプリで移動しているときに、またはanimoogで何かをしている場合、毎回ラグ/バギー/です。、遅れて動作します。たとえば、「Genome Midi Sequencer」 - 旅行中にメール、Safari、または他のアプリで何かをしているときに持ち歩くことはありません - つまり、現在のアプリケーションが CPU のすべてのリソースを使用している場合でも - Genome Midi シーケンサーは、何もせずに midi メッセージを送信し続けます遅れ。なんで?

同じ超優先度の NSThread を構築するにはどうすればよいですか? 、他のアプリを開いてCPUに負荷をかけても遅延なく動作するのはどれですか?「Genome」アプリが midi を送信し、受信トレイの文字をスクロールまたはタッチすると、Mail アプリが遅延することに気付きました。iOS が Genome を最優先するため、これは正しいことです。同じものが欲しい。

これが私がmidiメッセージを送信する方法です:

ループで Midi ノートを送信しています。つまり、Dm、Dm、Dm、Dm……それぞれ 1/8 のように聞こえます。そして、それらの間に時間のギャップ/遅延がなかったことが重要です. しかし、少し遅れてバグがあります。

  1. メイン 高優先度 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