私はそれぞれが.cafファイルからオーディオサンプルを再生する6つのボタンを持っています。私がボタンを押すと、音がうまく再生されます。それが終わるのを待ってからもう一度押すと、それはうまくいきますが、ボタンを早く押すと、再生前に音がポップしてクリックされます。ボタンを押すと音が鳴ります。ヒットボタンは速く、サウンドの再生はポップとクリックします
ボタンをクリックするたびにAVAudioPlayerを割り当てるだけでは、このポップアップの問題はありませんでしたが、複数の割り当てでメモリリークが発生しました。だから、各ボタンに6つのAVAudioPlayersを作成して再利用しました。これはメモリリークを解消しましたが、上書きするとサンプルがクリック/ポップします。
私は、ボリュームを0に設定し、次のサンプルを再生する前にAVAudioPlayerインスタンスを停止するのをやめさせるためにさまざまな方法を試しましたが、高速のボタンを押して同じサンプルサウンドを繰り返し再生する正しい方法を見つけることができません。ポップを止める。
私はAVAudioPlayerプロパティを.hに保持し、allocステートメントでautoreleaseを使用しています。
お願いします。
**編集:解決策を見つけました。
基本的に私は10個のAVAudioPlayersを自動リリースし、1つが[myPlayer1 isPlaying]の場合は次のものを使用します。
BOOL done = NO;
if(![self.audioPlayer0 isPlaying] && done == NO) {
self.audioPlayer0 = [ [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil] autorelease ];
[audioPlayer0 play];
done = YES;
}
if(![self.audioPlayer1 isPlaying] && done == NO) {
self.audioPlayer1 = [ [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil] autorelease ];
[audioPlayer1 play];
done = YES;
}
if(![self.audioPlayer2 isPlaying] && done == NO) {
self.audioPlayer2 = [ [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil] autorelease ];
[audioPlayer2 play];
done = YES;
}
if(![self.audioPlayer3 isPlaying] && done == NO) {
self.audioPlayer3 = [ [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil] autorelease ];
[audioPlayer3 play];
done = YES;
}
if(![self.audioPlayer4 isPlaying] && done == NO) {
self.audioPlayer4 = [ [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil] autorelease ];
[audioPlayer4 play];
done = YES;
}
if(![self.audioPlayer5 isPlaying] && done == NO) {
self.audioPlayer5 = [ [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil] autorelease ];
[audioPlayer5 play];
done = YES;
}
if(![self.audioPlayer6 isPlaying] && done == NO) {
self.audioPlayer6 = [ [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil] autorelease ];
[audioPlayer6 play];
done = YES;
}
if(![self.audioPlayer7 isPlaying] && done == NO) {
self.audioPlayer7 = [ [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil] autorelease ];
[audioPlayer7 play];
done = YES;
}
if(![self.audioPlayer8 isPlaying] && done == NO) {
self.audioPlayer8 = [ [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil] autorelease ];
[audioPlayer8 play];
done = YES;
}
if(![self.audioPlayer9 isPlaying] && done == NO) {
self.audioPlayer9 = [ [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil] autorelease ];
[audioPlayer9 play];
}
これもうまくいくかもしれませんが、それを設定することを検討した後、既存のAVAudioPlayerがまだ再生されている場合は、新しいAVAudioPlayerを生成しようと決めました。これにより、1つのAVAudioPlayerオブジェクトを使用して、複数のサンプルを1つずつオーバーレイするのではなく、互いにオーバーレイすることができます。とにかくありがとう。 – GeoffCoope