2009-07-24 2 views
4

iPhone에서 리소스 경로를 얻어야합니다. CFURLCreateFromFileSystemRepresentation에 관해서는,이 문제를 어떻게 해결 해야할지 모르겠습니다. 이 오류가 발생하는 이유는 무엇입니까? 모든 솔루션이나 해결 방법을 높이 평가 될 것입니다. 미리 감사드립니다.iPhone에서 리소스에 대한 파일 시스템 경로를 얻으려면 어떻게해야합니까?

iPhone에서 AudioQueue를 사용하여 오디오를 재생하기 위해 다음 예제를 살펴 보았습니다. SpeakHere, AudioQueueTools (SimpleSDK 디렉토리에서) 및 AudioQueueTest. 나는 퍼즐을 맞추려고 노력했다. 바로 지금, 나는 이것에 붙어있다. 위의 sndFile에서 예외가 발생하여 프로그램이 충돌했습니다.

내 iPhone 게임에서 모든 사운드를 재생하기 위해 AVAudioPlayer를 사용하고 있습니다. 실제 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"); 
     } 
} 
+0

무엇을 성취하려고합니다. 이 실제 문제를 어떻게 해결할 수있는 것과는 대조적으로 프레임 워크 방법을 사용하는 방법을 묻는 질문을 좋아하지 않습니다. 중복 된 줄임표는 무엇입니까? –

+0

고정 질문 조금 –

+0

좋습니다. 죄송합니다. 나는 약간 피곤했다. 어쨌든, 나는 AudioQueue에 대한 모든 예제를 따르려고 노력하고 있으며 또한 이것을 위해 Apple 문서를 읽었습니다. 필자는 경험이별로 없기 때문에 CFURLRef를 올바르게 처리하는 방법을 알지 못합니다. 모든 예제와 문서에서 알 수 있듯이이 CFURLRef를 AudioFileOpenURL 메서드의 인수로 사용할 수 있도록 CFURLRef를 가져 오기 위해 CFURLCreateFromFileSystemRepresentation을 사용해야합니다. 그러나 나는 "CAXException '인스턴스를 던진 후에 호출을 종료합니다. 나는이 오류를 다루는 방법을 모른다. – Karl

답변

11

왜 당신이 CFURL 필요합니까?

CFURL을 필요로하는 다른 방법을 사용하는 경우에는 무료 전화 브리지 덕분에 NSURL을 사용할 수 있습니다. 따라서 NSURL을 만들려면 다음을 수행하십시오.

일반적으로 CF 개체를 사용하고 있다면 아마도 잘못된 것입니다.

+0

CF는 무엇을 의미합니까? 나는 묻기에는 어리석은 짓을하지만 너무 많은 가능성이있다. – Sneakyness

+0

코어 파운데이션에서 NS 호출은 이러한 낮은 레벨 호출의 최상위를 기반으로합니다. 일반적으로 CF 메소드보다 NS 메소드를 사용하는 더 명확하고 쉬운 방법이 있습니다. –

+0

사실이 아닙니다. "일반적으로 CF 오브젝트를 사용하면 스스로 잘못된 것을 시도 할 것입니다." 핵심 기초 수업은 다음과 같은 경우에 유용합니다. 1) 이미지 에서 exif/메타 데이터를 읽으려고합니다. 2) 이미지의 크기가 예이고 2048x2048과 같은 큰 이미지 (지도 타일)를로드하지 않으려면 기억. 3) 등등 .... –

0

는 잘 모르겠지만, char의 배열에 NSString을 변환하는 간단한 방법이있다. 여기에 나는이 방법에 다음과 같이 쓸 수있다 : CFURLNSURL와 "무료 브리지는"이기 때문에,

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

    ... 
} 

또는, 당신은 간단하게 수행 할 수 있습니다

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

    ... 
}