diff options
Diffstat (limited to 'tests/freealut/src/alutBufferData.c')
-rw-r--r-- | tests/freealut/src/alutBufferData.c | 136 |
1 files changed, 136 insertions, 0 deletions
diff --git a/tests/freealut/src/alutBufferData.c b/tests/freealut/src/alutBufferData.c new file mode 100644 index 00000000..c7ad9479 --- /dev/null +++ b/tests/freealut/src/alutBufferData.c @@ -0,0 +1,136 @@ +#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; +} |