Go to the documentation of this file.00001 #include "alutInternal.h"
00002
00003 struct BufferData_struct
00004 {
00005 ALvoid *data;
00006 size_t length;
00007 ALint numChannels;
00008 ALint bitsPerSample;
00009 ALfloat sampleFrequency;
00010 };
00011
00012 BufferData *
00013 _alutBufferDataConstruct (ALvoid *data, size_t length, ALint numChannels,
00014 ALint bitsPerSample, ALfloat sampleFrequency)
00015 {
00016 BufferData *bufferData = (BufferData *) _alutMalloc (sizeof (BufferData));
00017 if (bufferData == NULL)
00018 {
00019 return NULL;
00020 }
00021
00022 bufferData->data = data;
00023 bufferData->length = length;
00024 bufferData->numChannels = numChannels;
00025 bufferData->bitsPerSample = bitsPerSample;
00026 bufferData->sampleFrequency = sampleFrequency;
00027
00028 return bufferData;
00029 }
00030
00031 ALboolean
00032 _alutBufferDataDestroy (BufferData *bufferData)
00033 {
00034 if (bufferData->data != NULL)
00035 {
00036 free (bufferData->data);
00037 }
00038 free (bufferData);
00039 return AL_TRUE;
00040 }
00041
00042 ALvoid *
00043 _alutBufferDataGetData (const BufferData *bufferData)
00044 {
00045 return bufferData->data;
00046 }
00047
00048 void
00049 _alutBufferDataDetachData (BufferData *bufferData)
00050 {
00051 bufferData->data = NULL;
00052 }
00053
00054 size_t
00055 _alutBufferDataGetLength (const BufferData *bufferData)
00056 {
00057 return bufferData->length;
00058 }
00059
00060 static ALint
00061 getNumChannels (const BufferData *bufferData)
00062 {
00063 return bufferData->numChannels;
00064 }
00065
00066 static ALint
00067 getBitsPerSample (const BufferData *bufferData)
00068 {
00069 return bufferData->bitsPerSample;
00070 }
00071
00072 ALfloat
00073 _alutBufferDataGetSampleFrequency (const BufferData *bufferData)
00074 {
00075 return bufferData->sampleFrequency;
00076 }
00077
00078
00079
00080
00081
00082
00083 ALboolean
00084 _alutGetFormat (const BufferData *bufferData, ALenum *format)
00085 {
00086 if (!_alutFormatConstruct
00087 (getNumChannels (bufferData), getBitsPerSample (bufferData), format))
00088 {
00089 _alutSetError (ALUT_ERROR_UNSUPPORTED_FILE_SUBTYPE);
00090 return AL_FALSE;
00091 }
00092 return AL_TRUE;
00093 }
00094
00095 static ALuint
00096 generateBuffer (void)
00097 {
00098 ALuint buffer;
00099 alGenBuffers (1, &buffer);
00100 if (alGetError () != AL_NO_ERROR)
00101 {
00102 _alutSetError (ALUT_ERROR_GEN_BUFFERS);
00103 return AL_NONE;
00104 }
00105 return buffer;
00106 }
00107
00108 static ALboolean
00109 passBufferData (BufferData *bufferData, ALuint bid)
00110 {
00111 ALenum format;
00112 size_t size;
00113 ALfloat frequency;
00114 if (!_alutGetFormat (bufferData, &format))
00115 {
00116 return AL_FALSE;
00117 }
00118
00119
00120 size = _alutBufferDataGetLength (bufferData);
00121 frequency = _alutBufferDataGetSampleFrequency (bufferData);
00122 alBufferData (bid, format, _alutBufferDataGetData (bufferData),
00123 (ALsizei) size, (ALsizei) frequency);
00124 if (alGetError () != AL_NO_ERROR)
00125 {
00126 _alutSetError (ALUT_ERROR_BUFFER_DATA);
00127 return AL_FALSE;
00128 }
00129 return AL_TRUE;
00130 }
00131
00132 ALuint
00133 _alutPassBufferData (BufferData *bufferData)
00134 {
00135 ALuint buffer = generateBuffer ();
00136 if (buffer == AL_NONE)
00137 {
00138 return AL_NONE;
00139 }
00140
00141 if (!passBufferData (bufferData, buffer))
00142 {
00143 return AL_NONE;
00144 }
00145
00146 return buffer;
00147 }