#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; }