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
- поэтому я скопировал код двух методов прямо из примера appDelegate в свой собственный appDelegate, namly
Теперь, когда я компилирую, я не получаю ошибок, и время выполнения работает, только если я закомментирую 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:). Буду признателен за любые отзывы.