4

play単一のサウンドファイルと現在再生中buttonstopsすべてのサウンドのボタンを作成しようとしています。buttonユーザーが短時間で複数のボタンまたは同じボタンをクリックした場合、アプリはすべてのサウンドを同時に再生する必要があります。私はiOSのシステムサウンドサービスを使用してこれをそれほど困難なく達成しました。ただし、システムサウンドサービスはvolumeiPhone's呼び出し音が設定されているを介してサウンドを再生します。私は今、ユーザーがメディアボリュームを通して音を出すAVAudioPlayerことができるように使用しようとしています。playこれが私が現在(まだ失敗している)サウンドの再生を使用しているコードです:

-(IBAction)playSound:(id)sender
{
   AVAudioPlayer *audioPlayer;
   NSString *soundFile = [[NSBundle mainBundle] pathForResource:@"Hello" ofType:@"wav"];
   audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:soundFile] error:nil];
   [audioPlayer prepareToPlay];
   [audioPlayer play];
}

このコードをiPhoneシミュレーターで実行すると、サウンドは再生されませんが、大量の出力が表示されます。これをiPhoneで実行すると、サウンドが再生されません。いくつかの調査とテストを行った後、audioPlayer変数が自動参照カウントによって解放されていることがわかりました。また、このコードは、audioPlayer変数がインターフェイスファイルのインスタンス変数およびプロパティとして定義されている場合に機能しますが、一度に複数のサウンドを再生することはできません。

まず最初に:AVAudioPlayer自動参照カウントを使用して、固定して、一度に無限の数のサウンドを再生するにはどうすればよいですか?IBActionまた、これらのサウンドが再生されているときに、すべてのサウンドの再生を停止する2番目の方法を実装するにはどうすればよいですか?

4

1 に答える 1

17

まず、宣言とalloc/initをaudioplayer同じ行に配置します。また、再生できるサウンドは1つだけAVAudioPlayerですが、同時にいくつでも作成できます。そして、すべてのサウンドを停止するには、おそらくを使用しNSMutableArray、それにすべてのプレーヤーを追加してから、繰り返します。[audioplayer stop];

//Add this to the top of your file
NSMutableArray *soundsArray;

//Add this to viewDidLoad
soundsArray = [NSMutableArray new]

//Add this to your stop method
for (AVAudioPlayer *a in soundsArray) [a stop];

//Modified playSound method
-(IBAction)playSound:(id)sender {
     NSString *soundFile = [[NSBundle mainBundle] pathForResource:@"Hello" ofType:@"wav"];
     AVAudioPlayer *audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:soundFile] error:nil];
     [soundsArray addObject:audioPlayer];
     [audioPlayer prepareToPlay];
     [audioPlayer play];
  }

それはあなたが必要なことをするはずです。

于 2012-06-25T18:35:31.660 に答える