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 | } |
---|