2011-07-14 5 views
2

私は非常に正確なタイミングでサウンドを発射しようとしています。タイマーの精度(オーディオあり)

私は、タイマーを作成するには、このコードを使用:

timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0));  
    dispatch_source_set_timer(timer, DISPATCH_TIME_NOW, 1ull*500000000, 5000ull); 
    dispatch_source_set_event_handler(timer, ^{[myAVAudioPlayer play];}); 
    dispatch_resume(timer); 

myAVAudioPlayerは、このように初期化されます。

NSURL *soundURL = [NSURL fileURLWithPath:[mainBundle pathForResource:@"clock" ofType:@"aiff"]]; 
    myAVAudioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:soundURL error:&error]; 
    [myAVAudioPlayer prepareToPlay]; 

私もから.caf音のフォーマットおよびAppleのSoundEffectクラスを使用しようとしましたBubbleLevelサンプルコードであり、パフォーマンスに顕著な違いはありません。

発射率が低い場合、音はかなり正確です。しかし、私が発射速度を上げると、音は非常に不正確です。

ご協力いただければ幸いです。

+0

私は同じ問題を抱えていますが、解決策を見つけましたか? – QuiBongJin

答えて

1

ディスパッチタイマは、音声精度の精度のために設計されていません。タイミングを正確に制御したい場合は、IIRCがあります.UPSは、ディスパッチキューの代わりにスレッドを直接使用することをAppleが推奨する数少ない領域の1つです。

Core Audioを調べてみると、正確にタイミングを制御することができます。私はAPIに精通しておらず、伝説的にひどく文書化されていますが、速いgoogleがat least one person doing the same thingとなってしまったので、より良い解決策を見つけることができるかもしれません。

+0

ありがとうございます。私はそれを調べます。 – Reggian

+0

「少なくとも1人の同じことをしている人」(http://kylehalladay.com/?p=35)のリンク参照がサイトのルートに移動しているように見えます。このトピックについて説明します。彼のソリューションの基礎を覚えていますか? – BigMacAttack