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");
        }
}
Était-ce utile?

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");

    ...
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top