2012-06-18 4 views
0

AudioToolbox의 Extended Audio File API를 사용하여 OSX에서 CAF 파일을 읽으려고합니다. 파일을 여는core-audio/audiotoolbox를 사용하여 CAF 파일에서 헤더 덩어리를 읽는 방법

은, 그러나, 나는 UUID chunk에 액세스하는 미세 필요가 작동하고, 나는 그 작업을 수행하는 방법에 대한 참조를 찾을 수 없습니다 (또는 파일의 어떤 헤더 덩어리에 액세스하는 방법) 반드시

을 저 혼자서 파일을 파싱하지 않고 이것을 할 수있는 방법이 있어야합니다.

추신 : 저는 이미 libsndfile에서이 작업을 수행 할 수 있지만 OSX와 함께 제공되는 구성 요소 만 사용하여이 작업을 수행 할 방법을 찾고 싶습니다.

나는 ExtAudioFilePropertyID이 'uuid'로 설정되어 있지만 ExtAudioFileGetProperty()을 호출하려고 시도했지만 이미 작동하지 않는 것 같습니다.

답변

1

트릭은 UAID 청크와 같은 하위 수준 기능에 액세스하기 위해 ExtAudio API를 사용하지 않는다는 것이 밝혀졌습니다. (당신이 ExtAudio API를 통해 파일에 액세스해야하는 경우, 그것은 AudioFileID에서 ExtAudioHandle을 만들 수 있습니다.) 내가 이런 걸 사용 결국

:

AudioFileID fileID; 
ExtAudioFileRef extFile; 

OSStatus err = AudioFileOpenURL((CFURLRef)inURL, kAudioFileReadPermission, 0, &fileID); 
if(noErr!=err)return; 
err = ExtAudioFileWrapAudioFileID (fileID, false, &extFile); // in case we *also* want to access the file via ExtAudio 
if(noErr!=err)return; 

for(index=0; ; index++) { 
    UInt32 size=0; 
    char*data=NULL; 

    OSStatus err = AudioFileGetUserDataSize (fileID,'uuid',index,&size); 
    if(noErr!=err)break; // check whether we were able to read the chunksize 
    if(0==size)continue; // check whether there is some payload in the uuid chunk 

    data=calloc(size, 1); 
    if(!data)continue; 
    err = AudioFileGetUserData (fileID, 'uuid', index, &size, data); 
    if(noErr!=err){free(data); break;} // check whether we were able to read the chunksize 
    /* ... */ 
    free(data); 
} 
ExtAudioFileDispose(extFile); 
AudioFileClose(fileID);