Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: downloads/freealut-1.1.0/src/alutBufferData.c @ 14

Last change on this file since 14 was 14, checked in by landauf, 16 years ago

added freealut

File size: 3.0 KB
Line 
1#include "alutInternal.h"
2
3struct BufferData_struct
4{
5  ALvoid *data;
6  size_t length;
7  ALint numChannels;
8  ALint bitsPerSample;
9  ALfloat sampleFrequency;
10};
11
12BufferData *
13_alutBufferDataConstruct (ALvoid *data, size_t length, ALint numChannels,
14                          ALint bitsPerSample, ALfloat sampleFrequency)
15{
16  BufferData *bufferData = (BufferData *) _alutMalloc (sizeof (BufferData));
17  if (bufferData == NULL)
18    {
19      return NULL;
20    }
21
22  bufferData->data = data;
23  bufferData->length = length;
24  bufferData->numChannels = numChannels;
25  bufferData->bitsPerSample = bitsPerSample;
26  bufferData->sampleFrequency = sampleFrequency;
27
28  return bufferData;
29}
30
31ALboolean
32_alutBufferDataDestroy (BufferData *bufferData)
33{
34  if (bufferData->data != NULL)
35    {
36      free (bufferData->data);
37    }
38  free (bufferData);
39  return AL_TRUE;
40}
41
42ALvoid *
43_alutBufferDataGetData (const BufferData *bufferData)
44{
45  return bufferData->data;
46}
47
48void
49_alutBufferDataDetachData (BufferData *bufferData)
50{
51  bufferData->data = NULL;
52}
53
54size_t
55_alutBufferDataGetLength (const BufferData *bufferData)
56{
57  return bufferData->length;
58}
59
60static ALint
61getNumChannels (const BufferData *bufferData)
62{
63  return bufferData->numChannels;
64}
65
66static ALint
67getBitsPerSample (const BufferData *bufferData)
68{
69  return bufferData->bitsPerSample;
70}
71
72ALfloat
73_alutBufferDataGetSampleFrequency (const BufferData *bufferData)
74{
75  return bufferData->sampleFrequency;
76}
77
78/****************************************************************************
79 * The utility functions below do not know the internal BufferData
80 * representation.
81 ****************************************************************************/
82
83ALboolean
84_alutGetFormat (const BufferData *bufferData, ALenum *format)
85{
86  if (!_alutFormatConstruct
87      (getNumChannels (bufferData), getBitsPerSample (bufferData), format))
88    {
89      _alutSetError (ALUT_ERROR_UNSUPPORTED_FILE_SUBTYPE);
90      return AL_FALSE;
91    }
92  return AL_TRUE;
93}
94
95static ALuint
96generateBuffer (void)
97{
98  ALuint buffer;
99  alGenBuffers (1, &buffer);
100  if (alGetError () != AL_NO_ERROR)
101    {
102      _alutSetError (ALUT_ERROR_GEN_BUFFERS);
103      return AL_NONE;
104    }
105  return buffer;
106}
107
108static ALboolean
109passBufferData (BufferData *bufferData, ALuint bid)
110{
111  ALenum format;
112  size_t size;
113  ALfloat frequency;
114  if (!_alutGetFormat (bufferData, &format))
115    {
116      return AL_FALSE;
117    }
118  /* GCC is a bit picky about casting function calls, so we do it in two
119     steps... */
120  size = _alutBufferDataGetLength (bufferData);
121  frequency = _alutBufferDataGetSampleFrequency (bufferData);
122  alBufferData (bid, format, _alutBufferDataGetData (bufferData),
123                (ALsizei) size, (ALsizei) frequency);
124  if (alGetError () != AL_NO_ERROR)
125    {
126      _alutSetError (ALUT_ERROR_BUFFER_DATA);
127      return AL_FALSE;
128    }
129  return AL_TRUE;
130}
131
132ALuint
133_alutPassBufferData (BufferData *bufferData)
134{
135  ALuint buffer = generateBuffer ();
136  if (buffer == AL_NONE)
137    {
138      return AL_NONE;
139    }
140
141  if (!passBufferData (bufferData, buffer))
142    {
143      return AL_NONE;
144    }
145
146  return buffer;
147}
Note: See TracBrowser for help on using the repository browser.