Reputation: 222
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?
Upvotes: 2
Views: 847
Reputation: 104698
in this case, you should use ExtAudioFileRead
after configuring the ExtAudioFile
's AudioConvertor
'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.
ExtAudioFile
is in AudioToolbox.framework on OS X and iOS (basically a layer above AudioFile
with more high level capabilities), and you can create one by wrapping an AudioFile
.
AudioConvertor
could also be used without ExtAudioFile
.
in some cases, you can just use the OS X afonvert
utility 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:
for (each sample) {
reverse order of bytes in sample
}
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 OSSwap
routines, but these don't handle all sample formats -- they focus on builtin types.
Upvotes: 1