Permalink
Switch branches/tags
Nothing to show
Find file
Fetching contributors…
Cannot retrieve contributors at this time
148 lines (129 sloc) 3.19 KB
#include "alutInternal.h"
struct BufferData_struct
{
ALvoid *data;
size_t length;
ALint numChannels;
ALint bitsPerSample;
ALfloat sampleFrequency;
};
BufferData *
_alutBufferDataConstruct (ALvoid *data, size_t length, ALint numChannels,
ALint bitsPerSample, ALfloat sampleFrequency)
{
BufferData *bufferData = (BufferData *) _alutMalloc (sizeof (BufferData));
if (bufferData == NULL)
{
return NULL;
}
bufferData->data = data;
bufferData->length = length;
bufferData->numChannels = numChannels;
bufferData->bitsPerSample = bitsPerSample;
bufferData->sampleFrequency = sampleFrequency;
return bufferData;
}
ALboolean
_alutBufferDataDestroy (BufferData *bufferData)
{
if (bufferData->data != NULL)
{
free (bufferData->data);
}
free (bufferData);
return AL_TRUE;
}
ALvoid *
_alutBufferDataGetData (const BufferData *bufferData)
{
return bufferData->data;
}
void
_alutBufferDataDetachData (BufferData *bufferData)
{
bufferData->data = NULL;
}
size_t
_alutBufferDataGetLength (const BufferData *bufferData)
{
return bufferData->length;
}
static ALint
getNumChannels (const BufferData *bufferData)
{
return bufferData->numChannels;
}
static ALint
getBitsPerSample (const BufferData *bufferData)
{
return bufferData->bitsPerSample;
}
ALfloat
_alutBufferDataGetSampleFrequency (const BufferData *bufferData)
{
return bufferData->sampleFrequency;
}
/****************************************************************************
* The utility functions below do not know the internal BufferData
* representation.
****************************************************************************/
ALboolean
_alutGetFormat (const BufferData *bufferData, ALenum *format)
{
if (!_alutFormatConstruct
(getNumChannels (bufferData), getBitsPerSample (bufferData), format))
{
_alutSetError (ALUT_ERROR_UNSUPPORTED_FILE_SUBTYPE);
return AL_FALSE;
}
return AL_TRUE;
}
static ALuint
generateBuffer (void)
{
ALuint buffer;
alGenBuffers (1, &buffer);
if (alGetError () != AL_NO_ERROR)
{
_alutSetError (ALUT_ERROR_GEN_BUFFERS);
return AL_NONE;
}
return buffer;
}
static ALboolean
passBufferData (BufferData *bufferData, ALuint bid)
{
ALenum format;
size_t size;
ALfloat frequency;
if (!_alutGetFormat (bufferData, &format))
{
return AL_FALSE;
}
/* GCC is a bit picky about casting function calls, so we do it in two
steps... */
size = _alutBufferDataGetLength (bufferData);
frequency = _alutBufferDataGetSampleFrequency (bufferData);
alBufferData (bid, format, _alutBufferDataGetData (bufferData),
(ALsizei) size, (ALsizei) frequency);
if (alGetError () != AL_NO_ERROR)
{
_alutSetError (ALUT_ERROR_BUFFER_DATA);
return AL_FALSE;
}
return AL_TRUE;
}
ALuint
_alutPassBufferData (BufferData *bufferData)
{
ALuint buffer = generateBuffer ();
if (buffer == AL_NONE)
{
return AL_NONE;
}
if (!passBufferData (bufferData, buffer))
{
return AL_NONE;
}
return buffer;
}