Playing sound using OpenAL

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.

Back to Top