Tizen 2.1 base
[external/freealut.git] / src / alutBufferData.c
1 #include "alutInternal.h"
2
3 struct BufferData_struct
4 {
5   ALvoid *data;
6   size_t length;
7   ALint numChannels;
8   ALint bitsPerSample;
9   ALfloat sampleFrequency;
10 };
11
12 BufferData *
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
31 ALboolean
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
42 ALvoid *
43 _alutBufferDataGetData (const BufferData *bufferData)
44 {
45   return bufferData->data;
46 }
47
48 void
49 _alutBufferDataDetachData (BufferData *bufferData)
50 {
51   bufferData->data = NULL;
52 }
53
54 size_t
55 _alutBufferDataGetLength (const BufferData *bufferData)
56 {
57   return bufferData->length;
58 }
59
60 static ALint
61 getNumChannels (const BufferData *bufferData)
62 {
63   return bufferData->numChannels;
64 }
65
66 static ALint
67 getBitsPerSample (const BufferData *bufferData)
68 {
69   return bufferData->bitsPerSample;
70 }
71
72 ALfloat
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
83 ALboolean
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
95 static ALuint
96 generateBuffer (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
108 static ALboolean
109 passBufferData (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
132 ALuint
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 }