For sound I use OpenAL, it’s free, cross-platform, I’ve managed to get it working on iPhone, Windows and Mac.
Setting up OpenAL to play a sound is pretty straight forward, a bit like OpenGL.
First you need to create a context.
ALCcontext *context;
ALCdevice *device;
device = alcOpenDevice(NULL, ALC_DEFAULT_DEVICE_SPECIFIER);
if (device == NULL)
{
// Handle Exception
}
//Create a context
context=alcCreateContext(device,NULL);
//Set active context
alcMakeContextCurrent(context);
// Clear Error Code
alGetError();
Now for the second part, loading a wav file. You have to open a file, fill buffers with data and then attach it to a source.
char* alBuffer; //data for the buffer
ALenum alFormatBuffer; //buffer format
ALsizei alFreqBuffer; //frequency
long alBufferLen; //bit depth
ALboolean alLoop; //loop
unsigned int alSource; //source
unsigned int alSampleSet;
//load the wave file
alutLoadWAVFile("my_music.wav",&alFormatBuffer, (void **) &alBuffer,(unsigned int *)&alBufferLen, &alFreqBuffer, &alLoop);
//create a source
alGenSources(1, &alSource);
//create buffer
alGenBuffers(1, &alSampleSet);
//put the data into our sampleset buffer
alBufferData(alSampleSet, alFormatBuffer, alBuffer, alBufferLen, alFreqBuffer);
//assign the buffer to this source
alSourcei(alSource, AL_BUFFER, alSampleSet);
//release the data
alutUnloadWAV(alFormatBuffer, alBuffer, alBufferLen, alFreqBuffer);
Once the sound is loaded we can play it. To do this we use alSourcePlay.
alSourcei(alSource,AL_LOOPING,AL_TRUE);
//play
alSourcePlay(alSource);
//to stop
alSourceStop(alSource);
Once you’ve finished don’t forget to clean memory and release OpenAL context and device
alDeleteSources(1,&alSource);
//delete our buffer
alDeleteBuffers(1,&alSampleSet);
context=alcGetCurrentContext();
//Get device for active context
device=alcGetContextsDevice(context);
//Disable context
alcMakeContextCurrent(NULL);
//Release context(s)
alcDestroyContext(context);
//Close device
alcCloseDevice(device);
Easy right? I’ve extended this to play the open format OGG for my engine, which is pretty cool. Since you can keep putting data to buffers you can stream a whole OGG or WAV file without loading everything into memory.