ios - Как использовать образец ExtAudioFileConvert в новом проекте - PullRequest
4 голосов
/ 05 июля 2011

Все, что я хотел - это прочитать файл caf и записать его в другой файл, в надежде, что, возможно, я смогу манипулировать им, например, объединить несколько файлов в один или обрезать.Так что я нашел собственный iPhoneExtAudioFileConvertTest от Apple, который выглядит очень сложным, но я подумал, как только я возьму кусочки в свой собственный проект, тогда я смогу поиграть с ним, это оказалось довольно громоздким.* Теперь, после нескольких бессонных ночей копания информации и множества проб и ошибок запускается;Я полагал, что мне удалось использовать iPhoneExtAudioFileConvertTest Образец в моем собственном проекте.Я думал, что выложу это, чтобы спасти своего коллегу-кодера.

Шаги:

  • Добавлена ​​папка iPublicUtility и ExtAudioFileConvert.cpp *Файл 1015 * из образца iPhoneExtAudioFileConvertTest для моего проекта.
  • Переименовано расширение 3 новых файлов .cpp в .mm (файлы .h остаются прежними).Это позволяет xcode просматривать файлы cpp как объективные файлы c ++.
    • ExtAudioFileConvert.mm
    • iPublicUtility / CAStreamBasicDescription.mm
    • iPublicUtility / CAXException.mm
  • В моем myViewController.m (UIViewController) класс, который планирует вызывать метод
    DoConvertFile(sourceURL, destinationURL, outputFormat, sampleRate);, я добавил одну строку, чтобы сделать метод DoConvertFile видимым
    extern OSStatus DoConvertFile(CFURLRef sourceURL, CFURLRef destinationURL, OSType outputFormat, Float64 outputSampleRate);
  • Также переименовал myViewController.m в myViewController.mm , поскольку он использует файл .cpp для вызова метода convertFile
  • В настройках моего проекта в разделе «Задачи / Настройки сборки» я искал ключ «Пути поиска по заголовкам» и добавилследуя его значению / Developer / Extras / CoreAudio / PublicUtility / $ (унаследовано) без этой строки, компилятор выдаст мне более 30 ошибок, например, 'DebugPrintfFile ' не был объявлен вэта область *
  • Я заметил, что в образце также есть код в делегате приложения
    • , поэтому я скопировал код 2 методов непосредственно из приложения appDelegate в мой пример.собственное appDelegate, namly
      • static void interruptionListener(void *inClientData, UInt32 inInterruption)
      • static void propertyListener(void *inClientData, AudioSessionPropertyID inID, UInt32 inDataSize, const void *inData)
    • и добавлены следующие 4 строки сразу после исходного оператора #import
      • # import "CAXException.h"
      • extern void ThreadStateInitalize();
      • extern void ThreadStateBeginInterruption();
      • extern void ThreadStateEndInterruption();
    • конечно же добавил код из примеров applicationDidFinishLaunching в мой didFinishLaunchingWithOptions
    • и еще раз переименовал мой appDelegate.m в appDelegate.mm

Теперь, когда я компилирую, я не получаю ошибок, и время выполнения работает, только если я закомментирую assert в ExtAudioFileConvert.mm

    // in this sample we should never be on the main thread here
    assert(![NSThread isMainThread]);

Также при запуске я получаю ошибку, которая не вызывает никаких проблем, ноЯ предпочел бы удалить это.Кто-нибудь?

    Error: couldn't set audio category (-50)

, который, кажется, приходит от этого звонка в моем appDelegate

    // our default category -- we change this for conversion and playback appropriately
    UInt32 audioCategory = kAudioSessionCategory_SoloAmbientSound;
    XThrowIfError(AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(audioCategory), &audioCategory), "couldn't set audio category");

Кроме этих предупреждений / ошибок, я могу написать / преобразовать файл caf:).Буду признателен за любые отзывы.

...