2009-07-24 9 views
4

Sur l'iPhone, j'ai besoin d'obtenir le chemin pour la ressource. OK, fait cela, mais quand il s'agit de CFURLCreateFromFileSystemRepresentation chose, je ne sais pas comment résoudre ce problème. Pourquoi cette erreur se produit-elle? Toute solution ou solution de contournement serait très appréciée. Merci d'avance.Comment puis-je obtenir le chemin du système de fichiers pour une ressource sur iPhone?

J'ai regardé les exemples suivants afin de jouer de l'audio en utilisant AudioQueue sur l'iPhone: SpeakHere, AudioQueueTools (du répertoire SimpleSDK) et AudioQueueTest. J'ai essayé de faire ceci et cela, en essayant de mettre les puzzles ensemble. En ce moment, je suis coincé à cela. Le programme s'est écrasé à cause de l'exception lancée depuis le fichier sndFile ci-dessus. J'utilise AVAudioPlayer pour jouer tous les sons de mes jeux iPhone. Sur le vrai iPhone, il s'est avéré très décalé quand un son devait être joué, j'ai donc décidé d'utiliser AudioQueue.

- (id) initWithFile: (NSString*) argv{ 

    if (self = [super init]){ 
     NSString *soundFilePath = [[NSBundle mainBundle] 
            pathForResource:argv 
              ofType:@"mp3"]; 
     int len = [soundFilePath length]; 
     char* fpath = new char[len]; 

     //this is for changing NSString into char* to match 
     //CFURLCreateFromFileSystemRepresentation function's requirement. 
     for (int i = 0; i < [soundFilePath length]; i++){ 
      fpath[i] = [soundFilePath characterAtIndex:i]; 
     } 

     CFURLRef sndFile = CFURLCreateFromFileSystemRepresentation 
          (NULL, (const UInt8 *)fpath, strlen(fpath), false); 
     if (!sndFile) { 
      NSLog(@"sndFile error"); 
      XThrowIfError (!sndFile, "can't parse file path"); 
     } 
} 
+0

Qu'essayez-vous d'accomplir? Je n'aime pas les questions qui demandent comment utiliser une méthode de cadre par opposition à comment puis-je résoudre ce problème réel. Aussi, que se passe-t-il avec l'ellipse redondante? –

+0

Correction d'une question –

+0

OK, désolé pour cela. J'étais un peu fatigué. Quoi qu'il en soit, j'ai essayé de suivre tous les exemples pour AudioQueue et j'ai aussi lu le document Apple pour cela. Étant donné que je ne suis pas très expérimenté, je ne sais pas comment traiter correctement CFURLRef. Tout ce que je comprends de tous les exemples et documents, c'est que j'ai besoin d'utiliser le CFURLCreateFromFileSystemRepresentation pour obtenir un CFURLRef afin que je puisse utiliser ce CFURLRef comme argument dans la méthode AudioFileOpenURL. Mais j'ai eu une erreur disant: "terminated appelé après avoir lancé une instance de 'CAXException'". Je ne sais pas comment faire face à cette erreur. – Karl

Répondre

11

Pourquoi avez-vous besoin d'un CFURL?

Si vous avez une méthode ailleurs nécessitant un CFURL, vous pouvez simplement utiliser un NSURL grâce au pontage gratuit. Donc, pour créer le NSURL, vous souhaitez simplement faire:

NSString * soundFilePath = [[NSBundle mainBundle] 
           pathForResource:argv 
              ofType:@"mp3"]; 

    NSURL *soundURL = [NSURL fileURLWithPath:soundFilePath]; 

En général, si vous vous trouvez à l'aide des objets CF vous êtes probablement en train de faire quelque chose de mal.

+0

Que signifie CF? Je me sens bête de demander, mais il y a trop de possibilités. – Sneakyness

+0

Core Foundation, les appels NS sont basés sur ces appels de niveau inférieur - il existe généralement une méthode plus simple et plus propre à utiliser une méthode NS qu'une méthode CF. –

+0

Pas tout à fait vrai "En général, si vous utilisez des objets CF, vous faites probablement quelque chose de mal." Les classes Core Foundation peuvent être utiles si: 1) Vous essayez de lire exif/metadata dans l'image 2) Si vous avez besoin par exemple de la taille de l'image et que vous ne voulez pas charger une grande image (map tile) comme 2048x2048 dans Mémoire. 3) Et ainsi de suite .... –

0

Je ne suis pas sûr si cela va se débarrasser de votre exception, mais il est un moyen plus simple de convertir un NSString à un tableau de char. Voici comment j'écrire cette méthode:

- (id) initWithFile:(NSString*) argv 
{ 
    if ((self = [super init]) == nil) { return nil; } 

    NSString * soundFilePath = [[NSBundle mainBundle] 
           pathForResource:argv 
              ofType:@"mp3"]; 
    CFURLRef sndFile = CFURLCreateFromFileSystemRepresentation 
         (NULL, [soundFilePath UTF8String], 
         [soundFilePath length], NO); 

    if (!sndFile) { NSLog(@"sndFile error"); } 
    XThrowIfError (!sndFile, "can't parse file path"); 

    ... 
} 

Ou, puisque CFURL est « ponté sans frais » avec NSURL, vous pouvez simplement faire:

- (id) initWithFile:(NSString*) argv 
{ 
    if ((self = [super init]) == nil) { return nil; } 

    NSString * soundFilePath = [[NSBundle mainBundle] 
           pathForResource:argv 
              ofType:@"mp3"]; 
    NSURL * sndFile = [NSURL URLWithString:[soundFilePath 
         stringByAddingPercentEscapesUsingEncoding: 
         NSUTF8StringEncoding]]; 
    if (!sndFile) { NSLog(@"sndFile error"); } 
    XThrowIfError (!sndFile, "can't parse file path"); 

    ... 
}