aboutsummaryrefslogtreecommitdiff
path: root/tests/freealut/src/alutBufferData.c
diff options
context:
space:
mode:
Diffstat (limited to 'tests/freealut/src/alutBufferData.c')
-rw-r--r--tests/freealut/src/alutBufferData.c136
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;
+}