2009-05-30 4 views
0

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?

Antwort

0

Wenn ein Benutzer den UISlider hält, wird Value Changed VIELE VIELE Male aufgerufen (jedes Mal, wenn der Benutzer nur einen kleinen Betrag bewegt). Ich würde Touch Down stattdessen verwenden.

Sie könnten immer noch wollen, um versuchen die Schleife für diese Strecke mit ...

Ich mag die Idee, einen Ton zu spielen, während der Benutzer jedoch den Schieber bewegt. Lass mich wissen wie es funktioniert.

[email protected]