ios - Как использовать образец ExtAudioFileConvert в новом проекте

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

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

шаги:

  • В мой проект добавлена ​​папка iPublicUtility и файл ExtAudioFileConvert.cpp из примера 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
  • В настройках моего проекта в Targets / Build Settings я искал ключ "Пути поиска по заголовку" и добавил следующее для его значения /Developer/Extras/CoreAudio/PublicUtility/ $(наследуется) без этой строки, которую компилятор дал бы мне более 30 ошибки, такие как DebugPrintfFile, не были объявлены в этой области *
  • Я заметил, что образец также имеет код в делегате приложения
    • поэтому я скопировал код двух методов прямо из примера 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:). Буду признателен за любые отзывы.

0 ответов

Другие вопросы по тегам