2011-02-15 18 views
1

私はバックグラウンドでソングを再生するAVAudioPlayerを持つゲームのUIViewControllerサブクラスを持っています。私のviewDidLoadメソッドでは、私は次のコードを持っています:UIViewControllerでのAVAudioPlayerの使用

[super viewDidLoad]; 

... 

[NSTimer scheduledTimerWithInterval: 0.03 target: self selector: @selector(gameLoop) userInfo: nil repeats: YES]; 

NSString *path = @"path-to-song"; 
self->audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL: [NSURL fileURLWithPath: path] error: NULL]; 
audioPlayer.delegate = self; 
audioPlayer.numberOfLoops = - 1; 
[audioPlayer play]; 

gameLoopは、ゲームのコアロジックを含むメソッドです。テストデバイスでアプリケーションを実行すると、オーディオは再生されますが、フリーズしているように見えますが、gameLoopは正常に動作しません。すべてのAVAudioPlayerコードを削除すると、ゲームは正常に動作します。ここに私が気付いていないスレッド問題があるようです。何か案は?

+0

どのような形式のオーディオファイルですか? (ちょうどそれが44MhzのAIFFファイルでないか、非常に高いビットレートのMP3か何かをチェックしているだけです) –

+0

それはなぜ違いがありますか?オーディオは正常に再生されます... –

答えて

2

後に呼び出されますそのproblem.BecauseことNO.Mayように:

- (void)playSong:(NSURL*)atURL 
{ 
    self->audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL: atURL error: NULL]; 
    audioPlayer.delegate = self; 
    audioPlayer.numberOfLoops = - 1; 
    [audioPlayer play]; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    ... 

    NSURL* url = [NSURL fileURLWithPath: @"path-to-song"] 
    [self performSelectorInBackground: @selector(playSong:) withObject: url]; 
} 
+0

これはシミュレータで動作するようです。オーディオが実際に私がMac上でRDP以上に再生しているかどうかはわかりません。私は明日実際のiPhoneデバイスでそれをテストし、それがどうなるか見てみましょう。あなたのコードは正常に動作するはずですが、ありがとうございます。一つの小さなこと、私はあなたが '@selector(playSong:)'をplaySongが1つの引数を取るので最下行に置くことを意味すると思います。それが動作すれば、+1して答えを受け入れます。 ;) –

+0

まあ、シミュレータとデバイスの両方で完全に動作しました。ありがとう! +1 –

0

タイマーリピートを削除:はい繰り返す:メソッドにあなたのAVAudioPlayerのコードを移動し、バックグラウンドスレッドでそれを実行してみてください、あなたのgameLoop方法は、0.3秒ごと

+1

これは意図です - したがってゲーム**ループ**;) –

関連する問題