• Main Page
  • Namespaces
  • Classes
  • Files
  • File List
  • File Members

src/audio/src/util/alutBufferData.cpp

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  * The utility functions below do not know the internal BufferData
00080  * representation.
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   /* GCC is a bit picky about casting function calls, so we do it in two
00119      steps... */
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 }

Generated on Fri Jun 18 2010 17:48:39 for Cannonball by  doxygen 1.7.0