2009-05-30 4 views
0

Je suis en train d'implémenter un effet sonore qui joue pendant qu'un utilisateur glisse un UISlider.Le son AVAudioPlayer sur l'iPhone arrête la boucle de façon inattendue: comment déboguer?

Dans un previous question, j'ai utilisé AudioServicesPlaySystemSound() mais ce type de son ne peut pas être interrompue. J'ai besoin que le son s'arrête quand l'utilisateur ne fait pas glisser le curseur mais ne l'a pas sorti.

Maintenant, je crée un son en utilisant un objet AVAudioPlayer . Je l'initialise dans mon View Controller comme ceci:

@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]; 
} 

J'ai deux méthodes pour contrôler le son. Le premier joue le son à chaque fois que le curseur est déplacé. Il est connecté à l'événement Valeur modifiée d'UISlider dans Interface Builder.

-(IBAction)sliderChanged:(id)sender; 
{ 
    // only play if previous sound is done. helps with stuttering 
    if (![self.player1 isPlaying]) { 
     [self.player1 play]; 
    } 
} 

La seconde méthode arrête le son lorsque l'utilisateur relâche le bouton du curseur. Il est connecté à l'événement Touch Up Inside de UISlider.

-(IBAction)haltSound; 
{ 
    [self.player1 stop]; 
} 

Cela fonctionne lorsque le bouton de curseur est déplacé puis relâché rapidement, mais si vous maintenez le bouton pendant plus de deux ou trois secondes, les répétitions de son (bon) puis se désagrège (mauvais). À partir de ce moment, le son ne sera plus joué (super mauvais).

J'ai essayé de placer le son à l'aide de la boucle:

[self.player1 setNumberOfLoops:30]; 

... mais qui conduit à l'application de gel (plus le verrouillage du simulateur). Que puis-je faire pour déboguer ce problème?

Répondre

0

Lorsqu'un utilisateur tient le UISlider, la valeur modifiée est appelée plusieurs fois (à chaque fois que l'utilisateur déplace légèrement). J'utiliserais Touch Down à la place.

Vous pouvez toujours essayer en utilisant la boucle pour cette route ...

J'aime l'idée de jouer un son lorsque l'utilisateur se déplace le curseur cependant. Dites-moi comment ça fonctionne.

[email protected]

Questions connexes