4

在 iPhone 上,我需要获取资源的路径。好的,做到了,但是当涉及到 CFURLCreateFromFileSystemRepresentation 的事情时,我只是不知道如何解决这个问题。为什么会出现这个错误?任何解决方案或解决方法将不胜感激。先感谢您。

为了在 iPhone 上使用 AudioQueue 播放音频,我查看了以下示例:SpeakHere、AudioQueueTools(来自 SimpleSDK 目录)和 AudioQueueTest。我试着做这做那,试图把谜题放在一起。现在,我陷入了困境。由于上面的 sndFile 抛出的异常,程序崩溃了。

我正在使用 AVAudioPlayer 在我的 iPhone 游戏中播放所有声音。在真正的 iPhone 设备上,当播放声音时结果非常滞后,所以我决定需要使用 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");
        }
}
4

2 回答 2

11

为什么需要 CFURL?

如果您在其他地方有需要 CFURL 的方法,您可以简单地使用 NSURL,这要归功于免费桥接。因此,要创建 NSURL,您只需执行以下操作:

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

  NSURL *soundURL = [NSURL fileURLWithPath:soundFilePath];

一般来说,如果您发现自己使用 CF 对象,您可能做错了什么。

于 2009-07-24T17:48:09.687 回答
0

我不确定这是否会消除您的异常,但是有一种更简单的方法可以将 an 转换NSStringchar. 以下是我将如何编写此方法:

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

    ...
}

或者,由于CFURL是“免费桥接” NSURL,您可以简单地执行以下操作:

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

    ...
}
于 2009-07-24T14:06:29.880 回答