All I wanted was to read a caf file and write it to another file, in the hopes that perhaps I can manipulate it such as combine multiple files into one, or trimming. So I found Apples's own iPhoneExtAudioFileConvertTest Sample, which looks very challenging but I figured once I take the pieces into my own project, then I can play with it, this proved to be rather cumbersome.
Now, after a few sleepless nights of digging for information and lots trial and errors runs; I believed I have managed to use the the iPhoneExtAudioFileConvertTest Sample in my own project. I thought I would post this to save a fellow coder some sleep.
Steps:
- Added the iPublicUtility folder and the ExtAudioFileConvert.cpp file from the iPhoneExtAudioFileConvertTest sample to my project.
 - Renamed the extension of the 3 new .cpp files to .mm (the .h files stay the same). This allows xcode to view the cpp files as objective c++ files.
- ExtAudioFileConvert.mm
 - iPublicUtility/CAStreamBasicDescription.mm
 - iPublicUtility/CAXException.mm
 
 - In my myViewController.m (UIViewController) class that plans to call the 
DoConvertFile(sourceURL, destinationURL, outputFormat, sampleRate);method, I added one line to make the DoConvertFile method visibleextern OSStatus DoConvertFile(CFURLRef sourceURL, CFURLRef destinationURL, OSType outputFormat, Float64 outputSampleRate); - Also renamed myViewController.m to myViewController.mm because it's using a .cpp file to make the convertFile method call
 - In my project setting under Targets / Build Settings, I searched for the key "Header Search Paths" and added the following for it's value /Developer/Extras/CoreAudio/PublicUtility/ $(inherited) without this line the compiler would give me over 30 errors, such as 'DebugPrintfFile' was not declared in this scope*
 - I noticed that the sample also has code in the app delegate 
- so I copied the code of the 2 methods directly from the sample's appDelegate into my own appDelegate, namly
static void interruptionListener(void *inClientData, UInt32 inInterruption)static void propertyListener(void *inClientData, AudioSessionPropertyID inID, UInt32 inDataSize, const void *inData)
 - and added the the following 4 lines right after the original 
#importstatement- #import "CAXException.h"
 extern void ThreadStateInitalize();extern void ThreadStateBeginInterruption();extern void ThreadStateEndInterruption();
 - of course also added the code from the samples 
applicationDidFinishLaunchinginto mydidFinishLaunchingWithOptions - and once again renamed my appDelegate.m to appDelegate.mm
 
 - so I copied the code of the 2 methods directly from the sample's appDelegate into my own appDelegate, namly
 
Now when I compile I get no errors and runtime only works if I comment out the assert in ExtAudioFileConvert.mm
    // in this sample we should never be on the main thread here
    assert(![NSThread isMainThread]);
Also at startup I receive an error which is not causing any issues, but I'd prefer to remove it. Anyone ?
    Error: couldn't set audio category (-50)
which seems to be coming from this call in my 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");
Other than these warnings/errors, I can write/convert a caf file :). I would appreciate any feedback.