Ich implementiere einen Soundeffekt, der abgespielt wird, während ein Benutzer einen UISlider zieht.AVAudioPlayer-Sound auf dem iPhone stoppt das Looping unerwartet: Wie debugge ich?
In einem previous question habe ich AudioServicesPlaySystemSound() verwendet, aber diese Art von Sound kann nicht angehalten werden. Ich brauche den Ton, um anzuhalten, wenn der Benutzer den Schieberegler nicht aktiv zieht, aber nicht freigegeben hat.
Jetzt erstelle ich einen Ton mit einem AVAudioPlayer Objekt. Ich initialisiere es in meinem View Controller wie folgt:
@interface AudioLatencyViewController : UIViewController <AVAudioPlayerDelegate> {
AVAudioPlayer *player1;
}
@implementation AudioLatencyViewController
@property (nonatomic, retain) AVAudioPlayer *player1;
@synthesize player1;
-(void)viewDidLoad {
[super viewDidLoad];
// the sound file is 1 second long
NSString *soundFilePath = [[NSBundle mainBundle] pathForResource:@"tone1" ofType:@"caf"];
NSURL *fileURL = [[NSURL alloc] initFileURLWithPath:soundFilePath];
AVAudioPlayer *newPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:fileURL error:nil];
[fileURL release];
self.player1 = newPlayer;;
[newPlayer release];
[self.player1 prepareToPlay];
[self.player1 setDelegate:self];
}
Ich habe zwei Methoden, um den Ton zu steuern. Der erste spielt den Sound ab, wenn der Slider bewegt wird. Er ist mit dem UISlider-Ereignis Value Changed in Interface Builder verbunden.
-(IBAction)sliderChanged:(id)sender;
{
// only play if previous sound is done. helps with stuttering
if (![self.player1 isPlaying]) {
[self.player1 play];
}
}
Die zweite Methode stoppt den Ton, wenn der Benutzer die Schiebetaste loslässt. Es ist mit dem UISlider Touch Up Inside Ereignis verbunden.
-(IBAction)haltSound;
{
[self.player1 stop];
}
Dies funktioniert, wenn der Schiebeknopf schnell dann freigegeben bewegt wird, aber wenn Sie die Taste länger als zwei oder drei Sekunden lang gedrückt halten, bricht der Ton wiederholt (gut), dann nach oben (sehr schlecht). Ab dann wird der Sound nicht mehr abgespielt (super schlecht).
habe ich versucht, den Ton unter Verwendung Kreiseinstellung:
[self.player1 setNumberOfLoops:30];
... aber das führt zum Gefrieren app (plus den Simulator Perren).
Was kann ich tun, um dieses Problem zu beheben?