2010-08-29 25 views
0

Je suis habitué à créer des sons comme ceci:Comment créer un tableau de SystemSoundID? En utilisant le cadre AudioToolbox

NSString *explosionsoundpath = [[NSBundle mainBundle] pathForResource:@"explosion" ofType:@"caf"]; 
CFURLRef explosionurl = (CFURLRef) [NSURL fileURLWithPath:explosionsoundpath]; 
AudioServicesCreateSystemSoundID (explosionurl, &explosion1a); 
AudioServicesCreateSystemSoundID (explosionurl, &explosion1b); 

où explosion1a et explosion1b sont variables d'instance déclarées dans le fichier .h avec:

SystemSoundID explosion1a; 

Chaque fois que je tente de faire de cette processus dans un tableau comme celui-ci

NSString *plasmasoundpath = [[NSBundle mainBundle] pathForResource:@"plasmasound" ofType:@"caf"]; 
CFURLRef plasmaurl = (CFURLRef) [NSURL fileURLWithPath:plasmasoundpath]; 
SystemSoundID plasmalaunch1; 
AudioServicesCreateSystemSoundID (plasmaurl, &plasmalaunch1); 
[self.plasmasounds addObject:plasmalaunch1]; 

je reçois un avertissement:

"Passing argument 1 of addObject makes pointer from integer without a cast. 

Si je mets le symbole & avant plasmalaunch1 dans l'argument addObject je reçois un

incompatible pointer type warning. 

Je suis en train de créer un tableau d'effets sonores que je peux jouer plus tard en appelant:

SystemSoundID sound = [self.plasmasounds objectAtIndex:i]; 
AudioServicesPlaySystemSound(sound); 

Des conseils sur la façon de faire ce travail (ou une meilleure façon de résoudre ce problème) apprécié!

+0

Pourquoi est-ce un wiki communautaire? –

Répondre

2

Un SystemSoundID est une valeur entière, pas un objet; et un pointeur sur un nombre n'est pas un pointeur vers un objet.

Vous pouvez encapsuler la valeur numérique dans un objet avant de le stocker dans un NSArray, puis de supprimer ultérieurement le numéro d'ID de l'objet pour lire le son. Ou vous pouvez stocker la valeur entière dans un tableau C au lieu d'un NSArray.

+0

Merci pour la réponse. Pouvez-vous donner un exemple de comment faire l'un ou l'autre? Pour le plus tard je devine que je prendrais un intValue? Je ne suis pas sûr de savoir comment faire le premier. – quantumpotato

+0

Pour la première fois, vous pouvez utiliser la méthode NSNumber numberWithInt: pour convertir une valeur int en objet, et la méthode NSNumber intValue pour extraire l'ID numérique de l'objet. Pour ce dernier (tableau C), vous n'avez rien à faire car vous avez déjà une valeur int. – hotpaw2

+1

J'utiliserais 'NSValue' plutôt que' NSNumber' pour des raisons sémantiques - oui, SystemSoundID est un 'typedef' de' int', mais ce n'est pas un entier, c'est une référence opaque aux données. C'est tout académique cependant, et les deux classes vont travailler. –

1

Ceci est ancien, mais toujours pertinent. La meilleure solution consiste à créer une classe avec un constructeur qui prend un argument SystemSoundID. Cela permet une flexibilité maximale. Vous avez maintenant un objet qui peut facilement être ajouté à NSArray ou à toute autre classe de collection.

#import <Foundation/Foundation.h> 
@import AudioToolbox; 

@interface SATSound : NSObject 
@property (nonatomic)SystemSoundID id; 
- (id)initWithSoundID:(SystemSoundID)id; 
@end 

/////

#import "SATSound.h" 

@implementation SATSound 
- (id)initWithSoundID:(SystemSoundID)id 
{ 
    if (self = [super init]) { 
     _id = id; 
    } 
    return self; 
} 

Juste instancier cette classe, passer votre SystemSoundID, ajoutez l'objet/instance à un tableau, et vous pouvez retirer les valeurs avec facilité et non avoir à se soucier des conversions de type. Vous pouvez également ajouter d'autres propriétés qui pourraient s'avérer utiles, telles que le nom du fichier son.