I am using OpenAL in the iOS app that I’m working on and our client gave us a bunch of audio files that are all in big-endian format. My problem is that OpenAL only plays little-endian formats.
So I figure all I need to do is find the audio data, and reverse it, correct?
My code for extracting the audio data (taken from the OpenAL tutorial):
-(void)addSound:(NSString*)theSound
{
// get the full path of the file
NSString* fileName = [[NSBundle mainBundle] pathForResource:theSound ofType:@"caf"];
// first, open the file
NSLog(@"fileNAme is ===== %@", fileName);
AudioFileID fileID = [self openAudioFile:fileName];
// find out how big the actual audio data is
UInt32 fileSize = [self audioFileSize:fileID];
// this is where the audio data will live for the moment
unsigned char * outData = malloc(fileSize);
// this where we actually get the bytes from the file and put them
// into the data buffer
OSStatus result = noErr;
result = AudioFileReadBytes(fileID, false, 0, &fileSize, outData);
NSLog(@"OUT DATA IS == %d", outData);
AudioFileClose(fileID); //close the file
if (result != 0) NSLog(@"cannot load effect: %@",fileName);
NSUInteger bufferID;
// grab a buffer ID from openAL
alGenBuffers(1, &bufferID);
// jam the audio data into the new buffer
alBufferData(bufferID,AL_FORMAT_STEREO16,outData,fileSize,44100);
// save the buffer so I can release it later
[bufferStorageArray addObject:[NSNumber numberWithUnsignedInteger:bufferID]];
NSUInteger sourceID;
// grab a source ID from openAL
alGenSources(1, &sourceID);
// attach the buffer to the source
alSourcei(sourceID, AL_BUFFER, bufferID);
// set some basic source prefs
alSourcef(sourceID, AL_PITCH, 1.0f);
alSourcef(sourceID, AL_GAIN, 1.0f);
//alSourcei(sourceID, AL_LOOPING, AL_TRUE);
// store this for future use
[soundDictionary setObject:[NSNumber numberWithUnsignedInt:sourceID] forKey:theSound];
// clean up the buffer
if (outData)
{
free(outData);
outData = NULL;
}
}
I figure unsigned char * outdata;
is what I need to reverse (after the audio file data is loaded into it, of course), but I have no idea how to do so. Can anyone help me out with this please?
in this case, you should use
ExtAudioFileReadafter configuring theExtAudioFile‘sAudioConvertor‘s format. it will save you a lot of time. you might swap yourself if you know all your input files have the same sample format.ExtAudioFileis in AudioToolbox.framework on OS X and iOS (basically a layer aboveAudioFilewith more high level capabilities), and you can create one by wrapping anAudioFile.AudioConvertorcould also be used withoutExtAudioFile.in some cases, you can just use the OS X
afonvertutility to swap them to LE, and be done with it without adding (unnecessary) programming challenges.writing your own endian-swapping routines for arrays isn’t hard – it’s just time consuming, tedious, and you typically need to make sure it’s fast and capable of supporting unnaturally aligned sample data. this involves:
W’rkncacnter furnished this link: Convert big endian to little endian when reading from a binary file
you can use that approach it if is naturally aligned. and you would need variants for each size and sample description you would see on input. the OS also offers
OSSwaproutines, but these don’t handle all sample formats — they focus on builtin types.