2010-06-19 3 views
2

J'ai une bibliothèque de 16 clips sonores courts que je dois pouvoir jouer rapidement. J'ai réalisé que créer et préparer des objets en temps réel était trop demander à l'iPhone. Par conséquent, lors de l'initialisation de mon application, je crée une série de AVAudioPlayers afin que chacun soit pré-chargé avec l'un de mes 16 sons, afin qu'ils soient prêts à être joués à tout moment. Le problème est, pour garder cela propre, je voudrais stocker les références pour ces 16 AVAudioPlayers dans un NSMutableArray, donc je peux facilement y accéder simplement en connaissant leur emplacement de tableau. Cependant, la façon dont je le fais le simulateur se bloque w/aucun message d'erreur dans le journal:Puis-je stocker des références AVAudioPlayer dans un NSMutableArray et les lire à volonté?

Voici comment je actuellement à l'installation tableau de AVAudioPlayer références:

// (soundPlayers is an NSMutableArray instance var) 
soundPlayers = [NSMutableArray arrayWithCapacity:(NSUInteger)16];          

for (int i = 0; i < 16; i++) { 
    NSString *soundName = [NSString stringWithFormat:@"sound-%d", i]; 
    NSString *soundPath = [[NSBundle mainBundle] pathForResource:soundName ofType:@"mp3"]; 
    NSURL *soundFile = [[NSURL alloc] initFileURLWithPath:soundPath]; 
    AVAudioPlayer *p = [[AVAudioPlayer alloc] initWithContentsOfURL:soundFile error:nil]; 
    [soundFile release]; 
    [p prepareToPlay]; 
    [soundPlayers addObject:(id)p]; 
    [p release]; 
} 

Puis, plus tard J'essaie de charger, disons, le son n ° 8 et de le lire:

// (soundPlayer is an AVAudioPlayer instance var) 
self.soundPlayer = [soundPlayers objectAtIndex:(NSUInteger)8]; 
[soundPlayer play]; 

Des idées? Est-ce que quelqu'un sait si l'un des outils de débogage fournis avec XCode serait utile pour ce type de problème?

+0

Il est hors sujet, mais vous n'avez pas besoin la distribution dans '(id) p 'et' (NSUInteger) 16'. Et s'il vous plaît chercher le journal des accidents.N'y a-t-il vraiment rien affiché dans la console du débogueur? Cela ne m'est jamais arrivé. – Yuji

+0

Merci! Très utile. – todd412

Répondre

2

Je devine juste ici, mais il pourrait y avoir un problème avec la capacité de la rangée.

Essayez plutôt: soundPlayers = [[NSMutableArray alloc] init];.

Ce n'est pas susceptible d'être une cause de l'accident, mais essayez NSLogging self.soundPlayer avant d'appeler -play dessus pour s'assurer que ce n'est pas nil. Et une autre petite chose mineure: vous n'avez pas besoin de typer p lorsque vous l'ajoutez au tableau. Il suffit d'appeler [soundPlayers addObject:p] sans (id).

Je ne suis pas sûr de la cause exacte de votre accident, juste en passant par le code et en soulignant ce qui ne semble pas correct. J'espère que cela t'aides!

+0

NSMutableArray se développer au besoin, la capacité n'est pas le problème. – progrmr

+0

Droit- Je ne pense pas que la capacité est le problème, mais je suis passé au code d'initialisation ci-dessus juste au cas où. Également débarrassé du typecasting, merci. – todd412

+0

Ça l'a fait! Il s'est avéré que j'avais besoin d'initialiser le tableau de la façon dont vous avez suggéré ici pour que cela fonctionne. L'autre changement critique s'est avéré être dans la ligne où je tire la référence AVAudioPlayer à partir du tableau - il a besoin d'un «self» supplémentaire. Je crois le forcer à utiliser la méthode 'getter' synthétisée, comme dans: self.soundPlayer = [self.soundPlayers objectAtIndex: (NSUInteger) 8]; - Merci à tous pour votre aide! – todd412

0

Cela me semble OK, sauf peut-être vous ne devriez pas appeler prepareToPlay avant de les mettre dans le tableau.

Il est probablement préférable de le faire quand vous allez les jouer. La description de cette méthode indique qu'elle précharge les tampons et acquiert le matériel audio pour la lecture. Le faire 16 fois à la fois peut être trop.

EDIT - vous devez également ajouter une vérification d'erreur, les résultats manquants pouvant indiquer que quelque chose ne va pas, initWithContentsOfURL: outError: renvoie un message d'erreur. Profitez de cette:

NSError* error = nil; 
AVAudioPlayer *p = [[AVAudioPlayer alloc] initWithContentsOfURL:soundFile error:&error]; 
if (error) { 
    NSLog(@"ERROR: %@, URL=%@", error.localizedDescription, soundFile); 
} 
+0

Je pense que les préparer juste avant de jouer a plus de sens, j'ai changé ça. J'ai également implémenté votre suggestion de vérification d'erreur - merci pour cela. Cependant, il n'a montré aucune erreur, il semble donc que les AVAudioPlayers sont créés avec succès. – todd412

1

Il est très probablement le cas que votre soundPlayers est mutable tableau publié à un moment donné, puisque vous n'êtes pas retenir. Je veillerais votre propriété pour le tableau est défini pour retenir et faire ce que Macatomy dit précédemment:

self.soundPlayers = [[NSMutableArray alloc] init]; 

Ou encore initWithCapacity:

+0

Bon point. J'ai ajouté le code suivant au fichier d'en-tête pour m'assurer que l'arrray est retenu, mais toujours pas de chance. @property (nonatomic, retain) NSMutableArray * soundPlayers; – todd412

Questions connexes