Over a million developers have joined DZone.
{{announcement.body}}
{{announcement.title}}

Playing sound using OpenAL

DZone's Guide to

Playing sound using OpenAL

· Mobile Zone
Free Resource

Download this comprehensive Mobile Testing Reference Guide to help prioritize which mobile devices and OSs to test against, brought to you in partnership with Sauce Labs.

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.

 

Analysts agree that a mix of emulators/simulators and real devices are necessary to optimize your mobile app testing - learn more in this white paper, brought to you in partnership with Sauce Labs.

Topics:

Published at DZone with permission of David Amador, DZone MVB. See the original article here.

Opinions expressed by DZone contributors are their own.

{{ parent.title || parent.header.title}}

{{ parent.tldr }}

{{ parent.urlSource.name }}