Comment puis-je obtenir le chemin du système de fichiers pour une ressource sur l'iPhone?
-
19-09-2019 - |
Question
Sur l'iPhone, je dois obtenir le chemin de la ressource. OK, fait, mais quand il vient à la chose CFURLCreateFromFileSystemRepresentation, je ne sais pas comment résoudre ce problème. Pourquoi cette erreur se produit? Toute solution ou solution de contournement serait très appréciée. Nous vous remercions à l'avance.
J'ai examiné les exemples suivants afin de lire l'audio en utilisant AudioQueue sur l'iPhone: SpeakHere, AudioQueueTools (à partir du répertoire SimpleSDK) et AudioQueueTest. J'ai essayé ceci et cela, en essayant de mettre les casse-tête ensemble. En ce moment, je suis coincé à ce sujet. Le programme est écrasé à cause de l'exception levée de la sndfile ci-dessus.
J'utilise AVAudioPlayer pour jouer tous les sons sur mes jeux iPhone. Sur le vrai appareil iPhone, il est avéré être très laggy quand un son doit être joué, alors j'ai décidé que je dois 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");
}
}
La solution
Pourquoi avez-vous besoin d'un CFURL?
Si vous avez une méthode qui nécessite d'ailleurs une CFURL, vous pouvez simplement utiliser un NSURL grâce à pontage sans frais. 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 que vous faites probablement quelque chose de mal.
Autres conseils
Je ne sais pas si cela va se débarrasser de votre exception, mais il existe 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");
...
}