Just joined this list and can't find a way to search archives, so I apologize if this is a common question.
I'm working through some example code in Core Audio and I'm getting kAudioFormatUnsupportedDataFormatError when I try to write an AIFF file or MP3 file. Everything works if I use CAF. Am I missing a framework? Code below.
//
// main.m
// CAToneFileGenerator
#import <Foundation/Foundation.h>
#import <AudioToolbox/AudioToolbox.h>
#define SAMPLE_RATE 44100
// 1
#define DURATION 5.0
// 2
#define FILENAME_FORMAT @"%0.3f-square.aif"
// 3
int main (int argc, const char * argv[])
{
@autoreleasepool {
if (argc < 2) {
printf ("Usage: CAToneFileGenerator n\n(where n is tone in Hz)");
return -1;
}
double hz = atof(argv[1]);
assert (hz > 0);
NSLog (@"generating %f hz tone", hz);
NSString *fileName = [NSString stringWithFormat:FILENAME_FORMAT, hz];
NSString *filePath = [[[NSFileManager defaultManager]
currentDirectoryPath]
stringByAppendingPathComponent: fileName];
NSURL *fileURL = [NSURL fileURLWithPath: filePath];
AudioStreamBasicDescription asbd;
memset(&asbd, 0, sizeof(asbd));
asbd.mSampleRate = SAMPLE_RATE;
asbd.mFormatID = kAudioFormatLinearPCM;
asbd.mFormatFlags = kAudioFormatFlagIsBigEndian;
asbd.mBitsPerChannel = 16;
asbd.mChannelsPerFrame = 1;
asbd.mFramesPerPacket = 1;
asbd.mBytesPerFrame = 2;
asbd.mBytesPerPacket = 2;
AudioFileID audioFile;
OSStatus audioErr = noErr;
// ## FAILS HERE ##
audioErr = AudioFileCreateWithURL((CFURLRef)fileURL, kAudioFileAIFFType, &asbd, kAudioFileFlags_EraseFile, &audioFile);
// ## FAILS HERE ##
assert(audioErr == noErr);
// Start writing samples
long maxSampleCount = SAMPLE_RATE * DURATION;
long sampleCount = 0;
UInt32 bytesToWrite = 2;
double wavelengthInSamples = SAMPLE_RATE / hz;
while (sampleCount < maxSampleCount) {
for (int i=0; i<wavelengthInSamples; i++) {
SInt16 sample;
if (i < wavelengthInSamples/2) {
sample = CFSwapInt16HostToBig(SHRT_MAX);
} else {
sample = CFSwapInt16HostToBig(SHRT_MIN);
}
audioErr = AudioFileWriteBytes(audioFile, false, sampleCount*2, &bytesToWrite, &sample);
assert(audioErr == noErr);
sampleCount++;
}
}
audioErr = AudioFileClose(audioFile);