Как читать заголовки из CAF-файла, используя core-audio/audiotoolbox

Я пытаюсь прочитать CAF-файл в OSX, используя расширенный API AudioToolbox.

открытие файла работает нормально, однако мне нужно получить доступ к блоку UUID, и я не могу найти никакой ссылки о том, как это сделать (или как получить доступ к любому фрагменту заголовка файла)

наверняка должен быть способ сделать это без разбора файла самостоятельно.

PS: я уже могу сделать это с помощью libsndfile, но я хочу найти способ сделать это только с компонентами, которые поставляются с OSX.

я уже пробовал звонить ExtAudioFileGetProperty() с ExtAudioFilePropertyID установите в 'uuid', но это не похоже на работу.

1 ответ

Решение

Оказалось, что хитрость заключается в том, чтобы не использовать API ExtAudio для доступа к низкоуровневой функциональности, такой как блок UUID. (если вам нужен доступ к файлу через API ExtAudio, можно создать ExtAudioHandle из AudioFileID.)

в конце я использовал что-то вроде этого:

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);
Другие вопросы по тегам