Mercurial > almixer_isolated
annotate ALmixer.c @ 40:2b0b55b7f8cf
Resync to get interruption changes.
author | Eric Wing <ewing@anscamobile.com> |
---|---|
date | Fri, 19 Aug 2011 12:36:50 -0700 |
parents | b346b6608eab |
children | 05e5dc4817a4 |
rev | line source |
---|---|
0 | 1 |
2 /* Here's an OpenAL implementation modeled after | |
3 * the SDL_SoundMixer which was built ontop of SDL_Mixer | |
4 * and SDL_Sound. | |
5 * Eric Wing | |
6 */ | |
7 | |
3
a929285e1db0
Added CMake build system.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
2
diff
changeset
|
8 #include "ALmixer.h" |
0 | 9 |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
10 #ifdef ALMIXER_COMPILE_WITHOUT_SDL |
22
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
11 #include "ALmixer_RWops.h" |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
12 #include "SoundDecoder.h" |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
13 #else |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
14 #include "SDL_sound.h" |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
15 #endif |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
16 |
22
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
17 #include "al.h" /* OpenAL */ |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
18 #include "alc.h" /* For creating OpenAL contexts */ |
0 | 19 |
1 | 20 #ifdef __APPLE__ |
21 /* For performance things like ALC_CONVERT_DATA_UPON_LOADING */ | |
22 /* Note: ALC_CONVERT_DATA_UPON_LOADING used to be in the alc.h header. | |
23 * But in the Tiger OpenAL 1.1 release (10.4.7 and Xcode 2.4), the | |
24 * define was moved to a new header file and renamed to | |
25 * ALC_MAC_OSX_CONVERT_DATA_UPON_LOADING. | |
26 */ | |
22
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
27 #include <TargetConditionals.h> |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
28 /* |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
29 #if (TARGET_OS_IPHONE == 1) || (TARGET_IPHONE_SIMULATOR == 1) |
22
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
30 #include <AudioToolbox/AudioToolbox.h> |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
31 #else |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
32 #include <OpenAL/MacOSX_OALExtensions.h> |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
33 #endif |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
34 */ |
1 | 35 #endif |
36 | |
0 | 37 /* For malloc, bsearch, qsort */ |
38 #include <stdlib.h> | |
39 | |
40 /* For memcpy */ | |
41 #include <string.h> | |
42 | |
43 #if 0 | |
44 /* for toupper */ | |
45 #include <ctype.h> | |
46 /* for strrchr */ | |
47 #include <string.h> | |
48 #endif | |
49 | |
50 /* Currently used in the output debug functions */ | |
51 #include <stdio.h> | |
52 | |
53 /* My own CircularQueue implementation needed | |
54 * to work around the Nvidia problem of the | |
55 * lack of a buffer query. | |
56 */ | |
57 #include "CircularQueue.h" | |
58 | |
13
54aa96ae8912
Added LinkedList class to project.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
12
diff
changeset
|
59 /* SDL_sound keeps a private linked list of sounds which get auto-deleted |
54aa96ae8912
Added LinkedList class to project.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
12
diff
changeset
|
60 * on Sound_Quit. This might actually create some leaks for me in certain |
54aa96ae8912
Added LinkedList class to project.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
12
diff
changeset
|
61 * usage patterns. To be safe, I should do the same. |
54aa96ae8912
Added LinkedList class to project.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
12
diff
changeset
|
62 */ |
54aa96ae8912
Added LinkedList class to project.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
12
diff
changeset
|
63 #include "LinkedList.h" |
54aa96ae8912
Added LinkedList class to project.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
12
diff
changeset
|
64 |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
65 #ifdef ENABLE_ALMIXER_THREADS |
0 | 66 /* Needed for the Mutex locks (and threads if enabled) */ |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
67 #ifdef ALMIXER_COMPILE_WITHOUT_SDL |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
68 #include "SimpleMutex.h" |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
69 #include "SimpleThread.h" |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
70 typedef struct SimpleMutex SDL_mutex; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
71 typedef struct SimpleThread SDL_Thread; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
72 #define SDL_CreateMutex SimpleMutex_CreateMutex |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
73 #define SDL_DestroyMutex SimpleMutex_DestroyMutex |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
74 #define SDL_LockMutex SimpleMutex_LockMutex |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
75 #define SDL_UnlockMutex SimpleMutex_UnlockMutex |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
76 #define SDL_CreateThread SimpleThread_CreateThread |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
77 #define SDL_WaitThread SimpleThread_WaitThread |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
78 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
79 #else |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
80 #include "SDL_thread.h" |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
81 #endif |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
82 #endif |
0 | 83 |
84 /* Because of the API differences between the Loki | |
85 * and Creative distributions, we need to know which | |
86 * version to use. The LOKI distribution currently | |
87 * has AL_BYTE_LOKI defined in altypes.h which | |
88 * I will use as a flag to identify the distributions. | |
89 * If this is ever removed, I might revert back to the | |
90 * if defined(_WIN32) or defined(__APPLE__) test to | |
91 * identify the Creative dist. | |
92 * I'm not sure if or how the Nvidia distribution differs | |
93 * from the Creative distribution. So for | |
94 * now, the Nvidia distribution gets lumped with the | |
95 * Creative dist and I hope nothing will break. | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
96 * My alGetString may be the most vulnerable. |
0 | 97 */ |
98 #ifdef AL_BYTE_LOKI | |
99 #define USING_LOKI_AL_DIST | |
100 /* This is a short term fix to get around the | |
101 * queuing problem with non-power of two buffer sizes. | |
102 * Hopefully the maintainers will fix this before | |
103 * we're ready to ship. | |
104 */ | |
105 #define ENABLE_LOKI_QUEUE_FIX_HACK | |
106 | |
107 /* The AL_GAIN in the Loki dist doesn't seem to do | |
108 * what I want/expect it to do. I want to use it for | |
109 * Fading, but it seems to work like an off/on switch. | |
110 * 0 = off, >0 = on. | |
111 * The AL_GAIN_LINEAR_LOKI switch seems to do what | |
112 * I want, so I'll redefine it here so the code is consistent | |
113 */ | |
114 /* Update: I've changed the source volume implementations | |
115 * to use AL_MAX_GAIN, so I don't think I need this block | |
116 * of code anymore. The listener uses AL_GAIN, but I | |
117 * hope they got this one right since there isn't a AL_MAX_GAIN | |
118 * for the listener. | |
119 */ | |
120 /* | |
121 #undef AL_GAIN | |
122 #include "alexttypes.h" | |
123 #define AL_GAIN AL_GAIN_LINEAR_LOKI | |
124 */ | |
125 #else | |
126 /* Might need to run other tests to figure out the DIST */ | |
127 /* I've been told that Nvidia doesn't define constants | |
128 * in the headers like Creative. Instead of | |
129 * #define AL_REFERENCE_DISTANCE 0x1020, | |
130 * Nvidia prefers you query OpenAL for a value. | |
131 * int AL_REFERENCE_DISTANCE = alGetEnumValue(ALubyte*)"AL_REFERNECE_DISTANCE"); | |
132 * So I'm assuming this means the Nvidia lacks this value. | |
133 * If this is the case, | |
134 * I guess we can use it to identify the Nvidia dist | |
135 */ | |
136 #ifdef AL_REFERENCE_DISTANCE | |
137 #define USING_CREATIVE_AL_DIST | |
138 #else | |
139 #define USING_NVIDIA_AL_DIST | |
140 #endif | |
141 #endif | |
142 | |
143 #ifdef ENABLE_LOKI_QUEUE_FIX_HACK | |
144 /* Need memset to zero out data */ | |
145 #include <string.h> | |
146 #endif | |
147 | |
148 | |
149 /* Seek issues for predecoded samples: | |
150 * The problem is that OpenAL makes us copy an | |
151 * entire buffer if we want to use it. This | |
152 * means we potentially have two copies of the | |
153 * same data. For predecoded data, this can be a | |
154 * large amount of memory. However, for seek | |
155 * support, I need to be able to get access to | |
156 * the original data so I can set byte positions. | |
157 * The following flags let you disable seek support | |
158 * if you don't want the memory hit, keep everything, | |
159 * or let you try to minimize the memory wasted by | |
160 * fetching it from the OpenAL buffer if needed | |
161 * and making a copy of it. | |
162 * Update: I don't think I need this flag anymore. I've made the | |
163 * effects of this user customizable by the access_data flag on load. | |
164 * If set to true, then seek and data callbacks work, with the | |
165 * cost of more memory and possibly CPU for copying the data through | |
166 * the callbacks. If false, then the extra memory is freed, but | |
167 * you don't get the features. | |
168 */ | |
169 /* | |
170 #define DISABLE_PREDECODED_SEEK | |
171 */ | |
172 /* Problem: Even though alGetBufferi(., AL_DATA, .) | |
173 * is in the Creative Programmer's reference, | |
174 * it actually isn't in the dist. (Invalid enum | |
175 * in Creative, can't compile in Loki.) | |
176 * So we have to keep it disabled | |
177 */ | |
178 #define DISABLE_SEEK_MEMORY_OPTIMIZATION | |
179 | |
180 #ifndef DISABLE_SEEK_MEMORY_OPTIMIZATION | |
181 /* Needed for memcpy */ | |
182 #include <string.h> | |
183 #endif | |
184 | |
185 /* Old way of doing things: | |
186 #if defined(_WIN32) || defined(__APPLE__) | |
187 #define USING_CREATIVE_AL_DIST | |
188 #else | |
189 #define USING_LOKI_AL_DIST | |
190 #endif | |
191 */ | |
192 | |
193 /************ REMOVE ME (Don't need anymore) ********/ | |
194 #if 0 | |
195 /* Let's get fancy and see if triple buffering | |
196 * does anything good for us | |
197 * Must be 2 or more or things will probably break | |
198 */ | |
199 #define NUMBER_OF_QUEUE_BUFFERS 5 | |
200 /* This is the number of buffers that are queued up | |
201 * when play first starts up. This should be at least 1 | |
202 * and no more than NUMBER_OF_QUEUE_BUFFERS | |
203 */ | |
204 #define NUMBER_OF_START_UP_BUFFERS 2 | |
205 #endif | |
206 /************ END REMOVE ME (Don't need anymore) ********/ | |
207 | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
208 #ifdef ALMIXER_COMPILE_WITHOUT_SDL |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
209 #include "tErrorLib.h" |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
210 static TErrorPool* s_ALmixerErrorPool = NULL; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
211 #endif |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
212 |
31
ad4eb4330fb0
Added initialized check in Begin/End interruption.
Eric Wing <ewing@anscamobile.com>
parents:
30
diff
changeset
|
213 static ALboolean ALmixer_Initialized = AL_FALSE; |
0 | 214 /* This should be set correctly by Init */ |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
215 static ALuint ALmixer_Frequency_global = ALMIXER_DEFAULT_FREQUENCY; |
0 | 216 |
217 /* Will be initialized in Init */ | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
218 static ALint Number_of_Channels_global = 0; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
219 static ALint Number_of_Reserve_Channels_global = 0; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
220 static ALuint Is_Playing_global = 0; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
221 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
222 #ifdef ENABLE_ALMIXER_THREADS |
0 | 223 /* This is for a simple lock system. It is not meant to be good, |
224 * but just sufficient to minimize/avoid threading issues | |
225 */ | |
31
ad4eb4330fb0
Added initialized check in Begin/End interruption.
Eric Wing <ewing@anscamobile.com>
parents:
30
diff
changeset
|
226 static ALboolean g_StreamThreadEnabled = AL_FALSE; |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
227 static SDL_mutex* s_simpleLock; |
0 | 228 static SDL_Thread* Stream_Thread_global = NULL; |
26
884cce2515eb
Put LowerThreadPriority in ENABLE_ALMIXER_THREADS_BLOCK
Eric Wing <ewing . public |-at-| gmail . com>
parents:
25
diff
changeset
|
229 #endif /* ENABLE_ALMIXER_THREADS */ |
0 | 230 |
13
54aa96ae8912
Added LinkedList class to project.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
12
diff
changeset
|
231 static LinkedList* s_listOfALmixerData = NULL; |
54aa96ae8912
Added LinkedList class to project.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
12
diff
changeset
|
232 |
22
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
233 /* Special stuff for iOS interruption handling */ |
31
ad4eb4330fb0
Added initialized check in Begin/End interruption.
Eric Wing <ewing@anscamobile.com>
parents:
30
diff
changeset
|
234 ALboolean g_inInterruption = AL_FALSE; |
22
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
235 static ALCcontext* s_interruptionContext = NULL; |
13
54aa96ae8912
Added LinkedList class to project.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
12
diff
changeset
|
236 |
0 | 237 |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
238 #ifdef __APPLE__ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
239 static ALvoid Internal_alcMacOSXMixerOutputRate(const ALdouble sample_rate) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
240 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
241 static void (*alcMacOSXMixerOutputRateProcPtr)(const ALdouble) = NULL; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
242 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
243 if(NULL == alcMacOSXMixerOutputRateProcPtr) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
244 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
245 alcMacOSXMixerOutputRateProcPtr = alGetProcAddress((const ALCchar*) "alcMacOSXMixerOutputRate"); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
246 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
247 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
248 if(NULL != alcMacOSXMixerOutputRateProcPtr) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
249 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
250 alcMacOSXMixerOutputRateProcPtr(sample_rate); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
251 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
252 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
253 return; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
254 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
255 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
256 ALdouble Internal_alcMacOSXGetMixerOutputRate() |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
257 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
258 static ALdouble (*alcMacOSXGetMixerOutputRateProcPtr)(void) = NULL; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
259 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
260 if(NULL == alcMacOSXGetMixerOutputRateProcPtr) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
261 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
262 alcMacOSXGetMixerOutputRateProcPtr = alGetProcAddress((const ALCchar*) "alcMacOSXGetMixerOutputRate"); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
263 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
264 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
265 if(NULL != alcMacOSXGetMixerOutputRateProcPtr) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
266 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
267 return alcMacOSXGetMixerOutputRateProcPtr(); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
268 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
269 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
270 return 0.0; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
271 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
272 #endif |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
273 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
274 #ifdef ALMIXER_COMPILE_WITHOUT_SDL |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
275 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
276 #if defined(__APPLE__) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
277 #include <QuartzCore/QuartzCore.h> |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
278 #include <unistd.h> |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
279 static CFTimeInterval s_ticksBaseTime = 0.0; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
280 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
281 #elif defined(_WIN32) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
282 #define WIN32_LEAN_AND_MEAN |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
283 #include <windows.h> |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
284 #include <winbase.h> |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
285 LARGE_INTEGER s_hiResTicksPerSecond; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
286 double s_hiResSecondsPerTick; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
287 LARGE_INTEGER s_ticksBaseTime; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
288 #else |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
289 #include <unistd.h> |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
290 #include <time.h> |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
291 static struct timespec s_ticksBaseTime; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
292 #endif |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
293 static void ALmixer_InitTime() |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
294 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
295 #if defined(__APPLE__) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
296 s_ticksBaseTime = CACurrentMediaTime(); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
297 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
298 #elif defined(_WIN32) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
299 LARGE_INTEGER hi_res_ticks_per_second; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
300 if(TRUE == QueryPerformanceFrequency(&hi_res_ticks_per_second)) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
301 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
302 QueryPerformanceCounter(&s_ticksBaseTime); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
303 s_hiResSecondsPerTick = 1.0 / hi_res_ticks_per_second; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
304 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
305 else |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
306 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
307 ALMixer_SetError("Windows error: High resolution clock failed."); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
308 fprintf(stderr, "Windows error: High resolution clock failed. Audio will not work correctly.\n"); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
309 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
310 #else |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
311 /* clock_gettime is POSIX.1-2001 */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
312 clock_gettime(CLOCK_MONOTONIC, &s_ticksBaseTime); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
313 #endif |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
314 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
315 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
316 static ALuint ALmixer_GetTicks() |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
317 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
318 #if defined(__APPLE__) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
319 return (ALuint)((CACurrentMediaTime()-s_ticksBaseTime)*1000.0); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
320 #elif defined(_WIN32) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
321 LARGE_INTEGER current_time; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
322 QueryPerformanceCounter(¤t_time); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
323 return (ALuint)((current_time.QuadPart - s_ticksBaseTime.QuadPart) * 1000 * s_hiResSecondsPerTick); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
324 #else /* assuming POSIX */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
325 /* clock_gettime is POSIX.1-2001 */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
326 struct timespec current_time; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
327 clock_gettime(CLOCK_MONOTONIC, ¤t_time); |
12
bfe90b4f3d87
Bug fixes to FadeIn.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
10
diff
changeset
|
328 return (ALuint)((current_time.tv_sec - s_ticksBaseTime.tv_sec)*1000.0 + (current_time.tv_nsec - s_ticksBaseTime.tv_nsec) / 1000000); |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
329 #endif |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
330 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
331 static void ALmixer_Delay(ALuint milliseconds_delay) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
332 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
333 #if defined(_WIN32) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
334 Sleep(milliseconds_delay); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
335 #else |
40
2b0b55b7f8cf
Resync to get interruption changes.
Eric Wing <ewing@anscamobile.com>
parents:
37
diff
changeset
|
336 usleep(milliseconds_delay*1000); |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
337 #endif |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
338 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
339 #else |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
340 #include "SDL.h" /* For SDL_GetTicks(), SDL_Delay */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
341 #define ALmixer_GetTicks SDL_GetTicks |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
342 #define ALmixer_Delay SDL_Delay |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
343 #endif |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
344 |
24
e085cbc573cf
iOS optimization/bug/workaround.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
22
diff
changeset
|
345 /* On iOS, usleep() of small numbers (say less than 100, very pronounced from 0-50) |
e085cbc573cf
iOS optimization/bug/workaround.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
22
diff
changeset
|
346 * seems to be sucking up quite a bit of CPU time and causing performance problems. |
e085cbc573cf
iOS optimization/bug/workaround.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
22
diff
changeset
|
347 * Instead of increasing the sleep time, I started changing the thread priority. |
e085cbc573cf
iOS optimization/bug/workaround.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
22
diff
changeset
|
348 * This seemed to help the problem. |
e085cbc573cf
iOS optimization/bug/workaround.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
22
diff
changeset
|
349 * Experimentally, the default priority seems to be 31. According to the docs, |
e085cbc573cf
iOS optimization/bug/workaround.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
22
diff
changeset
|
350 * valid ranges are from 0 to 31. 6 was still giving me some hiccups so setting to |
e085cbc573cf
iOS optimization/bug/workaround.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
22
diff
changeset
|
351 * 0 (PTHREAD_MIN_PRIORITY) seems to be the best value so far. |
e085cbc573cf
iOS optimization/bug/workaround.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
22
diff
changeset
|
352 * Mac also reports 31 as the default. However, I have not noticed the same |
e085cbc573cf
iOS optimization/bug/workaround.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
22
diff
changeset
|
353 * performance problems and cannot get audio to show up as a significant percentage |
e085cbc573cf
iOS optimization/bug/workaround.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
22
diff
changeset
|
354 * of the CPU time in Shark/Instruments. |
e085cbc573cf
iOS optimization/bug/workaround.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
22
diff
changeset
|
355 */ |
26
884cce2515eb
Put LowerThreadPriority in ENABLE_ALMIXER_THREADS_BLOCK
Eric Wing <ewing . public |-at-| gmail . com>
parents:
25
diff
changeset
|
356 #ifdef ENABLE_ALMIXER_THREADS |
24
e085cbc573cf
iOS optimization/bug/workaround.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
22
diff
changeset
|
357 #if defined(__APPLE__) && !defined(ALMIXER_COMPILE_WITHOUT_SDL) && ( (TARGET_OS_IPHONE == 1) || (TARGET_IPHONE_SIMULATOR == 1) ) |
e085cbc573cf
iOS optimization/bug/workaround.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
22
diff
changeset
|
358 #include <pthread.h> |
e085cbc573cf
iOS optimization/bug/workaround.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
22
diff
changeset
|
359 #endif |
e085cbc573cf
iOS optimization/bug/workaround.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
22
diff
changeset
|
360 static void Internal_LowerThreadPriority(SDL_Thread* simple_thread) |
e085cbc573cf
iOS optimization/bug/workaround.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
22
diff
changeset
|
361 { |
e085cbc573cf
iOS optimization/bug/workaround.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
22
diff
changeset
|
362 /* Might open to other platforms as needed */ |
e085cbc573cf
iOS optimization/bug/workaround.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
22
diff
changeset
|
363 #if defined(__APPLE__) && ( (TARGET_OS_IPHONE == 1) || (TARGET_IPHONE_SIMULATOR == 1) ) |
e085cbc573cf
iOS optimization/bug/workaround.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
22
diff
changeset
|
364 #ifdef ALMIXER_COMPILE_WITHOUT_SDL |
e085cbc573cf
iOS optimization/bug/workaround.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
22
diff
changeset
|
365 SimpleThread_SetThreadPriority(Stream_Thread_global, 0); |
e085cbc573cf
iOS optimization/bug/workaround.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
22
diff
changeset
|
366 #else |
e085cbc573cf
iOS optimization/bug/workaround.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
22
diff
changeset
|
367 struct sched_param schedule_param; |
e085cbc573cf
iOS optimization/bug/workaround.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
22
diff
changeset
|
368 int sched_policy; |
e085cbc573cf
iOS optimization/bug/workaround.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
22
diff
changeset
|
369 int ret_val; |
e085cbc573cf
iOS optimization/bug/workaround.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
22
diff
changeset
|
370 schedule_param.sched_priority = 0; /* PTHREAD_MIN_PRIORITY, max=31 */ |
e085cbc573cf
iOS optimization/bug/workaround.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
22
diff
changeset
|
371 /* EVIL! This will break if the SDL_Thread structure layout changes. */ |
e085cbc573cf
iOS optimization/bug/workaround.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
22
diff
changeset
|
372 pthread_t* native_thread_ptr_hack = (pthread_t*)(((char*)(Stream_Thread_global))+sizeof(unsigned long)); |
e085cbc573cf
iOS optimization/bug/workaround.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
22
diff
changeset
|
373 ret_val = pthread_setschedparam(*native_thread_ptr_hack, SCHED_OTHER, &schedule_param); |
e085cbc573cf
iOS optimization/bug/workaround.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
22
diff
changeset
|
374 #endif |
e085cbc573cf
iOS optimization/bug/workaround.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
22
diff
changeset
|
375 #else |
e085cbc573cf
iOS optimization/bug/workaround.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
22
diff
changeset
|
376 /* No-Op */ |
e085cbc573cf
iOS optimization/bug/workaround.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
22
diff
changeset
|
377 #endif |
e085cbc573cf
iOS optimization/bug/workaround.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
22
diff
changeset
|
378 } |
26
884cce2515eb
Put LowerThreadPriority in ENABLE_ALMIXER_THREADS_BLOCK
Eric Wing <ewing . public |-at-| gmail . com>
parents:
25
diff
changeset
|
379 #endif /* ENABLE_ALMIXER_THREADS */ |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
380 |
0 | 381 /* If ENABLE_PARANOID_SIGNEDNESS_CHECK is used, |
382 * these values will be reset on Init() | |
383 * Consider these values Read-Only. | |
384 */ | |
385 | |
386 #define ALMIXER_SIGNED_VALUE 127 | |
387 #define ALMIXER_UNSIGNED_VALUE 255 | |
388 | |
389 #ifdef ENABLE_PARANOID_SIGNEDNESS_CHECK | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
390 static ALushort SIGN_TYPE_16_BIT_FORMAT = AUDIO_S16SYS; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
391 static ALushort SIGN_TYPE_8_BIT_FORMAT = AUDIO_S8; |
0 | 392 #else |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
393 static const ALushort SIGN_TYPE_16_BIT_FORMAT = AUDIO_S16SYS; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
394 static const ALushort SIGN_TYPE_8_BIT_FORMAT = AUDIO_S8; |
0 | 395 #endif |
396 | |
1 | 397 |
398 /* This can be private instead of being in the header now that I moved | |
399 * ALmixer_Data inside here. | |
400 */ | |
401 typedef struct ALmixer_Buffer_Map ALmixer_Buffer_Map; | |
402 | |
403 | |
404 struct ALmixer_Data | |
405 { | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
406 ALboolean decoded_all; /* dictates different behaviors */ |
22
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
407 ALint total_time; /* total playing time of sample (msec), obsolete now that we pushed our changes to SDL_sound */ |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
408 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
409 ALuint in_use; /* needed to prevent sharing for streams */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
410 ALboolean eof; /* flag for eof, only used for streams */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
411 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
412 ALuint total_bytes; /* For predecoded */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
413 ALuint loaded_bytes; /* For predecoded (for seek) */ |
1 | 414 |
415 Sound_Sample* sample; /* SDL_Sound provides the data */ | |
416 ALuint* buffer; /* array of OpenAL buffers (at least 1 for predecoded) */ | |
417 | |
418 /* Needed for streamed buffers */ | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
419 ALuint max_queue_buffers; /* Max number of queue buffers */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
420 ALuint num_startup_buffers; /* Number of ramp-up buffers */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
421 ALuint num_buffers_in_use; /* number of buffers in use */ |
28
60500a33735a
Initial backend changes to decouple assumption of 1 buffer queued per channel / per pass. API will eventually be changed/broken to support this.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
27
diff
changeset
|
422 ALuint num_target_buffers_per_pass; /* number of buffers to try to queue in an update pass */ |
1 | 423 |
424 /* This stuff is for streamed buffers that require data access */ | |
425 ALmixer_Buffer_Map* buffer_map_list; /* translate ALbuffer to index | |
426 and holds pointer to copy of data for | |
427 data access */ | |
428 ALuint current_buffer; /* The current playing buffer */ | |
429 | |
430 /* Nvidia distribution refuses to recognize a simple buffer query command | |
431 * unlike all other distributions. It's forcing me to redo the code | |
432 * to accomodate this Nvidia flaw by making me maintain a "best guess" | |
433 * copy of what I think the buffer queue state looks like. | |
434 * A circular queue would a helpful data structure for this task, | |
435 * but I wanted to avoid making an additional header requirement, | |
436 * so I'm making it a void* | |
437 */ | |
438 void* circular_buffer_queue; | |
439 | |
440 | |
441 }; | |
442 | |
0 | 443 static struct ALmixer_Channel |
444 { | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
445 ALboolean channel_in_use; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
446 ALboolean callback_update; /* For streaming determination */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
447 ALboolean needs_stream; /* For streaming determination */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
448 ALboolean halted; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
449 ALboolean paused; |
0 | 450 ALuint alsource; |
451 ALmixer_Data* almixer_data; | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
452 ALint loops; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
453 ALint expire_ticks; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
454 ALuint start_time; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
455 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
456 ALboolean fade_enabled; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
457 ALuint fade_expire_ticks; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
458 ALuint fade_start_time; |
0 | 459 ALfloat fade_inv_time; |
460 ALfloat fade_start_volume; | |
461 ALfloat fade_end_volume; | |
462 ALfloat max_volume; | |
463 ALfloat min_volume; | |
464 | |
465 /* Do we need other flags? | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
466 ALbyte *samples; |
0 | 467 int volume; |
468 int looping; | |
469 int tag; | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
470 ALuint expire; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
471 ALuint start_time; |
0 | 472 Mix_Fading fading; |
473 int fade_volume; | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
474 ALuint fade_length; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
475 ALuint ticks_fade; |
0 | 476 effect_info *effects; |
477 */ | |
478 } *ALmixer_Channel_List = NULL; | |
479 | |
1 | 480 struct ALmixer_Buffer_Map |
481 { | |
482 ALuint albuffer; | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
483 ALint index; /* might not need */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
484 ALbyte* data; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
485 ALuint num_bytes; |
1 | 486 }; |
487 | |
0 | 488 /* This will be used to find a channel if the user supplies a source */ |
489 typedef struct Source_Map | |
490 { | |
491 ALuint source; | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
492 ALint channel; |
0 | 493 } Source_Map; |
494 /* Keep an array of all sources with their associated channel */ | |
495 static Source_Map* Source_Map_List; | |
496 | |
497 static int Compare_Source_Map(const void* a, const void* b) | |
498 { | |
499 return ( ((Source_Map*)a)->source - ((Source_Map*)b)->source ); | |
500 } | |
501 | |
502 /* Sort by channel instead of source */ | |
503 static int Compare_Source_Map_by_channel(const void* a, const void* b) | |
504 { | |
505 return ( ((Source_Map*)a)->channel - ((Source_Map*)b)->channel ); | |
506 } | |
507 | |
508 /* Compare by albuffer */ | |
509 static int Compare_Buffer_Map(const void* a, const void* b) | |
510 { | |
1 | 511 return ( ((ALmixer_Buffer_Map*)a)->albuffer - ((ALmixer_Buffer_Map*)b)->albuffer ); |
0 | 512 } |
513 | |
514 /* This is for the user defined callback via | |
515 * ALmixer_ChannelFinished() | |
516 */ | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
517 static void (*Channel_Done_Callback)(ALint which_channel, ALuint al_source, ALmixer_Data* almixer_data, ALboolean finished_naturally, void* user_data) = NULL; |
0 | 518 static void* Channel_Done_Callback_Userdata = NULL; |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
519 static void (*Channel_Data_Callback)(ALint which_channel, ALuint al_source, ALbyte* data, ALuint num_bytes, ALuint frequency, ALubyte channels, ALubyte bit_depth, ALboolean is_unsigned, ALboolean decode_mode_is_predecoded, ALuint length_in_msec, void* user_data) = NULL; |
1 | 520 static void* Channel_Data_Callback_Userdata = NULL; |
0 | 521 |
522 | |
523 static void PrintQueueStatus(ALuint source) | |
524 { | |
525 ALint buffers_queued = 0; | |
526 ALint buffers_processed = 0; | |
527 ALenum error; | |
528 | |
529 /* Get the number of buffers still queued */ | |
530 alGetSourcei( | |
531 source, | |
532 AL_BUFFERS_QUEUED, | |
533 &buffers_queued | |
534 ); | |
535 | |
536 if((error = alGetError()) != AL_NO_ERROR) | |
537 { | |
538 fprintf(stderr, "Error in PrintQueueStatus, Can't get buffers_queued: %s\n", | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
539 alGetString(error)); |
0 | 540 } |
541 /* Get the number of buffers processed | |
542 * so we know if we need to refill | |
543 */ | |
544 alGetSourcei( | |
545 source, | |
546 AL_BUFFERS_PROCESSED, | |
547 &buffers_processed | |
548 ); | |
549 if((error = alGetError()) != AL_NO_ERROR) | |
550 { | |
551 fprintf(stderr, "Error in PrintQueueStatus, Can't get buffers_processed: %s\n", | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
552 alGetString(error)); |
0 | 553 } |
554 | |
6
4b1048af7e55
Disabled some of the debugging printfs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
3
diff
changeset
|
555 /* |
0 | 556 fprintf(stderr, "For source: %d, buffers_queued=%d, buffers_processed=%d\n", |
557 source, | |
558 buffers_queued, | |
559 buffers_processed); | |
6
4b1048af7e55
Disabled some of the debugging printfs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
3
diff
changeset
|
560 */ |
0 | 561 } |
562 | |
563 | |
564 | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
565 static void Init_Channel(ALint channel) |
0 | 566 { |
567 ALmixer_Channel_List[channel].channel_in_use = 0; | |
568 ALmixer_Channel_List[channel].callback_update = 0; | |
569 ALmixer_Channel_List[channel].needs_stream = 0; | |
570 ALmixer_Channel_List[channel].paused = 0; | |
571 ALmixer_Channel_List[channel].halted = 0; | |
572 ALmixer_Channel_List[channel].loops = 0; | |
573 | |
574 ALmixer_Channel_List[channel].expire_ticks = 0; | |
575 ALmixer_Channel_List[channel].start_time = 0; | |
576 | |
577 ALmixer_Channel_List[channel].fade_enabled = 0; | |
578 ALmixer_Channel_List[channel].fade_expire_ticks = 0; | |
579 ALmixer_Channel_List[channel].fade_start_time = 0; | |
580 ALmixer_Channel_List[channel].fade_inv_time = 0.0f; | |
581 ALmixer_Channel_List[channel].fade_start_volume = 0.0f; | |
582 ALmixer_Channel_List[channel].fade_end_volume = 0.0f; | |
583 ALmixer_Channel_List[channel].max_volume = 1.0f; | |
584 ALmixer_Channel_List[channel].min_volume = 0.0f; | |
585 | |
586 ALmixer_Channel_List[channel].almixer_data = NULL; | |
587 } | |
588 /* Quick helper function to clean up a channel | |
589 * after it's done playing */ | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
590 static void Clean_Channel(ALint channel) |
0 | 591 { |
592 ALenum error; | |
593 ALmixer_Channel_List[channel].channel_in_use = 0; | |
594 ALmixer_Channel_List[channel].callback_update = 0; | |
595 ALmixer_Channel_List[channel].needs_stream = 0; | |
596 ALmixer_Channel_List[channel].paused = 0; | |
597 ALmixer_Channel_List[channel].halted = 0; | |
598 ALmixer_Channel_List[channel].loops = 0; | |
599 | |
600 | |
601 ALmixer_Channel_List[channel].expire_ticks = 0; | |
602 ALmixer_Channel_List[channel].start_time = 0; | |
603 | |
604 ALmixer_Channel_List[channel].fade_enabled = 0; | |
605 ALmixer_Channel_List[channel].fade_expire_ticks = 0; | |
606 ALmixer_Channel_List[channel].fade_start_time = 0; | |
607 ALmixer_Channel_List[channel].fade_inv_time = 0.0f; | |
608 ALmixer_Channel_List[channel].fade_start_volume = 0.0f; | |
609 ALmixer_Channel_List[channel].fade_end_volume = 0.0f; | |
610 | |
611 alSourcef(ALmixer_Channel_List[channel].alsource, AL_MAX_GAIN, | |
612 ALmixer_Channel_List[channel].max_volume); | |
613 | |
614 if((error = alGetError()) != AL_NO_ERROR) | |
615 { | |
616 fprintf(stderr, "10Testing errpr before unqueue because getting stuff, for OS X this is expected: %s\n", | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
617 alGetString(error)); |
0 | 618 } |
619 | |
620 alSourcef(ALmixer_Channel_List[channel].alsource, AL_MIN_GAIN, | |
621 ALmixer_Channel_List[channel].min_volume); | |
622 if((error = alGetError()) != AL_NO_ERROR) | |
623 { | |
624 fprintf(stderr, "11Testing errpr before unqueue because getting stuff, for OS X this is expected: %s\n", | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
625 alGetString(error)); |
0 | 626 } |
627 | |
628 if(ALmixer_Channel_List[channel].almixer_data != NULL) | |
629 { | |
630 if(ALmixer_Channel_List[channel].almixer_data->in_use > 0) | |
631 { | |
632 ALmixer_Channel_List[channel].almixer_data->in_use--; | |
633 } | |
634 } | |
635 /* Needed to determine if rewind is needed, can't reset */ | |
636 /* | |
637 ALmixer_Channel_List[channel].almixer_data->eof = 0; | |
638 */ | |
639 | |
640 ALmixer_Channel_List[channel].almixer_data = NULL; | |
641 } | |
642 | |
643 /* What shoud this return? | |
644 * 127 for signed, 255 for unsigned | |
645 */ | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
646 static ALubyte GetSignednessValue(ALushort format) |
0 | 647 { |
648 switch(format) | |
649 { | |
650 case AUDIO_U8: | |
651 case AUDIO_U16LSB: | |
652 case AUDIO_U16MSB: | |
653 return ALMIXER_UNSIGNED_VALUE; | |
654 break; | |
655 case AUDIO_S8: | |
656 case AUDIO_S16LSB: | |
657 case AUDIO_S16MSB: | |
658 return ALMIXER_SIGNED_VALUE; | |
659 break; | |
660 default: | |
661 return 0; | |
662 } | |
663 return 0; | |
664 } | |
665 | |
666 | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
667 static ALubyte GetBitDepth(ALushort format) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
668 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
669 ALubyte bit_depth = 16; |
0 | 670 |
671 switch(format) | |
672 { | |
673 case AUDIO_U8: | |
674 case AUDIO_S8: | |
675 bit_depth = 8; | |
676 break; | |
677 | |
678 case AUDIO_U16LSB: | |
679 /* | |
680 case AUDIO_U16: | |
681 */ | |
682 case AUDIO_S16LSB: | |
683 /* | |
684 case AUDIO_S16: | |
685 */ | |
686 case AUDIO_U16MSB: | |
687 case AUDIO_S16MSB: | |
688 /* | |
689 case AUDIO_U16SYS: | |
690 case AUDIO_S16SYS: | |
691 */ | |
692 bit_depth = 16; | |
693 break; | |
694 default: | |
695 bit_depth = 0; | |
696 } | |
697 return bit_depth; | |
698 } | |
699 | |
700 /* Need to translate between SDL/SDL_Sound audiospec | |
701 * and OpenAL conventions */ | |
702 static ALenum TranslateFormat(Sound_AudioInfo* info) | |
703 { | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
704 ALubyte bit_depth; |
0 | 705 |
706 bit_depth = GetBitDepth(info->format); | |
707 if(0 == bit_depth) | |
708 { | |
709 fprintf(stderr, "Warning: Unknown bit depth. Setting to 16\n"); | |
710 bit_depth = 16; | |
711 } | |
712 | |
713 if(2 == info->channels) | |
714 { | |
715 if(16 == bit_depth) | |
716 { | |
717 return AL_FORMAT_STEREO16; | |
718 } | |
719 else | |
720 { | |
721 return AL_FORMAT_STEREO8; | |
722 } | |
723 } | |
724 else | |
725 { | |
726 if(16 == bit_depth) | |
727 { | |
728 return AL_FORMAT_MONO16; | |
729 } | |
730 else | |
731 { | |
732 return AL_FORMAT_MONO8; | |
733 } | |
734 } | |
735 /* Make compiler happy. Shouldn't get here */ | |
736 return AL_FORMAT_STEREO16; | |
737 } | |
738 | |
1 | 739 |
740 /* This will compute the total playing time | |
741 * based upon the number of bytes and audio info. | |
742 * (In prinicple, it should compute the time for any given length) | |
743 */ | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
744 static ALuint Compute_Total_Time_Decomposed(ALuint bytes_per_sample, ALuint frequency, ALubyte channels, size_t total_bytes) |
1 | 745 { |
746 double total_sec; | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
747 ALuint total_msec; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
748 ALuint bytes_per_sec; |
1 | 749 |
750 if(0 == total_bytes) | |
751 { | |
752 return 0; | |
753 } | |
754 /* To compute Bytes per second, do | |
755 * samples_per_sec * bytes_per_sample * number_of_channels | |
756 */ | |
757 bytes_per_sec = frequency * bytes_per_sample * channels; | |
758 | |
759 /* Now to get total time (sec), do | |
760 * total_bytes / bytes_per_sec | |
761 */ | |
762 total_sec = total_bytes / (double)bytes_per_sec; | |
763 | |
764 /* Now convert seconds to milliseconds | |
765 * Add .5 to the float to do rounding before the final cast | |
766 */ | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
767 total_msec = (ALuint) ( (total_sec * 1000) + 0.5 ); |
1 | 768 /* |
769 fprintf(stderr, "freq=%d, bytes_per_sample=%d, channels=%d, total_msec=%d\n", frequency, bytes_per_sample, channels, total_msec); | |
770 */ | |
771 return total_msec; | |
772 } | |
773 | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
774 static ALuint Compute_Total_Time(Sound_AudioInfo *info, size_t total_bytes) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
775 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
776 ALuint bytes_per_sample; |
1 | 777 |
778 if(0 == total_bytes) | |
779 { | |
780 return 0; | |
781 } | |
782 /* SDL has a mask trick I was not aware of. Mask the upper bits | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
783 * of the format, and you get 8 or 16 which is the bits per sample. |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
784 * Divide by 8bits_per_bytes and you get bytes_per_sample |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
785 * I tested this under 32-bit and 64-bit and big and little endian |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
786 * to make sure this still works since I have since moved from |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
787 * Uint32 to unspecified size types like ALuint. |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
788 */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
789 bytes_per_sample = (ALuint) ((info->format & 0xFF) / 8); |
1 | 790 |
791 return Compute_Total_Time_Decomposed(bytes_per_sample, info->rate, info->channels, total_bytes); | |
792 } /* End Compute_Total_Time */ | |
793 | |
794 | |
24
e085cbc573cf
iOS optimization/bug/workaround.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
22
diff
changeset
|
795 #ifdef ALMIXER_DISABLE_PREDECODED_PRECOMPUTE_BUFFER_SIZE_OPTIMIZATION |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
796 static size_t Compute_Total_Bytes_Decomposed(ALuint bytes_per_sample, ALuint frequency, ALubyte channels, ALuint total_msec) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
797 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
798 double total_sec; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
799 ALuint bytes_per_sec; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
800 size_t total_bytes; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
801 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
802 if(0 >= total_msec) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
803 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
804 return 0; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
805 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
806 /* To compute Bytes per second, do |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
807 * samples_per_sec * bytes_per_sample * number_of_channels |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
808 */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
809 bytes_per_sec = frequency * bytes_per_sample * channels; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
810 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
811 /* convert milliseconds to seconds */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
812 total_sec = total_msec / 1000.0; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
813 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
814 /* Now to get total bytes */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
815 total_bytes = (size_t)(((double)bytes_per_sec * total_sec) + 0.5); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
816 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
817 /* fprintf(stderr, "freq=%d, bytes_per_sample=%d, channels=%d, total_msec=%d, total_bytes=%d\n", frequency, bytes_per_sample, channels, total_msec, total_bytes); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
818 */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
819 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
820 return total_bytes; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
821 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
822 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
823 static size_t Compute_Total_Bytes(Sound_AudioInfo *info, ALuint total_msec) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
824 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
825 ALuint bytes_per_sample; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
826 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
827 if(0 >= total_msec) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
828 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
829 return 0; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
830 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
831 /* SDL has a mask trick I was not aware of. Mask the upper bits |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
832 * of the format, and you get 8 or 16 which is the bits per sample. |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
833 * Divide by 8bits_per_bytes and you get bytes_per_sample |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
834 * I tested this under 32-bit and 64-bit and big and little endian |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
835 * to make sure this still works since I have since moved from |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
836 * Uint32 to unspecified size types like ALuint. |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
837 */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
838 bytes_per_sample = (ALuint) ((info->format & 0xFF) / 8); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
839 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
840 return Compute_Total_Bytes_Decomposed(bytes_per_sample, info->rate, info->channels, total_msec); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
841 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
842 |
24
e085cbc573cf
iOS optimization/bug/workaround.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
22
diff
changeset
|
843 |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
844 /* The back-end decoders seem to need to decode in quantized frame sizes. |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
845 * So if I can pad the bytes to the next quanta, things might go more smoothly. |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
846 */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
847 static size_t Compute_Total_Bytes_With_Frame_Padding(Sound_AudioInfo *info, ALuint total_msec) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
848 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
849 ALuint bytes_per_sample; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
850 ALuint bytes_per_frame; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
851 size_t evenly_divisible_frames; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
852 size_t remainder_frames; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
853 size_t return_bytes; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
854 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
855 size_t total_bytes = Compute_Total_Bytes(info, total_msec); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
856 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
857 bytes_per_sample = (ALuint) ((info->format & 0xFF) / 8); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
858 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
859 bytes_per_frame = bytes_per_sample * info->channels; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
860 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
861 evenly_divisible_frames = total_bytes / bytes_per_frame; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
862 remainder_frames = total_bytes % bytes_per_frame; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
863 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
864 return_bytes = (evenly_divisible_frames * bytes_per_frame) + (remainder_frames * bytes_per_frame); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
865 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
866 /* Experimentally, some times I see to come up short in |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
867 * actual bytes decoded and I see a second pass is needed. |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
868 * I'm worried this may have additional performance implications. |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
869 * Sometimes in the second pass (depending on file), |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
870 * I have seen between 0 and 18 bytes. |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
871 * I'm tempted to pad the bytes by some arbitrary amount. |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
872 * However, I think currently the way SDL_sound is implemented, |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
873 * there is a big waste of memory up front instead of per-pass, |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
874 * so maybe I shouldn't worry about this. |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
875 */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
876 /* |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
877 return_bytes += 64; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
878 */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
879 /* |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
880 fprintf(stderr, "remainder_frames=%d, padded_total_bytes=%d\n", remainder_frames, return_bytes); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
881 */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
882 return return_bytes; |
24
e085cbc573cf
iOS optimization/bug/workaround.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
22
diff
changeset
|
883 } |
e085cbc573cf
iOS optimization/bug/workaround.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
22
diff
changeset
|
884 #endif /* ALMIXER_DISABLE_PREDECODED_PRECOMPUTE_BUFFER_SIZE_OPTIMIZATION */ |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
885 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
886 |
1 | 887 |
0 | 888 /**************** REMOVED ****************************/ |
889 /* This was removed because I originally thought | |
890 * OpenAL could return a pointer to the buffer data, | |
891 * but I was wrong. If something like that is ever | |
892 * implemented, then this might become useful. | |
893 */ | |
894 #if 0 | |
895 /* Reconstruct_Sound_Sample and Set_AudioInfo only | |
896 * are needed if the Seek memory optimization is | |
897 * used. Also, the Loki dist doesn't seem to support | |
898 * AL_DATA which I need for it. | |
899 */ | |
900 #ifndef DISABLE_SEEK_MEMORY_OPTIMIZATION | |
901 | |
902 static void Set_AudioInfo(Sound_AudioInfo* info, ALint frequency, ALint bits, ALint channels) | |
903 { | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
904 info->rate = (ALuint)frequency; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
905 info->channels = (ALubyte)channels; |
0 | 906 |
907 /* Not sure if it should be signed or unsigned. Hopefully | |
908 * that detail won't be needed. | |
909 */ | |
910 if(8 == bits) | |
911 { | |
912 info->format = AUDIO_U8; | |
913 } | |
914 else | |
915 { | |
916 info->format = AUDIO_U16SYS; | |
917 } | |
918 fprintf(stderr, "Audio info: freq=%d, chan=%d, format=%d\n", | |
919 info->rate, info->channels, info->format); | |
920 | |
921 } | |
922 | |
923 | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
924 static ALint Reconstruct_Sound_Sample(ALmixer_Data* data) |
0 | 925 { |
926 ALenum error; | |
927 ALint* data_from_albuffer; | |
928 ALint freq; | |
929 ALint bits; | |
930 ALint channels; | |
931 ALint size; | |
932 | |
933 /* Create memory all initiallized to 0. */ | |
934 data->sample = (Sound_Sample*)calloc(1, sizeof(Sound_Sample)); | |
935 if(NULL == data->sample) | |
936 { | |
937 ALmixer_SetError("Out of memory for Sound_Sample"); | |
938 return -1; | |
939 } | |
940 | |
941 /* Clear errors */ | |
942 alGetError(); | |
943 | |
944 alGetBufferi(data->buffer[0], AL_FREQUENCY, &freq); | |
945 if((error = alGetError()) != AL_NO_ERROR) | |
946 { | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
947 ALmixer_SetError("alGetBufferi(AL_FREQUENCY): %s", alGetString(error) ); |
0 | 948 free(data->sample); |
949 data->sample = NULL; | |
950 return -1; | |
951 } | |
952 | |
953 alGetBufferi(data->buffer[0], AL_BITS, &bits); | |
954 if((error = alGetError()) != AL_NO_ERROR) | |
955 { | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
956 ALmixer_SetError("alGetBufferi(AL_BITS): %s", alGetString(error) ); |
0 | 957 free(data->sample); |
958 data->sample = NULL; | |
959 return -1; | |
960 } | |
961 | |
962 alGetBufferi(data->buffer[0], AL_CHANNELS, &channels); | |
963 if((error = alGetError()) != AL_NO_ERROR) | |
964 { | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
965 ALmixer_SetError("alGetBufferi(AL_CHANNELS): %s", alGetString(error) ); |
0 | 966 free(data->sample); |
967 data->sample = NULL; | |
968 return -1; | |
969 } | |
970 | |
971 alGetBufferi(data->buffer[0], AL_SIZE, &size); | |
972 if((error = alGetError()) != AL_NO_ERROR) | |
973 { | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
974 ALmixer_SetError("alGetBufferi(AL_SIZE): %s", alGetString(error) ); |
0 | 975 free(data->sample); |
976 data->sample = NULL; | |
977 return -1; | |
978 } | |
979 | |
980 alGetBufferi(data->buffer[0], AL_DATA, data_from_albuffer); | |
981 if((error = alGetError()) != AL_NO_ERROR) | |
982 { | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
983 ALmixer_SetError("alGetBufferi(AL_DATA): %s", alGetString(error) ); |
0 | 984 free(data->sample); |
985 data->sample = NULL; | |
986 return -1; | |
987 } | |
988 | |
989 if(size <= 0) | |
990 { | |
991 ALmixer_SetError("No data in al buffer"); | |
992 free(data->sample); | |
993 data->sample = NULL; | |
994 return -1; | |
995 } | |
996 | |
997 /* Now that we have all the attributes, we need to | |
998 * allocate memory for the buffer and reconstruct | |
999 * the AudioInfo attributes. | |
1000 */ | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1001 data->sample->buffer = malloc(size*sizeof(ALbyte)); |
0 | 1002 if(NULL == data->sample->buffer) |
1003 { | |
1004 ALmixer_SetError("Out of memory for sample->buffer"); | |
1005 free(data->sample); | |
1006 data->sample = NULL; | |
1007 return -1; | |
1008 } | |
1009 | |
1010 memcpy(data->sample->buffer, data_from_albuffer, size); | |
1011 data->sample->buffer_size = size; | |
1012 | |
1013 /* Fill up the Sound_AudioInfo structures */ | |
1014 Set_AudioInfo(&data->sample->desired, freq, bits, channels); | |
1015 Set_AudioInfo(&data->sample->actual, freq, bits, channels); | |
1016 | |
1017 return 0; | |
1018 } | |
1019 | |
1020 #endif /* End DISABLE_SEEK_MEMORY_OPTIMIZATION */ | |
1021 #endif | |
1022 /*************** END REMOVED *************************/ | |
1023 | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1024 static void Invoke_Channel_Done_Callback(ALint which_channel, ALboolean did_finish_naturally) |
0 | 1025 { |
1026 if(NULL == Channel_Done_Callback) | |
1027 { | |
1028 return; | |
1029 } | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1030 Channel_Done_Callback(which_channel, ALmixer_Channel_List[which_channel].alsource, ALmixer_Channel_List[which_channel].almixer_data, did_finish_naturally, Channel_Done_Callback_Userdata); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1031 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1032 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1033 static ALint LookUpBuffer(ALuint buffer, ALmixer_Buffer_Map* buffer_map_list, ALuint num_items_in_list) |
0 | 1034 { |
1035 /* Only the first value is used for the key */ | |
1 | 1036 ALmixer_Buffer_Map key = { 0, 0, NULL, 0 }; |
1037 ALmixer_Buffer_Map* found_item = NULL; | |
0 | 1038 key.albuffer = buffer; |
1039 | |
1040 /* Use the ANSI C binary search feature (yea!) */ | |
1 | 1041 found_item = (ALmixer_Buffer_Map*)bsearch(&key, buffer_map_list, num_items_in_list, sizeof(ALmixer_Buffer_Map), Compare_Buffer_Map); |
0 | 1042 if(NULL == found_item) |
1043 { | |
1044 ALmixer_SetError("Can't find buffer"); | |
1045 return -1; | |
1046 } | |
1047 return found_item->index; | |
1048 } | |
1049 | |
1050 | |
1051 /* FIXME: Need to pass back additional info to be useful. | |
1052 * Bit rate, stereo/mono (num chans), time in msec? | |
1053 * Precoded/streamed flag so user can plan for future data? | |
1054 */ | |
1 | 1055 /* |
1056 * channels: 1 for mono, 2 for stereo | |
1057 * | |
1058 */ | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1059 static void Invoke_Channel_Data_Callback(ALint which_channel, ALbyte* data, ALuint num_bytes, ALuint frequency, ALubyte channels, ALushort format, ALboolean decode_mode_is_predecoded) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1060 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1061 ALboolean is_unsigned; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1062 ALubyte bits_per_sample = GetBitDepth(format); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1063 ALuint bytes_per_sample; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1064 ALuint length_in_msec; |
1 | 1065 |
1066 if(GetSignednessValue(format) == ALMIXER_UNSIGNED_VALUE) | |
1067 { | |
1068 is_unsigned = 1; | |
1069 } | |
1070 else | |
1071 { | |
1072 is_unsigned = 0; | |
1073 } | |
1074 | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1075 bytes_per_sample = (ALuint) (bits_per_sample / 8); |
1 | 1076 |
1077 length_in_msec = Compute_Total_Time_Decomposed(bytes_per_sample, frequency, channels, num_bytes); | |
1078 | |
0 | 1079 /* |
1080 fprintf(stderr, "%x %x %x %x, bytes=%d, whichchan=%d, freq=%d, channels=%d\n", data[0], data[1], data[2], data[3], num_bytes, channels, frequency, channels); | |
1081 */ | |
1082 if(NULL == Channel_Data_Callback) | |
1083 { | |
1084 return; | |
1085 } | |
1 | 1086 /* |
1087 * Channel_Data_Callback(which_channel, data, num_bytes, frequency, channels, GetBitDepth(format), format, decode_mode_is_predecoded); | |
1088 */ | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1089 Channel_Data_Callback(which_channel, ALmixer_Channel_List[which_channel].alsource, data, num_bytes, frequency, channels, bits_per_sample, is_unsigned, decode_mode_is_predecoded, length_in_msec, Channel_Data_Callback_Userdata); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1090 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1091 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1092 static void Invoke_Predecoded_Channel_Data_Callback(ALint channel, ALmixer_Data* data) |
0 | 1093 { |
1094 if(NULL == data->sample) | |
1095 { | |
1096 return; | |
1097 } | |
1098 /* The buffer position is complicated because if the current data was seeked, | |
1099 * we must adjust the buffer to the seek position | |
1100 */ | |
1101 Invoke_Channel_Data_Callback(channel, | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1102 (((ALbyte*) data->sample->buffer) + (data->total_bytes - data->loaded_bytes) ), |
0 | 1103 data->loaded_bytes, |
1104 data->sample->desired.rate, | |
1105 data->sample->desired.channels, | |
1106 data->sample->desired.format, | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1107 AL_TRUE |
0 | 1108 ); |
1109 } | |
1110 | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1111 static void Invoke_Streamed_Channel_Data_Callback(ALint channel, ALmixer_Data* data, ALuint buffer) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1112 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1113 ALint index; |
0 | 1114 if(NULL == data->buffer_map_list) |
1115 { | |
1116 return; | |
1117 } | |
1118 index = LookUpBuffer(buffer, data->buffer_map_list, data->max_queue_buffers); | |
1119 /* This should catch the case where all buffers are unqueued | |
1120 * and the "current" buffer is id: 0 | |
1121 */ | |
1122 if(-1 == index) | |
1123 { | |
1124 return; | |
1125 } | |
1126 Invoke_Channel_Data_Callback(channel, | |
1127 data->buffer_map_list[index].data, | |
1128 data->buffer_map_list[index].num_bytes, | |
1129 data->sample->desired.rate, | |
1130 data->sample->desired.channels, | |
1131 data->sample->desired.format, | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1132 AL_FALSE |
0 | 1133 ); |
1134 } | |
1135 | |
6
4b1048af7e55
Disabled some of the debugging printfs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
3
diff
changeset
|
1136 /* Converts milliseconds to byte positions. |
0 | 1137 * This is needed for seeking on predecoded samples |
1138 */ | |
22
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
1139 static ALuint Convert_Msec_To_Byte_Pos(Sound_AudioInfo* audio_info, ALuint number_of_milliseconds) |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
1140 { |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
1141 ALuint bytes_per_sample; |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
1142 ALuint bytes_per_frame; |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
1143 float bytes_per_millisecond; |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
1144 float byte_position; |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
1145 |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
1146 if(audio_info == NULL) |
0 | 1147 { |
1148 fprintf(stderr, "Error, info is NULL\n"); | |
1149 } | |
1150 | |
22
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
1151 /* SDL has a mask trick I was not aware of. Mask the upper bits |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
1152 * of the format, and you get 8 or 16 which is the bits per sample. |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
1153 * Divide by 8bits_per_bytes and you get bytes_per_sample |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
1154 * I tested this under 32-bit and 64-bit and big and little endian |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
1155 * to make sure this still works since I have since moved from |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
1156 * Uint32 to unspecified size types like ALuint. |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
1157 */ |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
1158 bytes_per_sample = (ALuint) ((audio_info->format & 0xFF) / 8); |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
1159 bytes_per_frame = bytes_per_sample * audio_info->channels; |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
1160 bytes_per_millisecond = (float)bytes_per_frame * (audio_info->rate / 1000.0f); |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
1161 byte_position = ((float)(number_of_milliseconds)) * bytes_per_millisecond; |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
1162 return (ALuint)(byte_position + 0.5); |
6
4b1048af7e55
Disabled some of the debugging printfs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
3
diff
changeset
|
1163 } |
0 | 1164 |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1165 static ALint Set_Predecoded_Seek_Position(ALmixer_Data* data, ALuint byte_position) |
0 | 1166 { |
1167 ALenum error; | |
1168 /* clear error */ | |
1169 alGetError(); | |
1170 | |
1171 /* Is it greater than, or greater-than or equal to ?? */ | |
1172 if(byte_position > data->total_bytes) | |
1173 { | |
1174 /* We can't go past the end, so set to end? */ | |
6
4b1048af7e55
Disabled some of the debugging printfs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
3
diff
changeset
|
1175 /* |
0 | 1176 fprintf(stderr, "Error, can't seek past end\n"); |
6
4b1048af7e55
Disabled some of the debugging printfs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
3
diff
changeset
|
1177 */ |
4b1048af7e55
Disabled some of the debugging printfs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
3
diff
changeset
|
1178 |
0 | 1179 /* In case the below thing doesn't work, |
1180 * just rewind the whole thing. | |
1181 * | |
1182 alBufferData(data->buffer[0], | |
1183 TranslateFormat(&data->sample->desired), | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1184 (ALbyte*) data->sample->buffer, |
0 | 1185 data->total_bytes, |
1186 data->sample->desired.rate | |
1187 ); | |
1188 */ | |
1189 | |
1190 /* I was trying to set to the end, (1 byte remaining), | |
1191 * but I was getting freezes. I'm thinking it might be | |
1192 * another Power of 2 bug in the Loki dist. I tried 2, | |
1193 * and it still hung. 4 didn't hang, but I got a clip | |
1194 * artifact. 8 seemed to work okay. | |
1195 */ | |
1196 alBufferData(data->buffer[0], | |
1197 TranslateFormat(&data->sample->desired), | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1198 (((ALbyte*) data->sample->buffer) + (data->total_bytes - 8) ), |
0 | 1199 8, |
1200 data->sample->desired.rate | |
1201 ); | |
1202 if( (error = alGetError()) != AL_NO_ERROR) | |
1203 { | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1204 ALmixer_SetError("Can't seek past end and alBufferData failed: %s\n", alGetString(error)); |
0 | 1205 return -1; |
1206 } | |
1207 /* Need to set the loaded_bytes field because I don't trust the OpenAL | |
1208 * query command to work because I don't know if it will mutilate the | |
1209 * size for its own purposes or return the original size | |
1210 */ | |
1211 data->loaded_bytes = 8; | |
1212 | |
1213 /* Not sure if this should be an error or not */ | |
1214 /* | |
1215 ALmixer_SetError("Can't Seek past end"); | |
1216 return -1; | |
1217 */ | |
1218 return 0; | |
1219 } | |
1220 | |
1221 alBufferData(data->buffer[0], | |
1222 TranslateFormat(&data->sample->desired), | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1223 &(((ALbyte*)data->sample->buffer)[byte_position]), |
0 | 1224 data->total_bytes - byte_position, |
1225 data->sample->desired.rate | |
1226 ); | |
1227 if( (error = alGetError()) != AL_NO_ERROR) | |
1228 { | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1229 ALmixer_SetError("alBufferData failed: %s\n", alGetString(error)); |
0 | 1230 return -1; |
1231 } | |
1232 /* Need to set the loaded_bytes field because I don't trust the OpenAL | |
1233 * query command to work because I don't know if it will mutilate the | |
1234 * size for its own purposes or return the original size | |
1235 */ | |
1236 data->loaded_bytes = data->total_bytes - byte_position; | |
1237 | |
1238 return 0; | |
1239 } | |
1240 | |
1241 /* Because we have multiple queue buffers and OpenAL won't let | |
1242 * us access them, we need to keep copies of each buffer around | |
1243 */ | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1244 static ALint CopyDataToAccessBuffer(ALmixer_Data* data, ALuint num_bytes, ALuint buffer) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1245 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1246 ALint index; |
0 | 1247 /* We only want to copy if access_data is true. |
1248 * This is determined by whether memory has been | |
1249 * allocated in the buffer_map_list or not | |
1250 */ | |
1251 if(NULL == data->buffer_map_list) | |
1252 { | |
1253 return -1; | |
1254 } | |
1255 index = LookUpBuffer(buffer, data->buffer_map_list, data->max_queue_buffers); | |
1256 if(-1 == index) | |
1257 { | |
6
4b1048af7e55
Disabled some of the debugging printfs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
3
diff
changeset
|
1258 /* |
0 | 1259 fprintf(stderr, ">>>>>>>CopyData catch, albuffer=%d\n",buffer); |
6
4b1048af7e55
Disabled some of the debugging printfs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
3
diff
changeset
|
1260 */ |
0 | 1261 return -1; |
1262 } | |
1263 /* Copy the data to the access buffer */ | |
1264 memcpy(data->buffer_map_list[index].data, data->sample->buffer, num_bytes); | |
1265 data->buffer_map_list[index].num_bytes = data->sample->buffer_size; | |
1266 | |
1267 return 0; | |
1268 } | |
1269 | |
1270 | |
1271 /* For streamed data, gets more data | |
1272 * and prepares it in the active Mix_chunk | |
1273 */ | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1274 static ALuint GetMoreData(ALmixer_Data* data, ALuint buffer) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1275 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1276 ALuint bytes_decoded; |
0 | 1277 ALenum error; |
1278 if(NULL == data) | |
1279 { | |
1280 ALmixer_SetError("Cannot GetMoreData() because ALmixer_Data* is NULL\n"); | |
1281 return 0; | |
1282 } | |
1283 | |
1284 bytes_decoded = Sound_Decode(data->sample); | |
1285 if(data->sample->flags & SOUND_SAMPLEFLAG_ERROR) | |
1286 { | |
1287 fprintf(stderr, "Sound_Decode triggered an ERROR>>>>>>\n"); | |
1288 ALmixer_SetError(Sound_GetError()); | |
1289 /* Force cleanup through FreeData | |
1290 Sound_FreeSample(data->sample); | |
1291 */ | |
1292 return 0; | |
1293 } | |
1294 | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1295 /* fprintf(stderr, "GetMoreData bytes_decoded=%d\n", bytes_decoded); */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1296 |
0 | 1297 /* Don't forget to add check for EOF */ |
1298 /* Will return 0 bytes and pass the buck to check sample->flags */ | |
1299 if(0 == bytes_decoded) | |
1300 { | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1301 data->eof = 1; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1302 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1303 #if 0 |
0 | 1304 fprintf(stderr, "Hit eof while trying to buffer\n"); |
1305 if(data->sample->flags & SOUND_SAMPLEFLAG_EOF) | |
1306 { | |
1307 fprintf(stderr, "\tEOF flag\n"); | |
1308 } | |
1309 if(data->sample->flags & SOUND_SAMPLEFLAG_CANSEEK) | |
1310 { | |
1311 fprintf(stderr, "\tCanSeek flag\n"); | |
1312 } | |
1313 if(data->sample->flags & SOUND_SAMPLEFLAG_EAGAIN) | |
1314 { | |
1315 fprintf(stderr, "\tEAGAIN flag\n"); | |
1316 } | |
1317 if(data->sample->flags & SOUND_SAMPLEFLAG_NONE) | |
1318 { | |
1319 fprintf(stderr, "\tNONE flag\n"); | |
1320 } | |
1321 #endif | |
1322 return 0; | |
1323 } | |
1324 | |
1325 #ifdef ENABLE_LOKI_QUEUE_FIX_HACK | |
1326 /******* REMOVE ME ********************************/ | |
1327 /***************** ANOTHER EXPERIEMENT *******************/ | |
1328 /* The PROBLEM: It seems that the Loki distribution has problems | |
1329 * with Queuing when the buffer size is not a power of two | |
1330 * and additional buffers must come after it. | |
1331 * The behavior is inconsistent, but one of several things | |
1332 * usually happens: | |
1333 * Playback is normal | |
1334 * Playback immediately stops after the non-pow2 buffer | |
1335 * Playback gets distorted on the non-pow2 buffer | |
1336 * The entire program segfaults. | |
1337 * The workaround is to always specify a power of two buffer size | |
1338 * and hope that SDL_sound always fill it. (By lucky coincidence, | |
1339 * I already submitted the Ogg fix.) However, this won't catch | |
1340 * cases where a loop happens because the read at the end of the | |
1341 * file is typically less than the buffer size. | |
1342 * | |
1343 * This fix addresses this issue, however it may break in | |
1344 * other conditions. Always decode in buffer sizes of powers of 2. | |
1345 * | |
1346 * The HACK: | |
1347 * If the buffer is short, try filling it up with 0's | |
1348 * to meet the user requested buffer_size which | |
1349 * is probably a nice number OpenAL likes, in | |
1350 * hopes to avoid a possible Loki bug with | |
1351 * short buffers. If looping (which is the main | |
1352 * reason for this), the negative side effect is | |
1353 * that it may take longer for the loop to start | |
1354 * because it must play dead silence. Or if the decoder | |
1355 * doesn't guarantee to return the requested bytes | |
1356 * (like Ogg), then you will get breakup in between | |
1357 * packets. | |
1358 */ | |
1359 if( (bytes_decoded) < data->sample->buffer_size) | |
1360 { | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1361 ALubyte bit_depth; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1362 ALubyte signedness_value; |
0 | 1363 int silence_value; |
1364 /* Crap, memset value needs to be the "silent" value, | |
1365 * but it will differ for signed/unsigned and bit depth | |
1366 */ | |
1367 bit_depth = GetBitDepth(data->sample->desired.format); | |
1368 signedness_value = GetSignednessValue(data->sample->desired.format); | |
1369 if(ALMIXER_SIGNED_VALUE == signedness_value) | |
1370 { | |
1371 /* I'm guessing that if it's signed, then 0 is the | |
1372 * "silent" value */ | |
1373 silence_value = 0; | |
1374 } | |
1375 else | |
1376 { | |
1377 if(8 == bit_depth) | |
1378 { | |
1379 /* If 8 bit, I'm guessing it's (2^7)-1 = 127 */ | |
1380 silence_value = 127; | |
1381 } | |
1382 else | |
1383 { | |
1384 /* For 16 bit, I'm guessing it's (2^15)-1 = 32767 */ | |
1385 silence_value = 32767; | |
1386 } | |
1387 } | |
1388 /* Now fill up the rest of the data buffer with the | |
1389 * silence_value. | |
1390 * I don't think I have to worry about endian issues for | |
1391 * this part since the data is for internal use only | |
1392 * at this point. | |
1393 */ | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1394 memset( &( ((ALbyte*)(data->sample->buffer))[bytes_decoded] ), silence_value, data->sample->buffer_size - bytes_decoded); |
0 | 1395 /* Now reset the bytes_decoded to reflect the entire |
1396 * buffer to tell alBufferData what our full size is. | |
1397 */ | |
6
4b1048af7e55
Disabled some of the debugging printfs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
3
diff
changeset
|
1398 /* |
0 | 1399 fprintf(stderr, "ALTERED bytes decoded for silence: Original end was %d\n", bytes_decoded); |
6
4b1048af7e55
Disabled some of the debugging printfs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
3
diff
changeset
|
1400 */ |
0 | 1401 bytes_decoded = data->sample->buffer_size; |
1402 } | |
1403 /*********** END EXPERIMENT ******************************/ | |
1404 /******* END REMOVE ME ********************************/ | |
1405 #endif | |
1406 | |
1407 /* Now copy the data to the OpenAL buffer */ | |
1408 /* We can't just set a pointer because the API needs | |
1409 * its own copy to assist hardware acceleration */ | |
1410 alBufferData(buffer, | |
1411 TranslateFormat(&data->sample->desired), | |
1412 data->sample->buffer, | |
1413 bytes_decoded, | |
1414 data->sample->desired.rate | |
1415 ); | |
1416 if( (error = alGetError()) != AL_NO_ERROR) | |
1417 { | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1418 ALmixer_SetError("alBufferData failed: %s\n", alGetString(error)); |
0 | 1419 return 0; |
1420 } | |
1421 | |
1422 /* If we need to, copy the data also to the access area | |
1423 * (the function will do the check for us) | |
1424 */ | |
1425 CopyDataToAccessBuffer(data, bytes_decoded, buffer); | |
1426 return bytes_decoded; | |
1427 } | |
1428 | |
1429 | |
1430 | |
1431 | |
1432 /******************** EXPERIEMENT **************************** | |
1433 * Test function to force maximum buffer filling during loops | |
1434 * REMOVE LATER | |
1435 *********************************************/ | |
1436 #if 0 | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1437 static ALint GetMoreData2(ALmixer_Data* data, ALuint buffer) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1438 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1439 ALint bytes_decoded; |
0 | 1440 ALenum error; |
1441 if(NULL == data) | |
1442 { | |
1443 ALmixer_SetError("Cannot GetMoreData() because ALmixer_Data* is NULL\n"); | |
1444 return -1; | |
1445 } | |
1446 | |
1447 if(AL_FALSE == alIsBuffer(buffer)) | |
1448 { | |
1449 fprintf(stderr, "NOT A BUFFER>>>>>>>>>>>>>>>\n"); | |
1450 return -1; | |
1451 } | |
1452 fprintf(stderr, "Entered GetMoreData222222: buffer id is %d\n", buffer); | |
1453 | |
1454 /* | |
1455 fprintf(stderr, "Decode in GetMoreData\n"); | |
1456 */ | |
1457 | |
1458 #if 0 | |
1459 if(buffer%2 == 1) | |
1460 { | |
1461 fprintf(stderr, "Setting buffer size to 16384\n"); | |
1462 Sound_SetBufferSize(data->sample, 16384); | |
1463 } | |
1464 else | |
1465 { | |
1466 fprintf(stderr, "Setting buffer size to 8192\n"); | |
1467 Sound_SetBufferSize(data->sample, 8192); | |
1468 } | |
1469 #endif | |
1470 | |
1471 bytes_decoded = Sound_Decode(data->sample); | |
1472 if(data->sample->flags & SOUND_SAMPLEFLAG_ERROR) | |
1473 { | |
1474 fprintf(stderr, "Sound_Decode triggered an ERROR>>>>>>\n"); | |
1475 ALmixer_SetError(Sound_GetError()); | |
1476 /* | |
1477 Sound_FreeSample(data->sample); | |
1478 */ | |
1479 return -1; | |
1480 } | |
1481 /* Don't forget to add check for EOF */ | |
1482 /* Will return 0 bytes and pass the buck to check sample->flags */ | |
1483 if(0 == bytes_decoded) | |
1484 { | |
1485 #if 1 | |
1486 fprintf(stderr, "Hit eof while trying to buffer\n"); | |
1487 data->eof = 1; | |
1488 if(data->sample->flags & SOUND_SAMPLEFLAG_EOF) | |
1489 { | |
1490 fprintf(stderr, "\tEOF flag\n"); | |
1491 } | |
1492 if(data->sample->flags & SOUND_SAMPLEFLAG_CANSEEK) | |
1493 { | |
1494 fprintf(stderr, "\tCanSeek flag\n"); | |
1495 } | |
1496 if(data->sample->flags & SOUND_SAMPLEFLAG_EAGAIN) | |
1497 { | |
1498 fprintf(stderr, "\tEAGAIN flag\n"); | |
1499 } | |
1500 if(data->sample->flags & SOUND_SAMPLEFLAG_NONE) | |
1501 { | |
1502 fprintf(stderr, "\tNONE flag\n"); | |
1503 } | |
1504 #endif | |
1505 return 0; | |
1506 } | |
1507 | |
1508 if(bytes_decoded < 16384) | |
1509 { | |
1510 char* tempbuffer1 = (char*)malloc(16384); | |
1511 char* tempbuffer2 = (char*)malloc(16384); | |
1512 int retval; | |
1513 memcpy(tempbuffer1, data->sample->buffer, bytes_decoded); | |
1514 retval = Sound_SetBufferSize(data->sample, 16384-bytes_decoded); | |
1515 if(retval == 1) | |
1516 { | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1517 ALuint new_bytes; |
0 | 1518 Sound_Rewind(data->sample); |
1519 new_bytes = Sound_Decode(data->sample); | |
1520 fprintf(stderr, "Orig bytes: %d, Make up bytes_decoded=%d, total=%d\n", bytes_decoded, new_bytes, new_bytes+bytes_decoded); | |
1521 | |
1522 memcpy(tempbuffer2, data->sample->buffer, new_bytes); | |
1523 | |
1524 retval = Sound_SetBufferSize(data->sample, 16384); | |
1525 fprintf(stderr, "Finished reset...now danger copy\n"); | |
1526 memcpy(data->sample->buffer, tempbuffer1,bytes_decoded); | |
1527 | |
1528 fprintf(stderr, "Finished reset...now danger copy2\n"); | |
1529 memcpy( &( ((char*)(data->sample->buffer))[bytes_decoded] ), tempbuffer2, new_bytes); | |
1530 | |
1531 fprintf(stderr, "Finished \n"); | |
1532 | |
1533 free(tempbuffer1); | |
1534 free(tempbuffer2); | |
1535 bytes_decoded += new_bytes; | |
1536 fprintf(stderr, "ASSERT bytes should equal 16384: %d\n", bytes_decoded); | |
1537 } | |
1538 else | |
1539 { | |
1540 fprintf(stderr, "Experiment failed: %s\n", Sound_GetError()); | |
1541 } | |
1542 } | |
1543 | |
1544 /* Now copy the data to the OpenAL buffer */ | |
1545 /* We can't just set a pointer because the API needs | |
1546 * its own copy to assist hardware acceleration */ | |
1547 alBufferData(buffer, | |
1548 TranslateFormat(&data->sample->desired), | |
1549 data->sample->buffer, | |
1550 bytes_decoded, | |
1551 data->sample->desired.rate | |
1552 ); | |
1553 if( (error = alGetError()) != AL_NO_ERROR) | |
1554 { | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1555 ALmixer_SetError("alBufferData failed: %s\n", alGetString(error)); |
0 | 1556 return -1; |
1557 } | |
1558 | |
1559 fprintf(stderr, "GetMoreData2222 returning %d bytes decoded\n", bytes_decoded); | |
1560 return bytes_decoded; | |
1561 } | |
1562 #endif | |
1563 | |
1564 /************ END EXPERIEMENT - REMOVE ME *************************/ | |
1565 | |
1566 | |
1567 | |
1568 | |
1569 | |
1570 | |
1571 | |
1572 | |
1573 | |
1574 /* This function will look up the source for the corresponding channel */ | |
1575 /* Must return 0 on error instead of -1 because of unsigned int */ | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1576 static ALuint Internal_GetSource(ALint channel) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1577 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1578 ALint i; |
0 | 1579 /* Make sure channel is in bounds */ |
1580 if(channel >= Number_of_Channels_global) | |
1581 { | |
1582 ALmixer_SetError("Requested channel (%d) exceeds maximum channel (%d) because only %d channels are allocated", channel, Number_of_Channels_global-1, Number_of_Channels_global); | |
1583 return 0; | |
1584 } | |
1585 /* If the user specified -1, then return the an available source */ | |
1586 if(channel < 0) | |
1587 { | |
1588 for(i=Number_of_Reserve_Channels_global; i<Number_of_Channels_global; i++) | |
1589 { | |
1590 if( ! ALmixer_Channel_List[i].channel_in_use ) | |
1591 { | |
1592 return ALmixer_Channel_List[i].alsource; | |
1593 } | |
1594 } | |
1595 /* If we get here, all sources are in use */ | |
1596 /* Error message seems too harsh | |
1597 ALmixer_SetError("All sources are in use"); | |
1598 */ | |
1599 return 0; | |
1600 } | |
1601 /* Last case: Return the source for the channel */ | |
1602 return ALmixer_Channel_List[channel].alsource; | |
1603 } | |
1604 | |
1605 /* This function will look up the channel for the corresponding source */ | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1606 static ALint Internal_GetChannel(ALuint source) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1607 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1608 ALint i; |
0 | 1609 /* Only the first value is used for the key */ |
1610 Source_Map key = { 0, 0 }; | |
1611 Source_Map* found_item = NULL; | |
1612 key.source = source; | |
1613 | |
1614 /* If the source is 0, look up the first available channel */ | |
1615 if(0 == source) | |
1616 { | |
1617 for(i=Number_of_Reserve_Channels_global; i<Number_of_Channels_global; i++) | |
1618 { | |
1619 if( ! ALmixer_Channel_List[i].channel_in_use ) | |
1620 { | |
1621 return i; | |
1622 } | |
1623 } | |
1624 /* If we get here, all sources are in use */ | |
1625 /* Error message seems too harsh | |
1626 ALmixer_SetError("All channels are in use"); | |
1627 */ | |
1628 return -1; | |
1629 } | |
1630 | |
1631 | |
1632 /* Else, look up the source and return the channel */ | |
1633 if(AL_FALSE == alIsSource(source)) | |
1634 { | |
1635 ALmixer_SetError("Is not a source"); | |
1636 return -1; | |
1637 } | |
1638 | |
1639 /* Use the ANSI C binary search feature (yea!) */ | |
1640 found_item = (Source_Map*)bsearch(&key, Source_Map_List, Number_of_Channels_global, sizeof(Source_Map), Compare_Source_Map); | |
1641 if(NULL == found_item) | |
1642 { | |
1643 ALmixer_SetError("Source is valid but not registered with ALmixer (to a channel)"); | |
1644 return -1; | |
1645 } | |
1646 return found_item->channel; | |
1647 } | |
1648 | |
1649 | |
1650 | |
1651 /* This function will find the first available channel (not in use) | |
1652 * from the specified start channel. Reserved channels to not qualify | |
1653 * as available. | |
1654 */ | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1655 static ALint Internal_FindFreeChannel(ALint start_channel) |
0 | 1656 { |
1657 /* Start at the number of reserved so we skip over | |
1658 * all the reserved channels. | |
1659 */ | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1660 ALint i = Number_of_Reserve_Channels_global; |
0 | 1661 /* Quick check to see if we're out of bounds */ |
1662 if(start_channel >= Number_of_Channels_global) | |
1663 { | |
1664 return -1; | |
1665 } | |
1666 | |
1667 /* If the start channel is even higher than the reserved, | |
1668 * then start at the higher value. | |
1669 */ | |
1670 if(start_channel > Number_of_Reserve_Channels_global) | |
1671 { | |
1672 i = start_channel; | |
1673 } | |
1674 | |
1675 /* i has already been set */ | |
1676 for( ; i<Number_of_Channels_global; i++) | |
1677 { | |
1678 if( ! ALmixer_Channel_List[i].channel_in_use ) | |
1679 { | |
1680 return i; | |
1681 } | |
1682 } | |
1683 /* If we get here, all sources are in use */ | |
1684 return -1; | |
1685 } | |
1686 | |
1687 | |
1688 | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1689 /* Will return the number of channels halted |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1690 * or 0 for error |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1691 */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1692 static ALint Internal_HaltChannel(ALint channel, ALboolean did_finish_naturally) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1693 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1694 ALint retval = 0; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1695 ALint counter = 0; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1696 ALenum error; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1697 ALint buffers_still_queued; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1698 ALint buffers_processed; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1699 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1700 if(channel >= Number_of_Channels_global) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1701 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1702 ALmixer_SetError("Cannot halt channel %d because it exceeds maximum number of channels (%d)\n", channel, Number_of_Channels_global); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1703 return -1; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1704 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1705 /* If the user specified a specific channel */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1706 if(channel >= 0) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1707 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1708 /* only need to process channel if in use */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1709 if(ALmixer_Channel_List[channel].channel_in_use) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1710 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1711 alSourceStop(ALmixer_Channel_List[channel].alsource); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1712 if((error = alGetError()) != AL_NO_ERROR) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1713 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1714 fprintf(stderr, "14Testing error: %s\n", |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1715 alGetString(error)); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1716 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1717 /* Here's the situation. My old method of using |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1718 * alSourceUnqueueBuffers() seemed to be invalid in light |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1719 * of all the problems I suffered through with getting |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1720 * the CoreData backend to work with this code. |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1721 * As such, I'm changing all the code to set the buffer to |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1722 * AL_NONE. Furthermore, the queued vs. non-queued issue |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1723 * doesn't need to apply here. For non-queued, Loki, |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1724 * Creative Windows, and CoreAudio seem to leave the |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1725 * buffer queued (Old Mac didn't.) For queued, we need to |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1726 * remove the processed buffers and force remove the |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1727 * still-queued buffers. |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1728 */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1729 alGetSourcei( |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1730 ALmixer_Channel_List[channel].alsource, |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1731 AL_BUFFERS_QUEUED, &buffers_still_queued |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1732 ); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1733 if((error = alGetError()) != AL_NO_ERROR) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1734 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1735 fprintf(stderr, "17Testing Error with buffers_still_queued: %s", |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1736 alGetString(error)); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1737 ALmixer_SetError("Failed detecting still queued buffers: %s", |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1738 alGetString(error) ); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1739 retval = -1; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1740 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1741 alGetSourcei( |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1742 ALmixer_Channel_List[channel].alsource, |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1743 AL_BUFFERS_PROCESSED, &buffers_processed |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1744 ); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1745 if((error = alGetError()) != AL_NO_ERROR) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1746 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1747 fprintf(stderr, "17Testing Error with buffers_processed: %s", |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1748 alGetString(error)); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1749 ALmixer_SetError("Failed detecting still processed buffers: %s", |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1750 alGetString(error) ); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1751 retval = -1; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1752 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1753 /* If either of these is greater than 0, it means we need |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1754 * to clear the source |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1755 */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1756 if((buffers_still_queued > 0) || (buffers_processed > 0)) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1757 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1758 alSourcei(ALmixer_Channel_List[channel].alsource, |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1759 AL_BUFFER, |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1760 AL_NONE); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1761 if((error = alGetError()) != AL_NO_ERROR) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1762 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1763 fprintf(stderr, "17Testing Error with clearing buffer from source: %s", |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1764 alGetString(error)); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1765 ALmixer_SetError("Failed to clear buffer from source: %s", |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1766 alGetString(error) ); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1767 retval = -1; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1768 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1769 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1770 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1771 ALmixer_Channel_List[channel].almixer_data->num_buffers_in_use = 0; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1772 |
10
c808684660a7
Bug fix: Moved Invoke_Callback before CleanChannel because I was trying to get the ALmixer_Data pointer, but it was cleared:
Eric Wing <ewing . public |-at-| gmail . com>
parents:
6
diff
changeset
|
1773 /* Launch callback for consistency? */ |
c808684660a7
Bug fix: Moved Invoke_Callback before CleanChannel because I was trying to get the ALmixer_Data pointer, but it was cleared:
Eric Wing <ewing . public |-at-| gmail . com>
parents:
6
diff
changeset
|
1774 Invoke_Channel_Done_Callback(channel, did_finish_naturally); |
c808684660a7
Bug fix: Moved Invoke_Callback before CleanChannel because I was trying to get the ALmixer_Data pointer, but it was cleared:
Eric Wing <ewing . public |-at-| gmail . com>
parents:
6
diff
changeset
|
1775 |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1776 Clean_Channel(channel); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1777 Is_Playing_global--; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1778 counter++; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1779 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1780 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1781 /* The user wants to halt all channels */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1782 else |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1783 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1784 ALint i; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1785 for(i=0; i<Number_of_Channels_global; i++) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1786 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1787 /* only need to process channel if in use */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1788 if(ALmixer_Channel_List[i].channel_in_use) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1789 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1790 alSourceStop(ALmixer_Channel_List[i].alsource); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1791 if((error = alGetError()) != AL_NO_ERROR) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1792 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1793 fprintf(stderr, "19Testing error: %s\n", |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1794 alGetString(error)); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1795 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1796 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1797 /* Here's the situation. My old method of using |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1798 * alSourceUnqueueBuffers() seemed to be invalid in light |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1799 * of all the problems I suffered through with getting |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1800 * the CoreData backend to work with this code. |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1801 * As such, I'm changing all the code to set the buffer to |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1802 * AL_NONE. Furthermore, the queued vs. non-queued issue |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1803 * doesn't need to apply here. For non-queued, Loki, |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1804 * Creative Windows, and CoreAudio seem to leave the |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1805 * buffer queued (Old Mac didn't.) For queued, we need to |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1806 * remove the processed buffers and force remove the |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1807 * still-queued buffers. |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1808 */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1809 alGetSourcei( |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1810 ALmixer_Channel_List[i].alsource, |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1811 AL_BUFFERS_QUEUED, &buffers_still_queued |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1812 ); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1813 if((error = alGetError()) != AL_NO_ERROR) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1814 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1815 fprintf(stderr, "17Testing Error with buffers_still_queued: %s", |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1816 alGetString(error)); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1817 ALmixer_SetError("Failed detecting still queued buffers: %s", |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1818 alGetString(error) ); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1819 retval = -1; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1820 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1821 alGetSourcei( |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1822 ALmixer_Channel_List[i].alsource, |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1823 AL_BUFFERS_PROCESSED, &buffers_processed |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1824 ); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1825 if((error = alGetError()) != AL_NO_ERROR) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1826 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1827 fprintf(stderr, "17Testing Error with buffers_processed: %s", |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1828 alGetString(error)); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1829 ALmixer_SetError("Failed detecting still processed buffers: %s", |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1830 alGetString(error) ); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1831 retval = -1; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1832 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1833 /* If either of these is greater than 0, it means we need |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1834 * to clear the source |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1835 */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1836 if((buffers_still_queued > 0) || (buffers_processed > 0)) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1837 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1838 alSourcei(ALmixer_Channel_List[i].alsource, |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1839 AL_BUFFER, |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1840 AL_NONE); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1841 if((error = alGetError()) != AL_NO_ERROR) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1842 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1843 fprintf(stderr, "17Testing Error with clearing buffer from source: %s", |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1844 alGetString(error)); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1845 ALmixer_SetError("Failed to clear buffer from source: %s", |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1846 alGetString(error) ); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1847 retval = -1; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1848 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1849 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1850 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1851 ALmixer_Channel_List[i].almixer_data->num_buffers_in_use = 0; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1852 |
10
c808684660a7
Bug fix: Moved Invoke_Callback before CleanChannel because I was trying to get the ALmixer_Data pointer, but it was cleared:
Eric Wing <ewing . public |-at-| gmail . com>
parents:
6
diff
changeset
|
1853 /* Launch callback for consistency? */ |
c808684660a7
Bug fix: Moved Invoke_Callback before CleanChannel because I was trying to get the ALmixer_Data pointer, but it was cleared:
Eric Wing <ewing . public |-at-| gmail . com>
parents:
6
diff
changeset
|
1854 Invoke_Channel_Done_Callback(i, did_finish_naturally); |
c808684660a7
Bug fix: Moved Invoke_Callback before CleanChannel because I was trying to get the ALmixer_Data pointer, but it was cleared:
Eric Wing <ewing . public |-at-| gmail . com>
parents:
6
diff
changeset
|
1855 |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1856 Clean_Channel(i); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1857 Is_Playing_global--; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1858 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1859 /* Increment the counter */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1860 counter++; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1861 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1862 /* Let's halt everything just in case there |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1863 * are bugs. |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1864 */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1865 /* |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1866 else |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1867 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1868 alSourceStop(ALmixer_Channel_List[channel].alsource); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1869 / * Can't clean because the in_use counter for |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1870 * data will get messed up * / |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1871 Clean_Channel(channel); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1872 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1873 */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1874 /* Just in case */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1875 Is_Playing_global = 0; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1876 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1877 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1878 if(-1 == retval) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1879 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1880 return -1; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1881 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1882 return counter; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1883 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1884 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1885 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1886 /* Will return the source halted or the total number of channels |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1887 * if all were halted or 0 for error |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1888 */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1889 static ALint Internal_HaltSource(ALuint source, ALboolean did_finish_naturally) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1890 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1891 ALint channel; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1892 if(0 == source) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1893 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1894 /* Will return the number of sources halted */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1895 return Internal_HaltChannel(-1, did_finish_naturally); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1896 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1897 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1898 channel = Internal_GetChannel(source); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1899 if(-1 == channel) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1900 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1901 ALmixer_SetError("Cannot halt source: %s", ALmixer_GetError()); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1902 return -1; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1903 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1904 return Internal_HaltChannel(channel, did_finish_naturally); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1905 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1906 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1907 |
0 | 1908 |
1909 /* Note: Behaves, almost like SDL_mixer, but keep in mind | |
1910 * that there is no "music" channel anymore, so 0 | |
1911 * will remove everything. (Note, I no longer allow 0 | |
1912 * so it gets set to the default number.) | |
1913 * Also, callbacks for deleted channels will not be called. | |
1914 * I really need to do error checking, for realloc and | |
1915 * GenSources, but reversing the damage is too painful | |
1916 * for me to think about at the moment, so it's not in here. | |
1917 */ | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1918 static ALint Internal_AllocateChannels(ALint numchans) |
0 | 1919 { |
1920 ALenum error; | |
1921 int i; | |
1922 /* Return info */ | |
1923 if(numchans < 0) | |
1924 { | |
1925 return Number_of_Channels_global; | |
1926 } | |
1927 if(0 == numchans) | |
1928 { | |
1929 numchans = ALMIXER_DEFAULT_NUM_CHANNELS; | |
1930 } | |
1931 /* No change */ | |
1932 if(numchans == Number_of_Channels_global) | |
1933 { | |
1934 return Number_of_Channels_global; | |
1935 } | |
1936 /* We need to increase the number of channels */ | |
1937 if(numchans > Number_of_Channels_global) | |
1938 { | |
1939 /* Not sure how safe this is, but SDL_mixer does it | |
1940 * the same way */ | |
1941 ALmixer_Channel_List = (struct ALmixer_Channel*) realloc( ALmixer_Channel_List, numchans * sizeof(struct ALmixer_Channel)); | |
1942 | |
1943 /* Allocate memory for the list of sources that map to the channels */ | |
1944 Source_Map_List = (Source_Map*) realloc(Source_Map_List, numchans * sizeof(Source_Map)); | |
1945 | |
1946 for(i=Number_of_Channels_global; i<numchans; i++) | |
1947 { | |
1948 Init_Channel(i); | |
1949 /* Generate a new source and associate it with the channel */ | |
1950 alGenSources(1, &ALmixer_Channel_List[i].alsource); | |
1951 if((error = alGetError()) != AL_NO_ERROR) | |
1952 { | |
1953 fprintf(stderr, "12Testing errpr before unqueue because getting stuff, for OS X this is expected: %s\n", | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1954 alGetString(error)); |
0 | 1955 } |
1956 /* Copy the source so the SourceMap has it too */ | |
1957 Source_Map_List[i].source = ALmixer_Channel_List[i].alsource; | |
1958 Source_Map_List[i].channel = i; | |
1959 /* Clean the channel because there are some things that need to | |
1960 * be done that can't happen until the source is set | |
1961 */ | |
1962 Clean_Channel(i); | |
1963 } | |
1964 | |
1965 /* The Source_Map_List must be sorted by source for binary searches | |
1966 */ | |
1967 qsort(Source_Map_List, numchans, sizeof(Source_Map), Compare_Source_Map); | |
1968 | |
1969 Number_of_Channels_global = numchans; | |
1970 return numchans; | |
1971 } | |
1972 /* Need to remove channels. This might be dangerous */ | |
1973 if(numchans < Number_of_Channels_global) | |
1974 { | |
1975 for(i=numchans; i<Number_of_Channels_global; i++) | |
1976 { | |
1977 /* Halt the channel */ | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1978 Internal_HaltChannel(i, AL_FALSE); |
0 | 1979 |
1980 /* Delete source associated with the channel */ | |
1981 alDeleteSources(1, &ALmixer_Channel_List[i].alsource); | |
1982 if((error = alGetError()) != AL_NO_ERROR) | |
1983 { | |
40
2b0b55b7f8cf
Resync to get interruption changes.
Eric Wing <ewing@anscamobile.com>
parents:
37
diff
changeset
|
1984 fprintf(stderr, "13bTesting error: %s\n", |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
1985 alGetString(error)); |
0 | 1986 } |
1987 } | |
1988 | |
1989 | |
1990 /* Not sure how safe this is, but SDL_mixer does it | |
1991 * the same way */ | |
1992 ALmixer_Channel_List = (struct ALmixer_Channel*) realloc( ALmixer_Channel_List, numchans * sizeof(struct ALmixer_Channel)); | |
1993 | |
1994 /* The tricky part is that we must remove the entries | |
1995 * in the source map that correspond to the deleted channels. | |
1996 * We'll resort the map by channels so we can pick them off | |
1997 * in order. | |
1998 */ | |
1999 qsort(Source_Map_List, Number_of_Channels_global, sizeof(Source_Map), Compare_Source_Map_by_channel); | |
2000 | |
2001 /* Deallocate memory for the list of sources that map to the channels */ | |
2002 Source_Map_List = (Source_Map*) realloc(Source_Map_List, numchans * sizeof(Source_Map)); | |
2003 | |
2004 /* Now resort the map by source and the correct num of chans */ | |
2005 qsort(Source_Map_List, numchans, sizeof(Source_Map), Compare_Source_Map); | |
2006 | |
2007 /* Reset the number of channels */ | |
2008 Number_of_Channels_global = numchans; | |
2009 return numchans; | |
2010 } | |
2011 /* Shouldn't ever reach here */ | |
2012 return -1; | |
2013 | |
2014 } | |
2015 | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2016 static ALint Internal_ReserveChannels(ALint num) |
0 | 2017 { |
2018 /* Can't reserve more than the max num of channels */ | |
2019 /* Actually, I'll allow it for people who just want to | |
2020 * set the value really high to effectively disable | |
2021 * auto-assignment | |
2022 */ | |
2023 | |
2024 /* Return the current number of reserved channels */ | |
2025 if(num < 0) | |
2026 { | |
2027 return Number_of_Reserve_Channels_global; | |
2028 } | |
2029 Number_of_Reserve_Channels_global = num; | |
2030 return Number_of_Reserve_Channels_global; | |
2031 } | |
2032 | |
2033 | |
2034 /* This will rewind the SDL_Sound sample for streamed | |
2035 * samples and start buffering up the data for the next | |
2036 * playback. This may require samples to be halted | |
2037 */ | |
12
bfe90b4f3d87
Bug fixes to FadeIn.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
10
diff
changeset
|
2038 static ALboolean Internal_RewindData(ALmixer_Data* data) |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2039 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2040 ALint retval = 0; |
0 | 2041 /* |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2042 ALint bytes_returned; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2043 ALint i; |
0 | 2044 */ |
2045 if(NULL == data) | |
2046 { | |
2047 ALmixer_SetError("Cannot rewind because data is NULL\n"); | |
12
bfe90b4f3d87
Bug fixes to FadeIn.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
10
diff
changeset
|
2048 return AL_FALSE; |
0 | 2049 } |
2050 | |
2051 | |
2052 /* Might have to require Halt */ | |
2053 /* Okay, we assume Halt or natural stop has already | |
2054 * cleared the data buffers | |
2055 */ | |
2056 if(data->in_use) | |
2057 { | |
6
4b1048af7e55
Disabled some of the debugging printfs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
3
diff
changeset
|
2058 /* |
0 | 2059 fprintf(stderr, "Warning sample is in use. May not be able to rewind\n"); |
6
4b1048af7e55
Disabled some of the debugging printfs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
3
diff
changeset
|
2060 */ |
0 | 2061 /* |
2062 ALmixer_SetError("Data is in use. Cannot rewind unless all sources using the data are halted\n"); | |
2063 return -1; | |
2064 */ | |
2065 } | |
2066 | |
2067 | |
2068 /* Because Seek can alter things even in predecoded data, | |
2069 * decoded data must also be rewound | |
2070 */ | |
2071 if(data->decoded_all) | |
2072 { | |
2073 data->eof = 0; | |
2074 | |
2075 #if 0 | |
2076 #if defined(DISABLE_PREDECODED_SEEK) | |
2077 /* Since we can't seek predecoded stuff, it should be rewound */ | |
12
bfe90b4f3d87
Bug fixes to FadeIn.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
10
diff
changeset
|
2078 return AL_TRUE; |
0 | 2079 #elif !defined(DISABLE_SEEK_MEMORY_OPTIMIZATION) |
2080 /* This case is if the Sound_Sample has been deleted. | |
2081 * It assumes the data is already at the beginning. | |
2082 */ | |
2083 if(NULL == data->sample) | |
2084 { | |
12
bfe90b4f3d87
Bug fixes to FadeIn.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
10
diff
changeset
|
2085 return AL_TRUE; |
0 | 2086 } |
2087 /* Else, the sample has already been reallocated, | |
2088 * and we can fall to normal behavior | |
2089 */ | |
2090 #endif | |
2091 #endif | |
2092 /* If access_data, was enabled, the sound sample | |
2093 * still exists and we can do stuff. | |
2094 * If it's NULL, we can't do anything, but | |
2095 * it should already be "rewound". | |
2096 */ | |
2097 if(NULL == data->sample) | |
2098 { | |
12
bfe90b4f3d87
Bug fixes to FadeIn.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
10
diff
changeset
|
2099 return AL_TRUE; |
0 | 2100 } |
2101 /* Else, the sample has already been reallocated, | |
2102 * and we can fall to normal behavior | |
2103 */ | |
2104 | |
2105 Set_Predecoded_Seek_Position(data, 0); | |
2106 /* | |
2107 return data->total_bytes; | |
2108 */ | |
12
bfe90b4f3d87
Bug fixes to FadeIn.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
10
diff
changeset
|
2109 return AL_TRUE; |
0 | 2110 } |
2111 | |
2112 /* Remaining stuff for streamed data */ | |
2113 | |
2114 data->eof = 0; | |
2115 retval = Sound_Rewind(data->sample); | |
2116 if(0 == retval) | |
2117 { | |
2118 ALmixer_SetError( Sound_GetError() ); | |
12
bfe90b4f3d87
Bug fixes to FadeIn.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
10
diff
changeset
|
2119 return AL_FALSE; |
0 | 2120 } |
2121 #if 0 | |
2122 /* Clear error */ | |
2123 alGetError(); | |
2124 for(i=0; i<data->num_buffers; i++) | |
2125 { | |
2126 bytes_returned = GetMoreData(data, data->buffer[i]); | |
2127 if(-1 == bytes_returned) | |
2128 { | |
12
bfe90b4f3d87
Bug fixes to FadeIn.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
10
diff
changeset
|
2129 return AL_FALSE; |
0 | 2130 } |
2131 else if(0 == bytes_returned) | |
2132 { | |
12
bfe90b4f3d87
Bug fixes to FadeIn.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
10
diff
changeset
|
2133 return AL_FALSE; |
0 | 2134 } |
2135 retval += bytes_returned; | |
2136 | |
2137 } | |
2138 #endif | |
2139 | |
2140 | |
2141 | |
12
bfe90b4f3d87
Bug fixes to FadeIn.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
10
diff
changeset
|
2142 return AL_TRUE; |
0 | 2143 } |
2144 | |
2145 | |
2146 | |
2147 | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2148 static ALint Internal_RewindChannel(ALint channel) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2149 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2150 ALint retval = 0; |
0 | 2151 ALenum error; |
2152 ALint state; | |
12
bfe90b4f3d87
Bug fixes to FadeIn.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
10
diff
changeset
|
2153 ALint running_count = 0; |
0 | 2154 |
2155 if(channel >= Number_of_Channels_global) | |
2156 { | |
2157 ALmixer_SetError("Cannot rewind channel %d because it exceeds maximum number of channels (%d)\n", channel, Number_of_Channels_global); | |
2158 return -1; | |
2159 } | |
2160 | |
2161 if((error = alGetError()) != AL_NO_ERROR) | |
2162 { | |
2163 fprintf(stderr, "24Testing error: %s\n", | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2164 alGetString(error)); |
0 | 2165 } |
2166 /* Clear error */ | |
2167 alGetError(); | |
2168 | |
2169 /* If the user specified a specific channel */ | |
2170 if(channel >= 0) | |
2171 { | |
2172 /* only need to process channel if in use */ | |
2173 if(ALmixer_Channel_List[channel].channel_in_use) | |
2174 { | |
2175 | |
2176 /* What should I do? Do I just rewind the channel | |
2177 * or also rewind the data? Since the data is | |
2178 * shared, let's make it the user's responsibility | |
2179 * to rewind the data. | |
2180 */ | |
2181 if(ALmixer_Channel_List[channel].almixer_data->decoded_all) | |
2182 { | |
2183 alGetSourcei( | |
2184 ALmixer_Channel_List[channel].alsource, | |
2185 AL_SOURCE_STATE, &state | |
2186 ); | |
2187 if((error = alGetError()) != AL_NO_ERROR) | |
2188 { | |
2189 fprintf(stderr, "25Testing error: %s\n", | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2190 alGetString(error)); |
0 | 2191 } |
2192 alSourceRewind(ALmixer_Channel_List[channel].alsource); | |
2193 if((error = alGetError()) != AL_NO_ERROR) | |
2194 { | |
2195 ALmixer_SetError("%s", | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2196 alGetString(error) ); |
0 | 2197 retval = -1; |
2198 } | |
2199 /* Need to resume playback if it was originally playing */ | |
2200 if(AL_PLAYING == state) | |
2201 { | |
2202 alSourcePlay(ALmixer_Channel_List[channel].alsource); | |
2203 if((error = alGetError()) != AL_NO_ERROR) | |
2204 { | |
2205 ALmixer_SetError("%s", | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2206 alGetString(error) ); |
0 | 2207 retval = -1; |
2208 } | |
2209 } | |
2210 else if(AL_PAUSED == state) | |
2211 { | |
2212 /* HACK: The problem is that when paused, after | |
2213 * the Rewind, I can't get it off the INITIAL | |
2214 * state without restarting | |
2215 */ | |
2216 alSourcePlay(ALmixer_Channel_List[channel].alsource); | |
2217 if((error = alGetError()) != AL_NO_ERROR) | |
2218 { | |
2219 fprintf(stderr, "25Testing error: %s\n", | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2220 alGetString(error)); |
0 | 2221 } |
2222 alSourcePause(ALmixer_Channel_List[channel].alsource); | |
2223 if((error = alGetError()) != AL_NO_ERROR) | |
2224 { | |
2225 ALmixer_SetError("%s", | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2226 alGetString(error) ); |
0 | 2227 retval = -1; |
2228 } | |
2229 } | |
2230 } | |
2231 else | |
2232 { | |
2233 /* Streamed data is different. Rewinding the channel | |
2234 * does no good. Rewinding the data will have an | |
2235 * effect, but it will be lagged based on how | |
2236 * much data is queued. Recommend users call Halt | |
2237 * before rewind if they want immediate results. | |
2238 */ | |
2239 retval = Internal_RewindData(ALmixer_Channel_List[channel].almixer_data); | |
2240 } | |
2241 } | |
2242 } | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2243 /* The user wants to rewind all channels */ |
0 | 2244 else |
2245 { | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2246 ALint i; |
0 | 2247 for(i=0; i<Number_of_Channels_global; i++) |
2248 { | |
2249 /* only need to process channel if in use */ | |
2250 if(ALmixer_Channel_List[i].channel_in_use) | |
2251 { | |
2252 /* What should I do? Do I just rewind the channel | |
2253 * or also rewind the data? Since the data is | |
2254 * shared, let's make it the user's responsibility | |
2255 * to rewind the data. | |
2256 */ | |
2257 if(ALmixer_Channel_List[i].almixer_data->decoded_all) | |
2258 { | |
2259 alGetSourcei( | |
2260 ALmixer_Channel_List[i].alsource, | |
2261 AL_SOURCE_STATE, &state | |
2262 ); | |
2263 if((error = alGetError()) != AL_NO_ERROR) | |
2264 { | |
2265 fprintf(stderr, "26Testing error: %s\n", | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2266 alGetString(error)); |
0 | 2267 } |
2268 alSourceRewind(ALmixer_Channel_List[i].alsource); | |
2269 if((error = alGetError()) != AL_NO_ERROR) | |
2270 { | |
2271 ALmixer_SetError("%s", | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2272 alGetString(error) ); |
0 | 2273 retval = -1; |
2274 } | |
2275 /* Need to resume playback if it was originally playing */ | |
2276 if(AL_PLAYING == state) | |
2277 { | |
2278 alSourcePlay(ALmixer_Channel_List[i].alsource); | |
2279 if((error = alGetError()) != AL_NO_ERROR) | |
2280 { | |
2281 ALmixer_SetError("%s", | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2282 alGetString(error) ); |
0 | 2283 retval = -1; |
2284 } | |
2285 } | |
2286 else if(AL_PAUSED == state) | |
2287 { | |
2288 /* HACK: The problem is that when paused, after | |
2289 * the Rewind, I can't get it off the INITIAL | |
2290 * state without restarting | |
2291 */ | |
2292 alSourcePlay(ALmixer_Channel_List[i].alsource); | |
2293 if((error = alGetError()) != AL_NO_ERROR) | |
2294 { | |
2295 fprintf(stderr, "27Testing error: %s\n", | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2296 alGetString(error)); |
0 | 2297 } |
2298 alSourcePause(ALmixer_Channel_List[i].alsource); | |
2299 if((error = alGetError()) != AL_NO_ERROR) | |
2300 { | |
2301 ALmixer_SetError("%s", | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2302 alGetString(error) ); |
0 | 2303 retval = -1; |
2304 } | |
2305 } | |
2306 } | |
2307 else | |
2308 { | |
2309 /* Streamed data is different. Rewinding the channel | |
2310 * does no good. Rewinding the data will have an | |
2311 * effect, but it will be lagged based on how | |
2312 * much data is queued. Recommend users call Halt | |
2313 * before rewind if they want immediate results. | |
2314 */ | |
12
bfe90b4f3d87
Bug fixes to FadeIn.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
10
diff
changeset
|
2315 running_count += Internal_RewindData(ALmixer_Channel_List[i].almixer_data); |
0 | 2316 } |
2317 } | |
2318 } | |
2319 } | |
12
bfe90b4f3d87
Bug fixes to FadeIn.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
10
diff
changeset
|
2320 if(-1 == retval) |
bfe90b4f3d87
Bug fixes to FadeIn.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
10
diff
changeset
|
2321 { |
bfe90b4f3d87
Bug fixes to FadeIn.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
10
diff
changeset
|
2322 return -1; |
bfe90b4f3d87
Bug fixes to FadeIn.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
10
diff
changeset
|
2323 } |
bfe90b4f3d87
Bug fixes to FadeIn.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
10
diff
changeset
|
2324 else |
bfe90b4f3d87
Bug fixes to FadeIn.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
10
diff
changeset
|
2325 { |
bfe90b4f3d87
Bug fixes to FadeIn.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
10
diff
changeset
|
2326 return running_count; |
bfe90b4f3d87
Bug fixes to FadeIn.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
10
diff
changeset
|
2327 } |
bfe90b4f3d87
Bug fixes to FadeIn.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
10
diff
changeset
|
2328 |
0 | 2329 } |
2330 | |
2331 | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2332 static ALint Internal_RewindSource(ALuint source) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2333 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2334 ALint channel; |
0 | 2335 if(0 == source) |
2336 { | |
20
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
2337 return Internal_RewindChannel(-1); |
0 | 2338 } |
2339 | |
2340 channel = Internal_GetChannel(source); | |
2341 if(-1 == channel) | |
2342 { | |
2343 ALmixer_SetError("Cannot rewind source: %s", ALmixer_GetError()); | |
2344 return 0; | |
2345 } | |
20
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
2346 return Internal_RewindChannel(channel); |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2347 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2348 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2349 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2350 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2351 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2352 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2353 static ALint Internal_PlayChannelTimed(ALint channel, ALmixer_Data* data, ALint loops, ALint ticks) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2354 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2355 ALenum error; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2356 int ret_flag = 0; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2357 if(NULL == data) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2358 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2359 ALmixer_SetError("Can't play because data is NULL\n"); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2360 return -1; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2361 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2362 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2363 /* There isn't a good way to share streamed files because |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2364 * the decoded data doesn't stick around. |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2365 * You must "Load" a brand new instance of |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2366 * the data. If you try using the same data, |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2367 * bad things may happen. This check will attempt |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2368 * to prevent sharing |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2369 */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2370 if(0 == data->decoded_all) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2371 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2372 if(data->in_use) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2373 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2374 ALmixer_SetError("Can't play shared streamed sample because it is already in use"); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2375 return -1; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2376 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2377 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2378 /* Make sure SDL_sound sample is not at EOF. |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2379 * This mainly affects streamed files, |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2380 * so the check is placed here |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2381 */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2382 if(data->eof) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2383 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2384 if( -1 == Internal_RewindData(data) ) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2385 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2386 ALmixer_SetError("Can't play sample because it is at EOF and cannot rewind"); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2387 return -1; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2388 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2389 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2390 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2391 /* We need to provide the user with the first available channel */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2392 if(-1 == channel) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2393 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2394 ALint i; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2395 for(i=Number_of_Reserve_Channels_global; i<Number_of_Channels_global; i++) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2396 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2397 if(0 == ALmixer_Channel_List[i].channel_in_use) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2398 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2399 channel = i; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2400 break; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2401 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2402 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2403 /* if we couldn't find a channel, return an error */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2404 if(i == Number_of_Channels_global) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2405 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2406 ALmixer_SetError("No channels available for playing"); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2407 return -1; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2408 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2409 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2410 /* If we didn't assign the channel number, make sure it's not |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2411 * out of bounds or in use */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2412 else |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2413 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2414 if(channel >= Number_of_Channels_global) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2415 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2416 ALmixer_SetError("Requested channel (%d) exceeds maximum channel (%d) because only %d channels are allocated", channel, Number_of_Channels_global-1, Number_of_Channels_global); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2417 return -1; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2418 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2419 else if(ALmixer_Channel_List[channel].channel_in_use) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2420 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2421 ALmixer_SetError("Requested channel (%d) is in use", channel, Number_of_Channels_global-1, Number_of_Channels_global); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2422 return -1; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2423 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2424 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2425 /* Make sure the user doesn't enter some meaningless value */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2426 if(loops < -1) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2427 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2428 loops = -1; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2429 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2430 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2431 /* loops will probably have to change to be controlled by SDL_Sound */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2432 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2433 /* Set up the initial values for playing */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2434 ALmixer_Channel_List[channel].channel_in_use = 1; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2435 data->in_use++; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2436 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2437 /* Shouldn't need updating until a callback is fired |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2438 * (assuming that we call Play in this function |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2439 */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2440 ALmixer_Channel_List[channel].needs_stream = 0; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2441 ALmixer_Channel_List[channel].almixer_data = data; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2442 ALmixer_Channel_List[channel].start_time = ALmixer_GetTicks(); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2443 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2444 /* If user entered -1 (or less), set to -1 */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2445 if(ticks < 0) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2446 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2447 ALmixer_Channel_List[channel].expire_ticks = -1; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2448 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2449 else |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2450 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2451 ALmixer_Channel_List[channel].expire_ticks = ticks; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2452 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2453 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2454 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2455 ALmixer_Channel_List[channel].halted = 0; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2456 ALmixer_Channel_List[channel].paused = 0; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2457 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2458 /* Ran just use OpenAL to control loops if predecoded and infinite */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2459 ALmixer_Channel_List[channel].loops = loops; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2460 if( (-1 == loops) && (data->decoded_all) ) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2461 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2462 alSourcei(ALmixer_Channel_List[channel].alsource, AL_LOOPING, AL_TRUE); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2463 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2464 else |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2465 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2466 alSourcei(ALmixer_Channel_List[channel].alsource, AL_LOOPING, AL_FALSE); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2467 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2468 if((error = alGetError()) != AL_NO_ERROR) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2469 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2470 fprintf(stderr, "13Testing error: %s\n", |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2471 alGetString(error)); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2472 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2473 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2474 #if 0 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2475 /* Because of the corner case, predecoded |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2476 * files must add +1 to the loops. |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2477 * Streams do not have this problem |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2478 * because they can use the eof flag to |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2479 * avoid the conflict. |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2480 * Sharing data chunks prevents the use of the eof flag. |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2481 * Since streams, cannot share, only predecoded |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2482 * files are affected |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2483 */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2484 if(data->decoded_all) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2485 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2486 /* Corner Case: Now that play calls are pushed |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2487 * off to update(), the start call must |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2488 * also come through here. So, start loops |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2489 * must be +1 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2490 */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2491 if(-1 == loops) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2492 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2493 /* -1 is a special case, and you don't want |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2494 * to add +1 to it */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2495 ALmixer_Channel_List[channel].loops = -1; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2496 alSourcei(ALmixer_Channel_List[channel].alsource, AL_LOOPING, AL_TRUE); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2497 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2498 else |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2499 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2500 ALmixer_Channel_List[channel].loops = loops+1; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2501 alSourcei(ALmixer_Channel_List[channel].alsource, AL_LOOPING, AL_FALSE); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2502 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2503 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2504 else |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2505 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2506 ALmixer_Channel_List[channel].loops = loops; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2507 /* Can we really loop on streamed data? */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2508 alSourcei(ALmixer_Channel_List[channel].alsource, AL_LOOPING, AL_TRUE); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2509 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2510 #endif |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2511 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2512 /* Should I start playing here or pass the buck to update? */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2513 /* Unlike SDL_SoundMixer, I think I'll do it here because |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2514 * this library isn't a *total* hack and OpenAL has more |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2515 * built in functionality I need, so less needs to be |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2516 * controlled and directed through the update function. |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2517 * The downside is less functionality is centralized. |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2518 * The upside is that the update function should be |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2519 * easier to maintain. |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2520 */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2521 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2522 /* Clear the error flag */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2523 alGetError(); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2524 if(data->decoded_all) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2525 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2526 /* Bind the data to the source */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2527 alSourcei( |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2528 ALmixer_Channel_List[channel].alsource, |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2529 AL_BUFFER, |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2530 data->buffer[0]); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2531 if((error = alGetError()) != AL_NO_ERROR) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2532 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2533 ALmixer_SetError("Could not bind data to source: %s", |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2534 alGetString(error) ); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2535 Clean_Channel(channel); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2536 return -1; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2537 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2538 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2539 /* Make data available if access_data is enabled */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2540 Invoke_Predecoded_Channel_Data_Callback(channel, data); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2541 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2542 else |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2543 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2544 /* Need to use the streaming buffer for binding */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2545 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2546 ALuint bytes_returned; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2547 ALuint j; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2548 data->num_buffers_in_use=0; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2549 /****** MODIFICATION must go here *********/ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2550 /* Since buffer queuing is pushed off until here to |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2551 * avoid buffer conflicts, we must start reading |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2552 * data here. First we make sure we have at least one |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2553 * packet. Then we queue up until we hit our limit. |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2554 */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2555 bytes_returned = GetMoreData( |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2556 data, |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2557 data->buffer[0]); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2558 if(0 == bytes_returned) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2559 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2560 /* No data or error */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2561 ALmixer_SetError("Could not get data for streamed PlayChannel: %s", ALmixer_GetError()); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2562 Clean_Channel(channel); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2563 return -1; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2564 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2565 /* Increment the number of buffers in use */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2566 data->num_buffers_in_use++; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2567 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2568 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2569 /* Now we need to fill up the rest of the buffers. |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2570 * There is a corner case where we run out of data |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2571 * before the last buffer is filled. |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2572 * Stop conditions are we run out of |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2573 * data or we max out our preload buffers. |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2574 */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2575 |
6
4b1048af7e55
Disabled some of the debugging printfs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
3
diff
changeset
|
2576 /* |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2577 fprintf(stderr, "Filling buffer #%d (AL id is %d)\n", 0, data->buffer[0]); |
6
4b1048af7e55
Disabled some of the debugging printfs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
3
diff
changeset
|
2578 */ |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2579 for(j=1; j<data->num_startup_buffers; j++) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2580 { |
6
4b1048af7e55
Disabled some of the debugging printfs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
3
diff
changeset
|
2581 /* |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2582 fprintf(stderr, "Filling buffer #%d (AL id is %d)\n", j, data->buffer[j]); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2583 fprintf(stderr, ">>>>>>>>>>>>>>>>>>HACK for GetMoreData2\n"); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2584 */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2585 bytes_returned = GetMoreData( |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2586 data, |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2587 data->buffer[j]); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2588 /* |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2589 * This might be a problem. I made a mistake with the types. I accidentally |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2590 * made the bytes returned an ALint and returned -1 on error. |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2591 * Bytes returned should be a ALuint, so now I no longer have a -1 case |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2592 * to check. I hope I didn't break anything here |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2593 */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2594 #if 0 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2595 if(bytes_returned < 0) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2596 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2597 /* Error found */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2598 ALmixer_SetError("Could not get data for additional startup buffers for PlayChannel: %s", ALmixer_GetError()); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2599 /* We'll continue on because we do have some valid data */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2600 ret_flag = -1; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2601 break; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2602 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2603 else if(0 == bytes_returned) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2604 #endif |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2605 if(0 == bytes_returned) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2606 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2607 /* No more data to buffer */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2608 /* Check for loops */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2609 if( ALmixer_Channel_List[channel].loops != 0 ) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2610 { |
6
4b1048af7e55
Disabled some of the debugging printfs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
3
diff
changeset
|
2611 /* |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2612 fprintf(stderr, "Need to rewind. In RAMPUP, handling loop\n"); |
6
4b1048af7e55
Disabled some of the debugging printfs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
3
diff
changeset
|
2613 */ |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2614 if(0 == Sound_Rewind(data->sample)) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2615 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2616 fprintf(stderr, "error in rewind\n"); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2617 ALmixer_SetError( Sound_GetError() ); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2618 ALmixer_Channel_List[channel].loops = 0; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2619 ret_flag = -1; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2620 /* We'll continue on because we do have some valid data */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2621 break; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2622 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2623 /* Remember to reset the data->eof flag */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2624 data->eof = 0; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2625 if(ALmixer_Channel_List[channel].loops > 0) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2626 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2627 ALmixer_Channel_List[channel].loops--; |
6
4b1048af7e55
Disabled some of the debugging printfs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
3
diff
changeset
|
2628 /* |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2629 fprintf(stderr, "Inside 000 >>>>>>>>>>Loops=%d\n", ALmixer_Channel_List[channel].loops); |
6
4b1048af7e55
Disabled some of the debugging printfs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
3
diff
changeset
|
2630 */ |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2631 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2632 /* Would like to redo the loop, but due to |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2633 * Sound_Rewind() bugs, we would risk falling |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2634 * into an infinite loop |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2635 */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2636 bytes_returned = GetMoreData( |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2637 data, |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2638 data->buffer[j]); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2639 if(bytes_returned <= 0) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2640 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2641 ALmixer_SetError("Could not get data: %s", ALmixer_GetError()); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2642 /* We'll continue on because we do have some valid data */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2643 ret_flag = -1; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2644 break; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2645 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2646 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2647 else |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2648 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2649 /* No loops to do so quit here */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2650 break; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2651 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2652 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2653 /* Increment the number of buffers in use */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2654 data->num_buffers_in_use++; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2655 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2656 /* |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2657 fprintf(stderr, "In PlayChannel, about to queue: source=%d, num_buffers_in_use=%d\n", |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2658 ALmixer_Channel_List[channel].alsource, |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2659 data->num_buffers_in_use); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2660 */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2661 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2662 alSourceQueueBuffers( |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2663 ALmixer_Channel_List[channel].alsource, |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2664 data->num_buffers_in_use, |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2665 data->buffer); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2666 if((error = alGetError()) != AL_NO_ERROR) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2667 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2668 ALmixer_SetError("Could not bind data to source: %s", |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2669 alGetString(error) ); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2670 Clean_Channel(channel); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2671 return -1; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2672 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2673 /* This is part of the hideous Nvidia workaround. In order to figure out |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2674 * which buffer to show during callbacks (for things like |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2675 * o-scopes), I must keep a copy of the buffers that are queued in my own |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2676 * data structure. This code will be called only if |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2677 * "access_data" was set, indicated by whether the queue is NULL. |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2678 */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2679 if(data->circular_buffer_queue != NULL) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2680 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2681 ALuint k; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2682 ALuint queue_ret_flag; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2683 for(k=0; k<data->num_buffers_in_use; k++) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2684 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2685 // fprintf(stderr, "56c: CircularQueue_PushBack.\n"); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2686 queue_ret_flag = CircularQueueUnsignedInt_PushBack(data->circular_buffer_queue, data->buffer[k]); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2687 if(0 == queue_ret_flag) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2688 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2689 fprintf(stderr, "Serious internal error: CircularQueue could not push into queue.\n"); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2690 ALmixer_SetError("Serious internal error: CircularQueue failed to push into queue"); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2691 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2692 /* |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2693 else |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2694 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2695 fprintf(stderr, "Queue in PlayTimed\n"); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2696 CircularQueueUnsignedInt_Print(data->circular_buffer_queue); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2697 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2698 */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2699 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2700 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2701 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2702 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2703 /****** END **********/ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2704 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2705 /* We have finished loading the data (predecoded or queued) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2706 * so now we can play |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2707 */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2708 alSourcePlay(ALmixer_Channel_List[channel].alsource); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2709 if((error = alGetError()) != AL_NO_ERROR) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2710 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2711 ALmixer_SetError("Play failed: %s", |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2712 alGetString(error) ); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2713 Clean_Channel(channel); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2714 return -1; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2715 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2716 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2717 /* Add to the counter that something is playing */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2718 Is_Playing_global++; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2719 if(-1 == ret_flag) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2720 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2721 fprintf(stderr, "BACKDOOR ERROR >>>>>>>>>>>>>>>>>>\n"); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2722 return -1; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2723 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2724 return channel; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2725 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2726 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2727 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2728 /* In case the user wants to specify a source instead of a channel, |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2729 * they may use this function. This function will look up the |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2730 * source-to-channel map, and convert the call into a |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2731 * PlayChannelTimed() function call. |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2732 * Returns the channel it's being played on. |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2733 * Note: If you are prefer this method, then you need to be careful |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2734 * about using PlayChannel, particularly if you request the |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2735 * first available channels because source and channels have |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2736 * a one-to-one mapping in this API. It is quite easy for |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2737 * a channel/source to already be in use because of this. |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2738 * In this event, an error message will be returned to you. |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2739 */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2740 static ALuint Internal_PlaySourceTimed(ALuint source, ALmixer_Data* data, ALint loops, ALint ticks) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2741 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2742 ALint channel; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2743 ALint retval; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2744 if(0 == source) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2745 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2746 retval = Internal_PlayChannelTimed(-1, data, loops, ticks); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2747 if(-1 == retval) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2748 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2749 return 0; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2750 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2751 else |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2752 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2753 return Internal_GetSource(retval); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2754 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2755 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2756 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2757 channel = Internal_GetChannel(source); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2758 if(-1 == channel) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2759 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2760 ALmixer_SetError("Cannot Play source: %s", ALmixer_GetError()); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2761 return 0; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2762 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2763 retval = Internal_PlayChannelTimed(channel, data, loops, ticks); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2764 if(-1 == retval) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2765 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2766 return 0; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2767 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2768 else |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2769 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2770 return source; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2771 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2772 /* make compiler happy */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2773 return 0; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2774 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2775 |
0 | 2776 |
2777 | |
2778 | |
2779 /* Returns the channel or number of channels actually paused */ | |
2780 | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2781 static ALint Internal_PauseChannel(ALint channel) |
0 | 2782 { |
2783 ALenum error; | |
2784 ALint state; | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2785 ALint retval = 0; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2786 ALint counter = 0; |
0 | 2787 |
2788 if(channel >= Number_of_Channels_global) | |
2789 { | |
2790 ALmixer_SetError("Cannot pause channel %d because it exceeds maximum number of channels (%d)\n", channel, Number_of_Channels_global); | |
2791 return -1; | |
2792 } | |
2793 | |
2794 if((error = alGetError()) != AL_NO_ERROR) | |
2795 { | |
2796 fprintf(stderr, "28Testing error: %s\n", | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2797 alGetString(error)); |
0 | 2798 } |
2799 /* Clear error */ | |
2800 alGetError(); | |
2801 | |
2802 /* If the user specified a specific channel */ | |
2803 if(channel >= 0) | |
2804 { | |
2805 /* only need to process channel if in use */ | |
2806 if(ALmixer_Channel_List[channel].channel_in_use) | |
2807 { | |
2808 /* We don't want to repause if already | |
2809 * paused because the fadeout/expire | |
2810 * timing will get messed up | |
2811 */ | |
2812 alGetSourcei( | |
2813 ALmixer_Channel_List[channel].alsource, | |
2814 AL_SOURCE_STATE, &state | |
2815 ); | |
2816 if((error = alGetError()) != AL_NO_ERROR) | |
2817 { | |
2818 fprintf(stderr, "29Testing error: %s\n", | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2819 alGetString(error)); |
0 | 2820 } |
2821 if(AL_PLAYING == state) | |
2822 { | |
2823 /* Count the actual number of channels being paused */ | |
2824 counter++; | |
2825 | |
2826 alSourcePause(ALmixer_Channel_List[channel].alsource); | |
2827 if((error = alGetError()) != AL_NO_ERROR) | |
2828 { | |
2829 ALmixer_SetError("%s", | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2830 alGetString(error) ); |
0 | 2831 retval = -1; |
2832 } | |
2833 /* We need to pause the expire time count down */ | |
2834 if(ALmixer_Channel_List[channel].expire_ticks != -1) | |
2835 { | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2836 ALuint current_time = ALmixer_GetTicks(); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2837 ALuint diff_time; |
0 | 2838 diff_time = current_time - |
2839 ALmixer_Channel_List[channel].start_time; | |
2840 /* When we unpause, we will want to reset | |
2841 * the start time so we can continue | |
2842 * to base calculations off GetTicks(). | |
2843 * This means we need to subtract the amount | |
2844 * of time already used up from expire_ticks. | |
2845 */ | |
2846 ALmixer_Channel_List[channel].expire_ticks = | |
2847 ALmixer_Channel_List[channel].expire_ticks - | |
2848 diff_time; | |
2849 /* Because -1 is a special value, we can't | |
2850 * allow the time to go negative | |
2851 */ | |
2852 if(ALmixer_Channel_List[channel].expire_ticks < 0) | |
2853 { | |
2854 ALmixer_Channel_List[channel].expire_ticks = 0; | |
2855 } | |
2856 } | |
2857 /* Do the same as expire time for fading */ | |
2858 if(ALmixer_Channel_List[channel].fade_enabled) | |
2859 { | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2860 ALuint current_time = ALmixer_GetTicks(); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2861 ALuint diff_time; |
0 | 2862 diff_time = current_time - |
2863 ALmixer_Channel_List[channel].fade_start_time; | |
2864 /* When we unpause, we will want to reset | |
2865 * the start time so we can continue | |
2866 * to base calculations off GetTicks(). | |
2867 * This means we need to subtract the amount | |
2868 * of time already used up from expire_ticks. | |
2869 */ | |
2870 ALmixer_Channel_List[channel].fade_expire_ticks = | |
2871 ALmixer_Channel_List[channel].fade_expire_ticks - | |
2872 diff_time; | |
2873 /* Don't allow the time to go negative */ | |
2874 if(ALmixer_Channel_List[channel].expire_ticks < 0) | |
2875 { | |
2876 ALmixer_Channel_List[channel].expire_ticks = 0; | |
2877 } | |
2878 } /* End fade check */ | |
2879 } /* End if PLAYING */ | |
2880 } /* End If in use */ | |
2881 } /* End specific channel */ | |
2882 /* The user wants to halt all channels */ | |
2883 else | |
2884 { | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2885 ALint i; |
0 | 2886 for(i=0; i<Number_of_Channels_global; i++) |
2887 { | |
2888 /* only need to process channel if in use */ | |
2889 if(ALmixer_Channel_List[i].channel_in_use) | |
2890 { | |
2891 /* We don't want to repause if already | |
2892 * paused because the fadeout/expire | |
2893 * timing will get messed up | |
2894 */ | |
2895 alGetSourcei( | |
2896 ALmixer_Channel_List[i].alsource, | |
2897 AL_SOURCE_STATE, &state | |
2898 ); | |
2899 if((error = alGetError()) != AL_NO_ERROR) | |
2900 { | |
2901 fprintf(stderr, "30Testing error: %s\n", | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2902 alGetString(error)); |
0 | 2903 } |
2904 if(AL_PLAYING == state) | |
2905 { | |
2906 /* Count the actual number of channels being paused */ | |
2907 counter++; | |
2908 | |
2909 alSourcePause(ALmixer_Channel_List[i].alsource); | |
2910 if((error = alGetError()) != AL_NO_ERROR) | |
2911 { | |
2912 ALmixer_SetError("%s", | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2913 alGetString(error) ); |
0 | 2914 retval = -1; |
2915 } | |
2916 /* We need to pause the expire time count down */ | |
2917 if(ALmixer_Channel_List[i].expire_ticks != -1) | |
2918 { | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2919 ALuint current_time = ALmixer_GetTicks(); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2920 ALuint diff_time; |
0 | 2921 diff_time = current_time - |
2922 ALmixer_Channel_List[i].start_time; | |
2923 /* When we unpause, we will want to reset | |
2924 * the start time so we can continue | |
2925 * to base calculations off GetTicks(). | |
2926 * This means we need to subtract the amount | |
2927 * of time already used up from expire_ticks. | |
2928 */ | |
2929 ALmixer_Channel_List[i].expire_ticks = | |
2930 ALmixer_Channel_List[i].expire_ticks - | |
2931 diff_time; | |
2932 /* Because -1 is a special value, we can't | |
2933 * allow the time to go negative | |
2934 */ | |
2935 if(ALmixer_Channel_List[i].expire_ticks < 0) | |
2936 { | |
2937 ALmixer_Channel_List[i].expire_ticks = 0; | |
2938 } | |
2939 } | |
2940 /* Do the same as expire time for fading */ | |
2941 if(ALmixer_Channel_List[i].fade_enabled) | |
2942 { | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2943 ALuint current_time = ALmixer_GetTicks(); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2944 ALuint diff_time; |
0 | 2945 diff_time = current_time - |
2946 ALmixer_Channel_List[i].fade_start_time; | |
2947 /* When we unpause, we will want to reset | |
2948 * the start time so we can continue | |
2949 * to base calculations off GetTicks(). | |
2950 * This means we need to subtract the amount | |
2951 * of time already used up from expire_ticks. | |
2952 */ | |
2953 ALmixer_Channel_List[i].fade_expire_ticks = | |
2954 ALmixer_Channel_List[i].fade_expire_ticks - | |
2955 diff_time; | |
2956 /* Don't allow the time to go negative */ | |
2957 if(ALmixer_Channel_List[i].expire_ticks < 0) | |
2958 { | |
2959 ALmixer_Channel_List[i].expire_ticks = 0; | |
2960 } | |
2961 } /* End fade check */ | |
2962 } /* End if PLAYING */ | |
2963 } /* End channel in use */ | |
2964 } /* End for-loop */ | |
2965 } | |
2966 if(-1 == retval) | |
2967 { | |
2968 return -1; | |
2969 } | |
2970 return counter; | |
2971 } | |
2972 | |
2973 /* Returns the channel or number of channels actually paused */ | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2974 static ALint Internal_PauseSource(ALuint source) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2975 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2976 ALint channel; |
0 | 2977 if(0 == source) |
2978 { | |
2979 return Internal_PauseChannel(-1); | |
2980 } | |
2981 | |
2982 channel = Internal_GetChannel(source); | |
2983 if(-1 == channel) | |
2984 { | |
2985 ALmixer_SetError("Cannot pause source: %s", ALmixer_GetError()); | |
2986 return -1; | |
2987 } | |
2988 return Internal_PauseChannel(channel); | |
2989 } | |
2990 | |
2991 | |
2992 | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2993 static ALint Internal_ResumeChannel(ALint channel) |
0 | 2994 { |
2995 ALint state; | |
2996 ALenum error; | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2997 ALint retval = 0; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
2998 ALint counter = 0; |
0 | 2999 |
3000 if(channel >= Number_of_Channels_global) | |
3001 { | |
3002 ALmixer_SetError("Cannot pause channel %d because it exceeds maximum number of channels (%d)\n", channel, Number_of_Channels_global); | |
3003 return -1; | |
3004 } | |
3005 | |
3006 if((error = alGetError()) != AL_NO_ERROR) | |
3007 { | |
3008 fprintf(stderr, "31Testing error: %s\n", | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3009 alGetString(error)); |
0 | 3010 } |
3011 /* Clear error */ | |
3012 alGetError(); | |
3013 | |
3014 /* If the user specified a specific channel */ | |
3015 if(channel >= 0) | |
3016 { | |
3017 /* only need to process channel if in use */ | |
3018 if(ALmixer_Channel_List[channel].channel_in_use) | |
3019 { | |
3020 alGetSourcei( | |
3021 ALmixer_Channel_List[channel].alsource, | |
3022 AL_SOURCE_STATE, &state | |
3023 ); | |
3024 if((error = alGetError()) != AL_NO_ERROR) | |
3025 { | |
3026 fprintf(stderr, "32Testing error: %s\n", | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3027 alGetString(error)); |
0 | 3028 } |
3029 if(AL_PAUSED == state) | |
3030 { | |
3031 /* Count the actual number of channels resumed */ | |
3032 counter++; | |
3033 | |
3034 /* We need to resume the expire time count down */ | |
3035 if(ALmixer_Channel_List[channel].expire_ticks != -1) | |
3036 { | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3037 ALmixer_Channel_List[channel].start_time = ALmixer_GetTicks(); |
0 | 3038 } |
3039 /* Do the same as expire time for fading */ | |
3040 if(ALmixer_Channel_List[channel].fade_enabled) | |
3041 { | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3042 ALmixer_Channel_List[channel].fade_start_time = ALmixer_GetTicks(); |
0 | 3043 } |
3044 | |
3045 alSourcePlay(ALmixer_Channel_List[channel].alsource); | |
3046 if((error = alGetError()) != AL_NO_ERROR) | |
3047 { | |
3048 ALmixer_SetError("%s", | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3049 alGetString(error) ); |
0 | 3050 retval = -1; |
3051 } | |
3052 } | |
3053 } | |
3054 } | |
3055 /* The user wants to halt all channels */ | |
3056 else | |
3057 { | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3058 ALint i; |
0 | 3059 for(i=0; i<Number_of_Channels_global; i++) |
3060 { | |
3061 /* only need to process channel if in use */ | |
3062 if(ALmixer_Channel_List[i].channel_in_use) | |
3063 { | |
3064 alGetSourcei( | |
3065 ALmixer_Channel_List[i].alsource, | |
3066 AL_SOURCE_STATE, &state | |
3067 ); | |
3068 if((error = alGetError()) != AL_NO_ERROR) | |
3069 { | |
3070 fprintf(stderr, "33Testing error: %s\n", | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3071 alGetString(error)); |
0 | 3072 } |
3073 if(AL_PAUSED == state) | |
3074 { | |
3075 /* Count the actual number of channels resumed */ | |
3076 counter++; | |
3077 | |
3078 /* We need to resume the expire time count down */ | |
3079 if(ALmixer_Channel_List[i].expire_ticks != -1) | |
3080 { | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3081 ALmixer_Channel_List[i].start_time = ALmixer_GetTicks(); |
0 | 3082 } |
3083 /* Do the same as expire time for fading */ | |
3084 if(ALmixer_Channel_List[i].fade_enabled) | |
3085 { | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3086 ALmixer_Channel_List[i].fade_start_time = ALmixer_GetTicks(); |
0 | 3087 } |
3088 | |
3089 alSourcePlay(ALmixer_Channel_List[i].alsource); | |
3090 if((error = alGetError()) != AL_NO_ERROR) | |
3091 { | |
3092 ALmixer_SetError("%s", | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3093 alGetString(error) ); |
0 | 3094 retval = -1; |
3095 } | |
3096 } | |
3097 } | |
3098 } | |
3099 } | |
3100 if(-1 == retval) | |
3101 { | |
3102 return -1; | |
3103 } | |
3104 return counter; | |
3105 } | |
3106 | |
3107 | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3108 static ALint Internal_ResumeSource(ALuint source) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3109 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3110 ALint channel; |
0 | 3111 if(0 == source) |
3112 { | |
3113 return Internal_ResumeChannel(-1); | |
3114 } | |
3115 | |
3116 channel = Internal_GetChannel(source); | |
3117 if(-1 == channel) | |
3118 { | |
3119 ALmixer_SetError("Cannot resume source: %s", ALmixer_GetError()); | |
3120 return -1; | |
3121 } | |
3122 return Internal_ResumeChannel(channel); | |
3123 } | |
3124 | |
3125 | |
3126 /* Might consider setting eof to 0 as a "feature" | |
3127 * This will allow seek to end to stay there because | |
3128 * Play automatically rewinds if at the end */ | |
12
bfe90b4f3d87
Bug fixes to FadeIn.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
10
diff
changeset
|
3129 static ALboolean Internal_SeekData(ALmixer_Data* data, ALuint msec) |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3130 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3131 ALint retval; |
0 | 3132 |
3133 if(NULL == data) | |
3134 { | |
3135 ALmixer_SetError("Cannot Seek because data is NULL"); | |
12
bfe90b4f3d87
Bug fixes to FadeIn.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
10
diff
changeset
|
3136 return AL_FALSE; |
0 | 3137 } |
3138 | |
3139 /* Seek for predecoded files involves moving the chunk pointer around */ | |
3140 if(data->decoded_all) | |
3141 { | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3142 ALuint byte_position; |
0 | 3143 |
3144 /* OpenAL doesn't seem to like it if I change the buffer | |
3145 * while playing (crashes), so I must require that Seek only | |
3146 * be done when the data is not in use. | |
3147 * Since data may be shared among multiple sources, | |
3148 * I can't shut them down myself, so I have to return an error. | |
3149 */ | |
3150 if(data->in_use) | |
3151 { | |
3152 ALmixer_SetError("Cannot seek on predecoded data while instances are playing"); | |
12
bfe90b4f3d87
Bug fixes to FadeIn.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
10
diff
changeset
|
3153 return AL_FALSE; |
0 | 3154 } |
3155 #if 0 | |
3156 #if defined(DISABLE_PREDECODED_SEEK) | |
3157 ALmixer_SetError("Seek support for predecoded samples was not compiled in"); | |
12
bfe90b4f3d87
Bug fixes to FadeIn.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
10
diff
changeset
|
3158 return AL_FALSE; |
0 | 3159 |
3160 #elif !defined(DISABLE_SEEK_MEMORY_OPTIMIZATION) | |
3161 /* By default, ALmixer frees the Sound_Sample for predecoded | |
3162 * samples because of the potential memory waste. | |
3163 * However, to seek a sample, we need to have a full | |
3164 * copy of the data around. So the strategy is to | |
3165 * recreate a hackish Sound_Sample to be used for seeking | |
3166 * purposes. If Sound_Sample is NULL, we will reallocate | |
3167 * memory for it and then procede as if everything | |
3168 * was normal. | |
3169 */ | |
3170 if(NULL == data->sample) | |
3171 { | |
3172 if( -1 == Reconstruct_Sound_Sample(data) ) | |
3173 { | |
12
bfe90b4f3d87
Bug fixes to FadeIn.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
10
diff
changeset
|
3174 return AL_FALSE; |
0 | 3175 } |
3176 } | |
3177 #endif | |
3178 #endif | |
3179 /* If access_data was set, then we still have the | |
3180 * Sound_Sample and we can move around in the data. | |
3181 * If it was not set, the data has been freed and we | |
3182 * cannot do anything because there is no way to | |
3183 * recover the data because OpenAL won't let us | |
3184 * get access to the buffers | |
3185 */ | |
3186 if(NULL == data->sample) | |
3187 { | |
3188 ALmixer_SetError("Cannot seek because access_data flag was set false when data was initialized"); | |
12
bfe90b4f3d87
Bug fixes to FadeIn.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
10
diff
changeset
|
3189 return AL_FALSE; |
0 | 3190 } |
3191 | |
3192 byte_position = Convert_Msec_To_Byte_Pos(&data->sample->desired, msec); | |
12
bfe90b4f3d87
Bug fixes to FadeIn.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
10
diff
changeset
|
3193 retval = Set_Predecoded_Seek_Position(data, byte_position); |
bfe90b4f3d87
Bug fixes to FadeIn.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
10
diff
changeset
|
3194 if(-1 == retval) |
bfe90b4f3d87
Bug fixes to FadeIn.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
10
diff
changeset
|
3195 { |
bfe90b4f3d87
Bug fixes to FadeIn.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
10
diff
changeset
|
3196 return AL_FALSE; |
bfe90b4f3d87
Bug fixes to FadeIn.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
10
diff
changeset
|
3197 } |
bfe90b4f3d87
Bug fixes to FadeIn.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
10
diff
changeset
|
3198 else |
bfe90b4f3d87
Bug fixes to FadeIn.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
10
diff
changeset
|
3199 { |
bfe90b4f3d87
Bug fixes to FadeIn.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
10
diff
changeset
|
3200 return AL_TRUE; |
bfe90b4f3d87
Bug fixes to FadeIn.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
10
diff
changeset
|
3201 } |
bfe90b4f3d87
Bug fixes to FadeIn.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
10
diff
changeset
|
3202 |
0 | 3203 } |
3204 else | |
3205 { | |
3206 /* Reset eof flag?? */ | |
3207 data->eof = 0; | |
3208 retval = Sound_Seek(data->sample, msec); | |
3209 if(0 == retval) | |
3210 { | |
3211 ALmixer_SetError(Sound_GetError()); | |
3212 | |
3213 fprintf(stderr, "Sound seek error: %s\n", ALmixer_GetError()); | |
3214 /* Try rewinding to clean up? */ | |
3215 /* | |
3216 Internal_RewindData(data); | |
3217 */ | |
12
bfe90b4f3d87
Bug fixes to FadeIn.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
10
diff
changeset
|
3218 return AL_FALSE; |
bfe90b4f3d87
Bug fixes to FadeIn.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
10
diff
changeset
|
3219 } |
bfe90b4f3d87
Bug fixes to FadeIn.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
10
diff
changeset
|
3220 return AL_TRUE; |
bfe90b4f3d87
Bug fixes to FadeIn.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
10
diff
changeset
|
3221 } |
bfe90b4f3d87
Bug fixes to FadeIn.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
10
diff
changeset
|
3222 |
bfe90b4f3d87
Bug fixes to FadeIn.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
10
diff
changeset
|
3223 return AL_TRUE; |
0 | 3224 } |
3225 | |
3226 | |
20
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3227 static ALint Internal_SeekChannel(ALint channel, ALuint msec) |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3228 { |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3229 ALint retval = 0; |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3230 ALenum error; |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3231 ALint state; |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3232 ALint running_count = 0; |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3233 |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3234 if(0 == msec) |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3235 { |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3236 return Internal_RewindChannel(channel); |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3237 } |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3238 |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3239 if(channel >= Number_of_Channels_global) |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3240 { |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3241 ALmixer_SetError("Cannot seek channel %d because it exceeds maximum number of channels (%d)\n", channel, Number_of_Channels_global); |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3242 return -1; |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3243 } |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3244 |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3245 if((error = alGetError()) != AL_NO_ERROR) |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3246 { |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3247 fprintf(stderr, "24Testing error: %s\n", |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3248 alGetString(error)); |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3249 } |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3250 /* Clear error */ |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3251 alGetError(); |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3252 |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3253 /* If the user specified a specific channel */ |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3254 if(channel >= 0) |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3255 { |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3256 /* only need to process channel if in use */ |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3257 if(ALmixer_Channel_List[channel].channel_in_use) |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3258 { |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3259 |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3260 /* What should I do? Do I just rewind the channel |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3261 * or also rewind the data? Since the data is |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3262 * shared, let's make it the user's responsibility |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3263 * to rewind the data. |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3264 */ |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3265 if(ALmixer_Channel_List[channel].almixer_data->decoded_all) |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3266 { |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3267 /* convert milliseconds to seconds */ |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3268 ALfloat sec_offset = msec / 1000.0f; |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3269 |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3270 alGetSourcei( |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3271 ALmixer_Channel_List[channel].alsource, |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3272 AL_SOURCE_STATE, &state |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3273 ); |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3274 if((error = alGetError()) != AL_NO_ERROR) |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3275 { |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3276 fprintf(stderr, "25Testing error: %s\n", |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3277 alGetString(error)); |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3278 } |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3279 /* OpenAL seek */ |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3280 alSourcef(ALmixer_Channel_List[channel].alsource, AL_SEC_OFFSET, sec_offset); |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3281 if((error = alGetError()) != AL_NO_ERROR) |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3282 { |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3283 ALmixer_SetError("%s", |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3284 alGetString(error) ); |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3285 retval = -1; |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3286 } |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3287 /* Need to resume playback if it was originally playing */ |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3288 if(AL_PLAYING == state) |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3289 { |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3290 alSourcePlay(ALmixer_Channel_List[channel].alsource); |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3291 if((error = alGetError()) != AL_NO_ERROR) |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3292 { |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3293 ALmixer_SetError("%s", |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3294 alGetString(error) ); |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3295 retval = -1; |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3296 } |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3297 } |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3298 else if(AL_PAUSED == state) |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3299 { |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3300 /* HACK: The problem is that when paused, after |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3301 * the Rewind, I can't get it off the INITIAL |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3302 * state without restarting |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3303 */ |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3304 alSourcePlay(ALmixer_Channel_List[channel].alsource); |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3305 if((error = alGetError()) != AL_NO_ERROR) |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3306 { |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3307 fprintf(stderr, "25Testing error: %s\n", |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3308 alGetString(error)); |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3309 } |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3310 alSourcePause(ALmixer_Channel_List[channel].alsource); |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3311 if((error = alGetError()) != AL_NO_ERROR) |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3312 { |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3313 ALmixer_SetError("%s", |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3314 alGetString(error) ); |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3315 retval = -1; |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3316 } |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3317 } |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3318 } |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3319 else |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3320 { |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3321 /* Streamed data is different. Rewinding the channel |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3322 * does no good. Rewinding the data will have an |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3323 * effect, but it will be lagged based on how |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3324 * much data is queued. Recommend users call Halt |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3325 * before rewind if they want immediate results. |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3326 */ |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3327 retval = Internal_SeekData(ALmixer_Channel_List[channel].almixer_data, msec); |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3328 } |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3329 } |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3330 } |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3331 /* The user wants to rewind all channels */ |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3332 else |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3333 { |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3334 ALint i; |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3335 ALfloat sec_offset = msec / 1000.0f; |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3336 |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3337 for(i=0; i<Number_of_Channels_global; i++) |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3338 { |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3339 /* only need to process channel if in use */ |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3340 if(ALmixer_Channel_List[i].channel_in_use) |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3341 { |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3342 /* What should I do? Do I just rewind the channel |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3343 * or also rewind the data? Since the data is |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3344 * shared, let's make it the user's responsibility |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3345 * to rewind the data. |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3346 */ |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3347 if(ALmixer_Channel_List[i].almixer_data->decoded_all) |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3348 { |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3349 alGetSourcei( |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3350 ALmixer_Channel_List[i].alsource, |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3351 AL_SOURCE_STATE, &state |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3352 ); |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3353 if((error = alGetError()) != AL_NO_ERROR) |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3354 { |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3355 fprintf(stderr, "26Testing error: %s\n", |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3356 alGetString(error)); |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3357 } |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3358 |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3359 alSourcef(ALmixer_Channel_List[channel].alsource, AL_SEC_OFFSET, sec_offset); |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3360 if((error = alGetError()) != AL_NO_ERROR) |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3361 { |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3362 ALmixer_SetError("%s", |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3363 alGetString(error) ); |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3364 retval = -1; |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3365 } |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3366 /* Need to resume playback if it was originally playing */ |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3367 if(AL_PLAYING == state) |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3368 { |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3369 alSourcePlay(ALmixer_Channel_List[i].alsource); |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3370 if((error = alGetError()) != AL_NO_ERROR) |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3371 { |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3372 ALmixer_SetError("%s", |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3373 alGetString(error) ); |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3374 retval = -1; |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3375 } |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3376 } |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3377 else if(AL_PAUSED == state) |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3378 { |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3379 /* HACK: The problem is that when paused, after |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3380 * the Rewind, I can't get it off the INITIAL |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3381 * state without restarting |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3382 */ |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3383 alSourcePlay(ALmixer_Channel_List[i].alsource); |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3384 if((error = alGetError()) != AL_NO_ERROR) |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3385 { |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3386 fprintf(stderr, "27Testing error: %s\n", |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3387 alGetString(error)); |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3388 } |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3389 alSourcePause(ALmixer_Channel_List[i].alsource); |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3390 if((error = alGetError()) != AL_NO_ERROR) |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3391 { |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3392 ALmixer_SetError("%s", |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3393 alGetString(error) ); |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3394 retval = -1; |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3395 } |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3396 } |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3397 } |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3398 else |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3399 { |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3400 /* Streamed data is different. Rewinding the channel |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3401 * does no good. Rewinding the data will have an |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3402 * effect, but it will be lagged based on how |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3403 * much data is queued. Recommend users call Halt |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3404 * before rewind if they want immediate results. |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3405 */ |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3406 running_count += Internal_SeekData(ALmixer_Channel_List[i].almixer_data, msec); |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3407 } |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3408 } |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3409 } |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3410 } |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3411 if(-1 == retval) |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3412 { |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3413 return -1; |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3414 } |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3415 else |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3416 { |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3417 return running_count; |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3418 } |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3419 |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3420 } |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3421 |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3422 static ALint Internal_SeekSource(ALuint source, ALuint msec) |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3423 { |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3424 ALint channel; |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3425 if(0 == source) |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3426 { |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3427 return Internal_SeekChannel(-1, msec); |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3428 } |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3429 |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3430 channel = Internal_GetChannel(source); |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3431 if(-1 == channel) |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3432 { |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3433 ALmixer_SetError("Cannot seek source: %s", ALmixer_GetError()); |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3434 return 0; |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3435 } |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3436 return Internal_SeekChannel(channel, msec); |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3437 } |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3438 |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
3439 |
0 | 3440 |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3441 static ALint Internal_FadeInChannelTimed(ALint channel, ALmixer_Data* data, ALint loops, ALuint fade_ticks, ALint expire_ticks) |
0 | 3442 { |
3443 ALfloat value; | |
3444 ALenum error; | |
3445 ALfloat original_value; | |
24
e085cbc573cf
iOS optimization/bug/workaround.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
22
diff
changeset
|
3446 /* ALuint current_time = ALmixer_GetTicks(); */ |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3447 ALint retval; |
0 | 3448 |
3449 | |
3450 | |
3451 if(channel >= Number_of_Channels_global) | |
3452 { | |
3453 ALmixer_SetError("Requested channel (%d) exceeds maximum channel (%d) because only %d channels are allocated", channel, Number_of_Channels_global-1, Number_of_Channels_global); | |
3454 return -1; | |
3455 } | |
3456 /* Let's call PlayChannelTimed to do the job. | |
3457 * There are two catches: | |
3458 * First is that we must set the volumes before the play call(s). | |
3459 * Second is that we must initialize the channel values | |
3460 */ | |
3461 | |
3462 if(channel < 0) | |
3463 { | |
3464 /* This might cause a problem for threads/race conditions. | |
3465 * We need to set the volume on an unknown channel, | |
3466 * so we need to request a channel first. Remember | |
3467 * that requesting a channel doesn't lock and it | |
3468 * could be surrendered to somebody else before we claim it. | |
3469 */ | |
3470 channel = Internal_GetChannel(0); | |
3471 if(-1 == channel) | |
3472 { | |
3473 return -1; | |
3474 } | |
3475 } | |
3476 else if(ALmixer_Channel_List[channel].channel_in_use) | |
3477 { | |
3478 ALmixer_SetError("Channel %d is already in use", channel); | |
3479 return -1; | |
3480 } | |
3481 | |
3482 | |
3483 /* Get the original volume in case of a problem */ | |
3484 alGetSourcef(ALmixer_Channel_List[channel].alsource, | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3485 AL_GAIN, &original_value); |
0 | 3486 |
3487 if((error = alGetError()) != AL_NO_ERROR) | |
3488 { | |
3489 fprintf(stderr, "35Testing error: %s\n", | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3490 alGetString(error)); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3491 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3492 ALmixer_Channel_List[channel].fade_end_volume = original_value; |
0 | 3493 |
3494 /* Get the Min volume */ | |
3495 alGetSourcef(ALmixer_Channel_List[channel].alsource, | |
3496 AL_MIN_GAIN, &value); | |
3497 if((error = alGetError()) != AL_NO_ERROR) | |
3498 { | |
3499 fprintf(stderr, "36Testing error: %s\n", | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3500 alGetString(error)); |
0 | 3501 } |
3502 ALmixer_Channel_List[channel].fade_start_volume = value; | |
3503 | |
3504 /* Set the actual volume */ | |
3505 alSourcef(ALmixer_Channel_List[channel].alsource, | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3506 AL_GAIN, value); |
0 | 3507 if((error = alGetError()) != AL_NO_ERROR) |
3508 { | |
3509 fprintf(stderr, "37Testing error: %s\n", | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3510 alGetString(error)); |
0 | 3511 } |
3512 | |
3513 | |
3514 /* Now call PlayChannelTimed */ | |
3515 retval = Internal_PlayChannelTimed(channel, data, loops, expire_ticks); | |
3516 if(-1 == retval) | |
3517 { | |
3518 /* Chance of failure is actually pretty high since | |
3519 * a channel might already be in use or streamed | |
3520 * data can be shared | |
3521 */ | |
3522 /* Restore the original value to avoid accidental | |
3523 * distruption of playback | |
3524 */ | |
3525 alSourcef(ALmixer_Channel_List[channel].alsource, | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3526 AL_GAIN, original_value); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3527 if((error = alGetError()) != AL_NO_ERROR) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3528 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3529 fprintf(stderr, "38Testing error: %s\n", |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3530 alGetString(error)); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3531 } |
0 | 3532 return retval; |
3533 } | |
3534 | |
3535 /* We can't accept 0 as a value because of div-by-zero. | |
3536 * If zero, just call PlayChannelTimed at normal | |
3537 * volume | |
3538 */ | |
3539 if(0 == fade_ticks) | |
3540 { | |
3541 alSourcef(ALmixer_Channel_List[channel].alsource, | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3542 AL_GAIN, |
0 | 3543 ALmixer_Channel_List[channel].fade_end_volume |
3544 ); | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3545 if((error = alGetError()) != AL_NO_ERROR) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3546 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3547 fprintf(stderr, "39Testing error: %s\n", |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3548 alGetString(error)); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3549 } |
0 | 3550 |
3551 return retval; | |
3552 } | |
3553 | |
3554 /* Enable fading effects via the flag */ | |
3555 ALmixer_Channel_List[channel].fade_enabled = 1; | |
3556 /* Set fade start time */ | |
3557 ALmixer_Channel_List[channel].fade_start_time | |
3558 = ALmixer_Channel_List[channel].start_time; | |
3559 /* Set the fade expire ticks */ | |
3560 ALmixer_Channel_List[channel].fade_expire_ticks = fade_ticks; | |
3561 | |
3562 /* Set 1/(endtime-starttime) or 1/deltaT */ | |
3563 ALmixer_Channel_List[channel].fade_inv_time = 1.0f / fade_ticks; | |
3564 | |
3565 return retval; | |
3566 | |
3567 } | |
3568 | |
3569 | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3570 static ALuint Internal_FadeInSourceTimed(ALuint source, ALmixer_Data* data, ALint loops, ALuint fade_ticks, ALint expire_ticks) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3571 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3572 ALint channel; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3573 ALint retval; |
0 | 3574 if(0 == source) |
3575 { | |
3576 retval = Internal_FadeInChannelTimed(-1, data, loops, fade_ticks, expire_ticks); | |
3577 if(-1 == retval) | |
3578 { | |
3579 return 0; | |
3580 } | |
3581 else | |
3582 { | |
3583 return Internal_GetSource(retval); | |
3584 } | |
3585 } | |
3586 | |
3587 channel = Internal_GetChannel(source); | |
3588 if(-1 == channel) | |
3589 { | |
3590 ALmixer_SetError("Cannot FadeIn source: %s", ALmixer_GetError()); | |
3591 return 0; | |
3592 } | |
3593 retval = Internal_FadeInChannelTimed(channel, data, loops, fade_ticks, expire_ticks); | |
3594 if(-1 == retval) | |
3595 { | |
3596 return 0; | |
3597 } | |
3598 else | |
3599 { | |
3600 return source; | |
3601 } | |
3602 /* make compiler happy */ | |
3603 return 0; | |
3604 } | |
3605 | |
3606 | |
3607 | |
3608 | |
3609 /* Will fade out currently playing channels. | |
3610 * It starts at the current volume level and goes down */ | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3611 static ALint Internal_FadeOutChannel(ALint channel, ALuint ticks) |
0 | 3612 { |
3613 ALfloat value; | |
3614 ALenum error; | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3615 ALuint current_time = ALmixer_GetTicks(); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3616 ALuint counter = 0; |
0 | 3617 |
3618 /* We can't accept 0 as a value because of div-by-zero. | |
3619 * If zero, just call Halt at normal | |
3620 * volume | |
3621 */ | |
3622 if(0 == ticks) | |
3623 { | |
10
c808684660a7
Bug fix: Moved Invoke_Callback before CleanChannel because I was trying to get the ALmixer_Data pointer, but it was cleared:
Eric Wing <ewing . public |-at-| gmail . com>
parents:
6
diff
changeset
|
3624 return Internal_HaltChannel(channel, AL_FALSE); |
0 | 3625 } |
3626 | |
3627 | |
3628 if(channel >= Number_of_Channels_global) | |
3629 { | |
3630 ALmixer_SetError("Requested channel (%d) exceeds maximum channel (%d) because only %d channels are allocated", channel, Number_of_Channels_global-1, Number_of_Channels_global); | |
3631 return -1; | |
3632 } | |
3633 | |
3634 if(channel >= 0) | |
3635 { | |
3636 if(ALmixer_Channel_List[channel].channel_in_use) | |
3637 { | |
3638 /* Get the current volume */ | |
3639 alGetSourcef(ALmixer_Channel_List[channel].alsource, | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3640 AL_GAIN, &value); |
0 | 3641 ALmixer_Channel_List[channel].fade_start_volume = value; |
3642 if((error = alGetError()) != AL_NO_ERROR) | |
3643 { | |
3644 fprintf(stderr, "40Testing error: %s\n", | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3645 alGetString(error)); |
0 | 3646 } |
3647 | |
3648 /* Get the Min volume */ | |
3649 alGetSourcef(ALmixer_Channel_List[channel].alsource, | |
3650 AL_MIN_GAIN, &value); | |
3651 if((error = alGetError()) != AL_NO_ERROR) | |
3652 { | |
3653 fprintf(stderr, "41Testing error: %s\n", | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3654 alGetString(error)); |
0 | 3655 } |
3656 ALmixer_Channel_List[channel].fade_end_volume = value; | |
3657 | |
3658 /* Set expire start time */ | |
3659 ALmixer_Channel_List[channel].start_time = current_time; | |
3660 /* Set the expire ticks */ | |
3661 ALmixer_Channel_List[channel].expire_ticks = ticks; | |
3662 /* Set fade start time */ | |
3663 ALmixer_Channel_List[channel].fade_start_time = current_time; | |
3664 /* Set the fade expire ticks */ | |
3665 ALmixer_Channel_List[channel].fade_expire_ticks = ticks; | |
3666 /* Enable fading effects via the flag */ | |
3667 ALmixer_Channel_List[channel].fade_enabled = 1; | |
3668 | |
3669 /* Set 1/(endtime-starttime) or 1/deltaT */ | |
3670 ALmixer_Channel_List[channel].fade_inv_time = 1.0f / ticks; | |
3671 | |
3672 counter++; | |
3673 } | |
3674 } | |
3675 /* Else need to fade out all channels */ | |
3676 else | |
3677 { | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3678 ALint i; |
0 | 3679 for(i=0; i<Number_of_Channels_global; i++) |
3680 { | |
3681 if(ALmixer_Channel_List[i].channel_in_use) | |
3682 { | |
3683 /* Get the current volume */ | |
3684 alGetSourcef(ALmixer_Channel_List[i].alsource, | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3685 AL_GAIN, &value); |
0 | 3686 ALmixer_Channel_List[i].fade_start_volume = value; |
3687 if((error = alGetError()) != AL_NO_ERROR) | |
3688 { | |
3689 fprintf(stderr, "42Testing error: %s\n", | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3690 alGetString(error)); |
0 | 3691 } |
3692 | |
3693 /* Get the Min volume */ | |
3694 alGetSourcef(ALmixer_Channel_List[i].alsource, | |
3695 AL_MIN_GAIN, &value); | |
3696 if((error = alGetError()) != AL_NO_ERROR) | |
3697 { | |
3698 fprintf(stderr, "43Testing error: %s\n", | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3699 alGetString(error)); |
0 | 3700 } |
3701 ALmixer_Channel_List[i].fade_end_volume = value; | |
3702 | |
3703 /* Set expire start time */ | |
3704 ALmixer_Channel_List[i].start_time = current_time; | |
3705 /* Set the expire ticks */ | |
3706 ALmixer_Channel_List[i].expire_ticks = ticks; | |
3707 /* Set fade start time */ | |
3708 ALmixer_Channel_List[i].fade_start_time = current_time; | |
3709 /* Set the fade expire ticks */ | |
3710 ALmixer_Channel_List[i].fade_expire_ticks = ticks; | |
3711 /* Enable fading effects via the flag */ | |
3712 ALmixer_Channel_List[i].fade_enabled = 1; | |
3713 | |
3714 /* Set 1/(endtime-starttime) or 1/deltaT */ | |
3715 ALmixer_Channel_List[i].fade_inv_time = 1.0f / ticks; | |
3716 | |
3717 counter++; | |
3718 } | |
3719 } /* End for loop */ | |
3720 } | |
3721 return counter; | |
3722 } | |
3723 | |
3724 | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3725 static ALint Internal_FadeOutSource(ALuint source, ALuint ticks) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3726 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3727 ALint channel; |
0 | 3728 if(0 == source) |
3729 { | |
3730 return Internal_FadeOutChannel(-1, ticks); | |
3731 } | |
3732 | |
3733 channel = Internal_GetChannel(source); | |
3734 if(-1 == channel) | |
3735 { | |
3736 ALmixer_SetError("Cannot FadeOut source: %s", ALmixer_GetError()); | |
3737 return -1; | |
3738 } | |
3739 return Internal_FadeOutChannel(channel, ticks); | |
3740 } | |
3741 | |
3742 | |
3743 /* Will fade currently playing channels. | |
3744 * It starts at the current volume level and go to target | |
3745 * Only affects channels that are playing | |
3746 */ | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3747 static ALint Internal_FadeChannel(ALint channel, ALuint ticks, ALfloat volume) |
0 | 3748 { |
3749 ALfloat value; | |
3750 ALenum error; | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3751 ALuint current_time = ALmixer_GetTicks(); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3752 ALuint counter = 0; |
0 | 3753 |
3754 if(channel >= Number_of_Channels_global) | |
3755 { | |
3756 ALmixer_SetError("Requested channel (%d) exceeds maximum channel (%d) because only %d channels are allocated", channel, Number_of_Channels_global-1, Number_of_Channels_global); | |
3757 return -1; | |
3758 } | |
3759 | |
3760 if(channel >= 0) | |
3761 { | |
3762 if(volume < ALmixer_Channel_List[channel].min_volume) | |
3763 { | |
3764 volume = ALmixer_Channel_List[channel].min_volume; | |
3765 } | |
3766 else if(volume > ALmixer_Channel_List[channel].max_volume) | |
3767 { | |
3768 volume = ALmixer_Channel_List[channel].max_volume; | |
3769 } | |
3770 | |
3771 if(ALmixer_Channel_List[channel].channel_in_use) | |
3772 { | |
3773 if(ticks > 0) | |
3774 { | |
3775 /* Get the current volume */ | |
3776 alGetSourcef(ALmixer_Channel_List[channel].alsource, | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3777 AL_GAIN, &value); |
0 | 3778 if((error = alGetError()) != AL_NO_ERROR) |
3779 { | |
3780 fprintf(stderr, "44Testing error: %s\n", | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3781 alGetString(error)); |
0 | 3782 } |
3783 ALmixer_Channel_List[channel].fade_start_volume = value; | |
3784 | |
3785 /* Set the target volume */ | |
3786 ALmixer_Channel_List[channel].fade_end_volume = volume; | |
3787 | |
3788 /* Set fade start time */ | |
3789 ALmixer_Channel_List[channel].fade_start_time = current_time; | |
3790 /* Set the fade expire ticks */ | |
3791 ALmixer_Channel_List[channel].fade_expire_ticks = ticks; | |
3792 /* Enable fading effects via the flag */ | |
3793 ALmixer_Channel_List[channel].fade_enabled = 1; | |
3794 | |
3795 /* Set 1/(endtime-starttime) or 1/deltaT */ | |
3796 ALmixer_Channel_List[channel].fade_inv_time = 1.0f / ticks; | |
3797 } | |
3798 else | |
3799 { | |
3800 alSourcef(ALmixer_Channel_List[channel].alsource, | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3801 AL_GAIN, volume); |
0 | 3802 if((error = alGetError()) != AL_NO_ERROR) |
3803 { | |
3804 fprintf(stderr, "45Testing error: %s\n", | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3805 alGetString(error)); |
0 | 3806 } |
3807 } | |
3808 counter++; | |
3809 } | |
3810 } | |
3811 /* Else need to fade out all channels */ | |
3812 else | |
3813 { | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3814 ALint i; |
0 | 3815 for(i=0; i<Number_of_Channels_global; i++) |
3816 { | |
3817 if(volume < ALmixer_Channel_List[i].min_volume) | |
3818 { | |
3819 volume = ALmixer_Channel_List[i].min_volume; | |
3820 } | |
3821 else if(volume > ALmixer_Channel_List[i].max_volume) | |
3822 { | |
3823 volume = ALmixer_Channel_List[i].max_volume; | |
3824 } | |
3825 | |
3826 if(ALmixer_Channel_List[i].channel_in_use) | |
3827 { | |
3828 if(ticks > 0) | |
3829 { | |
3830 /* Get the current volume */ | |
3831 alGetSourcef(ALmixer_Channel_List[i].alsource, | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3832 AL_GAIN, &value); |
0 | 3833 if((error = alGetError()) != AL_NO_ERROR) |
3834 { | |
3835 fprintf(stderr, "46Testing error: %s\n", | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3836 alGetString(error)); |
0 | 3837 } |
3838 ALmixer_Channel_List[i].fade_start_volume = value; | |
3839 | |
3840 /* Set target volume */ | |
3841 ALmixer_Channel_List[i].fade_end_volume = volume; | |
3842 | |
3843 /* Set fade start time */ | |
3844 ALmixer_Channel_List[i].fade_start_time = current_time; | |
3845 /* Set the fade expire ticks */ | |
3846 ALmixer_Channel_List[i].fade_expire_ticks = ticks; | |
3847 /* Enable fading effects via the flag */ | |
3848 ALmixer_Channel_List[i].fade_enabled = 1; | |
3849 | |
3850 /* Set 1/(endtime-starttime) or 1/deltaT */ | |
3851 ALmixer_Channel_List[i].fade_inv_time = 1.0f / ticks; | |
3852 } | |
3853 else | |
3854 { | |
3855 alSourcef(ALmixer_Channel_List[i].alsource, | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3856 AL_GAIN, volume); |
0 | 3857 if((error = alGetError()) != AL_NO_ERROR) |
3858 { | |
3859 fprintf(stderr, "47Testing error: %s\n", | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3860 alGetString(error)); |
0 | 3861 } |
3862 } | |
3863 counter++; | |
3864 } | |
3865 } /* End for loop */ | |
3866 } | |
3867 return counter; | |
3868 } | |
3869 | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3870 static ALint Internal_FadeSource(ALuint source, ALuint ticks, ALfloat volume) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3871 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3872 ALint channel; |
0 | 3873 if(0 == source) |
3874 { | |
3875 return Internal_FadeChannel(-1, ticks, volume); | |
3876 } | |
3877 | |
3878 channel = Internal_GetChannel(source); | |
3879 if(-1 == channel) | |
3880 { | |
3881 ALmixer_SetError("Cannot Fade source: %s", ALmixer_GetError()); | |
3882 return -1; | |
3883 } | |
3884 return Internal_FadeChannel(channel, ticks, volume); | |
3885 } | |
3886 | |
3887 | |
3888 | |
3889 | |
3890 /* Set a volume regardless if it's in use or not. | |
3891 */ | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3892 static ALboolean Internal_SetVolumeChannel(ALint channel, ALfloat volume) |
0 | 3893 { |
3894 ALenum error; | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3895 ALboolean retval = AL_TRUE; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3896 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3897 if(channel >= Number_of_Channels_global) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3898 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3899 ALmixer_SetError("Requested channel (%d) exceeds maximum channel (%d) because only %d channels are allocated", channel, Number_of_Channels_global-1, Number_of_Channels_global); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3900 return AL_FALSE; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3901 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3902 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3903 if(channel >= 0) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3904 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3905 if(volume < 0.0f) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3906 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3907 volume = 0.0f; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3908 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3909 else if(volume > 1.0f) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3910 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3911 volume = 1.0f; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3912 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3913 alSourcef(ALmixer_Channel_List[channel].alsource, |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3914 AL_GAIN, volume); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3915 if((error = alGetError()) != AL_NO_ERROR) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3916 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3917 ALmixer_SetError("%s", |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3918 alGetString(error) ); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3919 retval = AL_FALSE; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3920 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3921 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3922 else |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3923 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3924 ALint i; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3925 for(i=0; i<Number_of_Channels_global; i++) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3926 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3927 if(volume < 0.0f) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3928 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3929 volume = 0.0f; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3930 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3931 else if(volume > 1.0f) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3932 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3933 volume = 1.0f; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3934 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3935 alSourcef(ALmixer_Channel_List[i].alsource, |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3936 AL_GAIN, volume); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3937 if((error = alGetError()) != AL_NO_ERROR) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3938 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3939 ALmixer_SetError("%s", |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3940 alGetString(error) ); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3941 retval = AL_FALSE; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3942 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3943 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3944 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3945 return retval; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3946 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3947 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3948 static ALboolean Internal_SetVolumeSource(ALuint source, ALfloat volume) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3949 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3950 ALint channel; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3951 if(0 == source) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3952 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3953 return Internal_SetVolumeChannel(-1, volume); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3954 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3955 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3956 channel = Internal_GetChannel(source); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3957 if(-1 == channel) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3958 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3959 ALmixer_SetError("Cannot SetMaxVolume: %s", ALmixer_GetError()); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3960 return AL_FALSE; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3961 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3962 return Internal_SetVolumeChannel(channel, volume); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3963 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3964 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3965 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3966 static ALfloat Internal_GetVolumeChannel(ALint channel) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3967 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3968 ALfloat value; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3969 ALenum error; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3970 ALfloat running_total = 0.0f; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3971 ALfloat retval = 0.0f; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3972 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3973 if(channel >= Number_of_Channels_global) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3974 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3975 ALmixer_SetError("Requested channel (%d) exceeds maximum channel (%d) because only %d channels are allocated", channel, Number_of_Channels_global-1, Number_of_Channels_global); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3976 return -1.0f; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3977 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3978 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3979 if(channel >= 0) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3980 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3981 alGetSourcef(ALmixer_Channel_List[channel].alsource, |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3982 AL_GAIN, &value); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3983 if((error = alGetError()) != AL_NO_ERROR) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3984 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3985 ALmixer_SetError("%s", alGetString(error) ); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3986 retval = -1.0f; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3987 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3988 else |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3989 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3990 retval = value; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3991 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3992 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3993 else |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3994 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3995 ALint i; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3996 for(i=0; i<Number_of_Channels_global; i++) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3997 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3998 alGetSourcef(ALmixer_Channel_List[i].alsource, |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
3999 AL_GAIN, &value); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4000 if((error = alGetError()) != AL_NO_ERROR) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4001 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4002 ALmixer_SetError("%s", alGetString(error) ); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4003 retval = -1; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4004 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4005 else |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4006 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4007 running_total += value; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4008 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4009 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4010 if(0 == Number_of_Channels_global) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4011 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4012 ALmixer_SetError("No channels are allocated"); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4013 retval = -1.0f; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4014 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4015 else |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4016 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4017 retval = running_total / Number_of_Channels_global; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4018 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4019 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4020 return retval; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4021 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4022 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4023 static ALfloat Internal_GetVolumeSource(ALuint source) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4024 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4025 ALint channel; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4026 if(0 == source) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4027 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4028 return Internal_GetVolumeChannel(-1); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4029 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4030 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4031 channel = Internal_GetChannel(source); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4032 if(-1 == channel) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4033 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4034 ALmixer_SetError("Cannot GetVolume: %s", ALmixer_GetError()); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4035 return -1.0f; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4036 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4037 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4038 return Internal_GetVolumeChannel(channel); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4039 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4040 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4041 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4042 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4043 /* Set a volume regardless if it's in use or not. |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4044 */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4045 static ALboolean Internal_SetMaxVolumeChannel(ALint channel, ALfloat volume) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4046 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4047 ALenum error; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4048 ALboolean retval = AL_TRUE; |
0 | 4049 |
4050 if(channel >= Number_of_Channels_global) | |
4051 { | |
4052 ALmixer_SetError("Requested channel (%d) exceeds maximum channel (%d) because only %d channels are allocated", channel, Number_of_Channels_global-1, Number_of_Channels_global); | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4053 return AL_FALSE; |
0 | 4054 } |
4055 | |
4056 if(channel >= 0) | |
4057 { | |
4058 if(volume < 0.0f) | |
4059 { | |
4060 volume = 0.0f; | |
4061 } | |
4062 else if(volume > 1.0f) | |
4063 { | |
4064 volume = 1.0f; | |
4065 } | |
4066 ALmixer_Channel_List[channel].max_volume = volume; | |
4067 alSourcef(ALmixer_Channel_List[channel].alsource, | |
4068 AL_MAX_GAIN, volume); | |
4069 if((error = alGetError()) != AL_NO_ERROR) | |
4070 { | |
4071 ALmixer_SetError("%s", | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4072 alGetString(error) ); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4073 retval = AL_FALSE; |
0 | 4074 } |
4075 if(ALmixer_Channel_List[channel].max_volume < ALmixer_Channel_List[channel].min_volume) | |
4076 { | |
4077 ALmixer_Channel_List[channel].min_volume = volume; | |
4078 alSourcef(ALmixer_Channel_List[channel].alsource, | |
4079 AL_MIN_GAIN, volume); | |
4080 if((error = alGetError()) != AL_NO_ERROR) | |
4081 { | |
4082 ALmixer_SetError("%s", | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4083 alGetString(error) ); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4084 retval = AL_FALSE; |
0 | 4085 } |
4086 } | |
4087 } | |
4088 else | |
4089 { | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4090 ALint i; |
0 | 4091 for(i=0; i<Number_of_Channels_global; i++) |
4092 { | |
4093 if(volume < 0.0f) | |
4094 { | |
4095 volume = 0.0f; | |
4096 } | |
4097 else if(volume > 1.0f) | |
4098 { | |
4099 volume = 1.0f; | |
4100 } | |
4101 ALmixer_Channel_List[i].max_volume = volume; | |
4102 alSourcef(ALmixer_Channel_List[i].alsource, | |
4103 AL_MAX_GAIN, volume); | |
4104 if((error = alGetError()) != AL_NO_ERROR) | |
4105 { | |
4106 ALmixer_SetError("%s", | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4107 alGetString(error) ); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4108 retval = AL_FALSE; |
0 | 4109 } |
4110 if(ALmixer_Channel_List[i].max_volume < ALmixer_Channel_List[i].min_volume) | |
4111 { | |
4112 ALmixer_Channel_List[i].min_volume = volume; | |
4113 alSourcef(ALmixer_Channel_List[i].alsource, | |
4114 AL_MIN_GAIN, volume); | |
4115 if((error = alGetError()) != AL_NO_ERROR) | |
4116 { | |
4117 ALmixer_SetError("%s", | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4118 alGetString(error) ); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4119 retval = AL_FALSE; |
0 | 4120 } |
4121 } | |
4122 } | |
4123 } | |
4124 return retval; | |
4125 } | |
4126 | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4127 static ALint Internal_SetMaxVolumeSource(ALuint source, ALfloat volume) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4128 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4129 ALint channel; |
0 | 4130 if(0 == source) |
4131 { | |
4132 return Internal_SetMaxVolumeChannel(-1, volume); | |
4133 } | |
4134 | |
4135 channel = Internal_GetChannel(source); | |
4136 if(-1 == channel) | |
4137 { | |
4138 ALmixer_SetError("Cannot SetMaxVolume: %s", ALmixer_GetError()); | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4139 return AL_FALSE; |
0 | 4140 } |
4141 return Internal_SetMaxVolumeChannel(channel, volume); | |
4142 } | |
4143 | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4144 static ALfloat Internal_GetMaxVolumeChannel(ALint channel) |
0 | 4145 { |
4146 /* | |
4147 ALfloat value; | |
4148 ALenum error; | |
4149 */ | |
4150 ALfloat running_total = 0.0f; | |
4151 ALfloat retval = 0.0f; | |
4152 | |
4153 if(channel >= Number_of_Channels_global) | |
4154 { | |
4155 ALmixer_SetError("Requested channel (%d) exceeds maximum channel (%d) because only %d channels are allocated", channel, Number_of_Channels_global-1, Number_of_Channels_global); | |
4156 return -1.0f; | |
4157 } | |
4158 | |
4159 if(channel >= 0) | |
4160 { | |
4161 /* | |
4162 alGetSourcef(ALmixer_Channel_List[channel].alsource, | |
4163 AL_GAIN, &value); | |
4164 if((error = alGetError()) != AL_NO_ERROR) | |
4165 { | |
4166 ALmixer_SetError("%s", | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4167 alGetString(error) ); |
0 | 4168 retval = -1.0f; |
4169 } | |
4170 else | |
4171 { | |
4172 retval = value; | |
4173 } | |
4174 */ | |
4175 retval = ALmixer_Channel_List[channel].max_volume; | |
4176 | |
4177 } | |
4178 else | |
4179 { | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4180 ALint i; |
0 | 4181 for(i=0; i<Number_of_Channels_global; i++) |
4182 { | |
4183 /* | |
4184 alGetSourcef(ALmixer_Channel_List[i].alsource, | |
4185 AL_GAIN, &value); | |
4186 if((error = alGetError()) != AL_NO_ERROR) | |
4187 { | |
4188 ALmixer_SetError("%s", | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4189 alGetString(error) ); |
0 | 4190 retval = -1; |
4191 } | |
4192 else | |
4193 { | |
4194 running_total += value; | |
4195 } | |
4196 */ | |
4197 running_total += ALmixer_Channel_List[i].max_volume; | |
4198 } | |
4199 if(0 == Number_of_Channels_global) | |
4200 { | |
4201 ALmixer_SetError("No channels are allocated"); | |
4202 retval = -1.0f; | |
4203 } | |
4204 else | |
4205 { | |
4206 retval = running_total / Number_of_Channels_global; | |
4207 } | |
4208 } | |
4209 return retval; | |
4210 } | |
4211 | |
4212 static ALfloat Internal_GetMaxVolumeSource(ALuint source) | |
4213 { | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4214 ALint channel; |
0 | 4215 if(0 == source) |
4216 { | |
4217 return Internal_GetMaxVolumeChannel(-1); | |
4218 } | |
4219 | |
4220 channel = Internal_GetChannel(source); | |
4221 if(-1 == channel) | |
4222 { | |
4223 ALmixer_SetError("Cannot GetVolume: %s", ALmixer_GetError()); | |
4224 return -1.0f; | |
4225 } | |
4226 | |
4227 return Internal_GetMaxVolumeChannel(channel); | |
4228 } | |
4229 | |
4230 | |
4231 /* Set a volume regardless if it's in use or not. | |
4232 */ | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4233 static ALboolean Internal_SetMinVolumeChannel(ALint channel, ALfloat volume) |
0 | 4234 { |
4235 ALenum error; | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4236 ALboolean retval = AL_TRUE; |
0 | 4237 |
4238 if(channel >= Number_of_Channels_global) | |
4239 { | |
4240 ALmixer_SetError("Requested channel (%d) exceeds maximum channel (%d) because only %d channels are allocated", channel, Number_of_Channels_global-1, Number_of_Channels_global); | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4241 return AL_FALSE; |
0 | 4242 } |
4243 | |
4244 if(channel >= 0) | |
4245 { | |
4246 if(volume < 0.0f) | |
4247 { | |
4248 volume = 0.0f; | |
4249 } | |
4250 else if(volume > 1.0f) | |
4251 { | |
4252 volume = 1.0f; | |
4253 } | |
4254 ALmixer_Channel_List[channel].min_volume = volume; | |
4255 alSourcef(ALmixer_Channel_List[channel].alsource, | |
4256 AL_MIN_GAIN, volume); | |
4257 if((error = alGetError()) != AL_NO_ERROR) | |
4258 { | |
4259 ALmixer_SetError("%s", | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4260 alGetString(error) ); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4261 retval = AL_FALSE; |
0 | 4262 } |
4263 if(ALmixer_Channel_List[channel].max_volume < ALmixer_Channel_List[channel].min_volume) | |
4264 { | |
4265 ALmixer_Channel_List[channel].max_volume = volume; | |
4266 alSourcef(ALmixer_Channel_List[channel].alsource, | |
4267 AL_MAX_GAIN, volume); | |
4268 if((error = alGetError()) != AL_NO_ERROR) | |
4269 { | |
4270 ALmixer_SetError("%s", | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4271 alGetString(error) ); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4272 retval = AL_FALSE; |
0 | 4273 } |
4274 } | |
4275 } | |
4276 else | |
4277 { | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4278 ALint i; |
0 | 4279 for(i=0; i<Number_of_Channels_global; i++) |
4280 { | |
4281 if(volume < 0.0f) | |
4282 { | |
4283 volume = 0.0f; | |
4284 } | |
4285 else if(volume > 1.0f) | |
4286 { | |
4287 volume = 1.0f; | |
4288 } | |
4289 ALmixer_Channel_List[i].min_volume = volume; | |
4290 alSourcef(ALmixer_Channel_List[i].alsource, | |
4291 AL_MIN_GAIN, volume); | |
4292 if((error = alGetError()) != AL_NO_ERROR) | |
4293 { | |
4294 ALmixer_SetError("%s", | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4295 alGetString(error) ); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4296 retval = AL_FALSE; |
0 | 4297 } |
4298 if(ALmixer_Channel_List[i].max_volume < ALmixer_Channel_List[i].min_volume) | |
4299 { | |
4300 ALmixer_Channel_List[i].max_volume = volume; | |
4301 alSourcef(ALmixer_Channel_List[i].alsource, | |
4302 AL_MAX_GAIN, volume); | |
4303 if((error = alGetError()) != AL_NO_ERROR) | |
4304 { | |
4305 ALmixer_SetError("%s", | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4306 alGetString(error) ); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4307 retval = AL_FALSE; |
0 | 4308 } |
4309 } | |
4310 } | |
4311 } | |
4312 return retval; | |
4313 } | |
4314 | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4315 static ALboolean Internal_SetMinVolumeSource(ALuint source, ALfloat volume) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4316 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4317 ALint channel; |
0 | 4318 if(0 == source) |
4319 { | |
4320 return Internal_SetMinVolumeChannel(-1, volume); | |
4321 } | |
4322 | |
4323 channel = Internal_GetChannel(source); | |
4324 if(-1 == channel) | |
4325 { | |
4326 ALmixer_SetError("Cannot SetMaxVolume: %s", ALmixer_GetError()); | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4327 return AL_FALSE; |
0 | 4328 } |
4329 return Internal_SetMinVolumeChannel(channel, volume); | |
4330 } | |
4331 | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4332 static ALfloat Internal_GetMinVolumeChannel(ALint channel) |
0 | 4333 { |
4334 /* | |
4335 ALfloat value; | |
4336 ALenum error; | |
4337 */ | |
4338 ALfloat running_total = 0.0f; | |
4339 ALfloat retval = 0.0f; | |
4340 | |
4341 if(channel >= Number_of_Channels_global) | |
4342 { | |
4343 ALmixer_SetError("Requested channel (%d) exceeds maximum channel (%d) because only %d channels are allocated", channel, Number_of_Channels_global-1, Number_of_Channels_global); | |
4344 return -1.0f; | |
4345 } | |
4346 | |
4347 if(channel >= 0) | |
4348 { | |
4349 /* | |
4350 alGetSourcef(ALmixer_Channel_List[channel].alsource, | |
4351 AL_GAIN, &value); | |
4352 if((error = alGetError()) != AL_NO_ERROR) | |
4353 { | |
4354 ALmixer_SetError("%s", | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4355 alGetString(error) ); |
0 | 4356 retval = -1.0f; |
4357 } | |
4358 else | |
4359 { | |
4360 retval = value; | |
4361 } | |
4362 */ | |
4363 retval = ALmixer_Channel_List[channel].min_volume; | |
4364 | |
4365 } | |
4366 else | |
4367 { | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4368 ALint i; |
0 | 4369 for(i=0; i<Number_of_Channels_global; i++) |
4370 { | |
4371 /* | |
4372 alGetSourcef(ALmixer_Channel_List[i].alsource, | |
4373 AL_GAIN, &value); | |
4374 if((error = alGetError()) != AL_NO_ERROR) | |
4375 { | |
4376 ALmixer_SetError("%s", | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4377 alGetString(error) ); |
0 | 4378 retval = -1; |
4379 } | |
4380 else | |
4381 { | |
4382 running_total += value; | |
4383 } | |
4384 */ | |
4385 running_total += ALmixer_Channel_List[i].min_volume; | |
4386 } | |
4387 if(0 == Number_of_Channels_global) | |
4388 { | |
4389 ALmixer_SetError("No channels are allocated"); | |
4390 retval = -1.0f; | |
4391 } | |
4392 else | |
4393 { | |
4394 retval = running_total / Number_of_Channels_global; | |
4395 } | |
4396 } | |
4397 return retval; | |
4398 } | |
4399 | |
4400 static ALfloat Internal_GetMinVolumeSource(ALuint source) | |
4401 { | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4402 ALint channel; |
0 | 4403 if(0 == source) |
4404 { | |
4405 return Internal_GetMinVolumeChannel(-1); | |
4406 } | |
4407 | |
4408 channel = Internal_GetChannel(source); | |
4409 if(-1 == channel) | |
4410 { | |
4411 ALmixer_SetError("Cannot GetVolume: %s", ALmixer_GetError()); | |
4412 return -1.0f; | |
4413 } | |
4414 | |
4415 return Internal_GetMinVolumeChannel(channel); | |
4416 } | |
4417 | |
4418 | |
4419 /* Changes the listener volume */ | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4420 static ALboolean Internal_SetMasterVolume(ALfloat volume) |
0 | 4421 { |
4422 ALenum error; | |
4423 alListenerf(AL_GAIN, volume); | |
4424 if((error = alGetError()) != AL_NO_ERROR) | |
4425 { | |
4426 ALmixer_SetError("%s", | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4427 alGetString(error) ); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4428 return AL_FALSE; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4429 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4430 return AL_TRUE; |
0 | 4431 } |
4432 | |
4433 static ALfloat Internal_GetMasterVolume() | |
4434 { | |
4435 ALenum error; | |
4436 ALfloat volume; | |
4437 alGetListenerf(AL_GAIN, &volume); | |
4438 if((error = alGetError()) != AL_NO_ERROR) | |
4439 { | |
4440 ALmixer_SetError("%s", | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4441 alGetString(error) ); |
0 | 4442 return -1.0f; |
4443 } | |
4444 return volume; | |
4445 } | |
4446 | |
4447 | |
4448 | |
4449 | |
4450 /* Will fade out currently playing channels. | |
4451 * It starts at the current volume level and goes down */ | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4452 static ALint Internal_ExpireChannel(ALint channel, ALint ticks) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4453 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4454 ALuint current_time = ALmixer_GetTicks(); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4455 ALuint counter = 0; |
0 | 4456 |
4457 /* We can't accept 0 as a value because of div-by-zero. | |
4458 * If zero, just call Halt at normal | |
4459 * volume | |
4460 */ | |
4461 if(0 == ticks) | |
4462 { | |
10
c808684660a7
Bug fix: Moved Invoke_Callback before CleanChannel because I was trying to get the ALmixer_Data pointer, but it was cleared:
Eric Wing <ewing . public |-at-| gmail . com>
parents:
6
diff
changeset
|
4463 return Internal_HaltChannel(channel, AL_FALSE); |
0 | 4464 } |
4465 if(ticks < -1) | |
4466 { | |
4467 ticks = -1; | |
4468 } | |
4469 | |
4470 | |
4471 if(channel >= Number_of_Channels_global) | |
4472 { | |
4473 ALmixer_SetError("Requested channel (%d) exceeds maximum channel (%d) because only %d channels are allocated", channel, Number_of_Channels_global-1, Number_of_Channels_global); | |
4474 return -1; | |
4475 } | |
4476 | |
4477 if(channel >= 0) | |
4478 { | |
4479 if(ALmixer_Channel_List[channel].channel_in_use) | |
4480 { | |
4481 /* Set expire start time */ | |
4482 ALmixer_Channel_List[channel].start_time = current_time; | |
4483 /* Set the expire ticks */ | |
4484 ALmixer_Channel_List[channel].expire_ticks = ticks; | |
4485 | |
4486 counter++; | |
4487 } | |
4488 } | |
4489 /* Else need to fade out all channels */ | |
4490 else | |
4491 { | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4492 ALint i; |
0 | 4493 for(i=0; i<Number_of_Channels_global; i++) |
4494 { | |
4495 if(ALmixer_Channel_List[i].channel_in_use) | |
4496 { | |
4497 /* Set expire start time */ | |
4498 ALmixer_Channel_List[i].start_time = current_time; | |
4499 /* Set the expire ticks */ | |
4500 ALmixer_Channel_List[i].expire_ticks = ticks; | |
4501 | |
4502 counter++; | |
4503 } | |
4504 } /* End for loop */ | |
4505 } | |
4506 return counter; | |
4507 } | |
4508 | |
4509 | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4510 static ALint Internal_ExpireSource(ALuint source, ALint ticks) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4511 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4512 ALint channel; |
0 | 4513 if(0 == source) |
4514 { | |
4515 return Internal_ExpireChannel(-1, ticks); | |
4516 } | |
4517 | |
4518 channel = Internal_GetChannel(source); | |
4519 if(-1 == channel) | |
4520 { | |
4521 ALmixer_SetError("Cannot Expire source: %s", ALmixer_GetError()); | |
4522 return -1; | |
4523 } | |
4524 return Internal_ExpireChannel(channel, ticks); | |
4525 } | |
4526 | |
4527 | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4528 static ALint Internal_QueryChannel(ALint channel) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4529 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4530 ALint i; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4531 ALint counter = 0; |
0 | 4532 if(channel >= Number_of_Channels_global) |
4533 { | |
4534 ALmixer_SetError("Invalid channel: %d", channel); | |
4535 return -1; | |
4536 } | |
4537 | |
4538 if(channel >= 0) | |
4539 { | |
4540 return ALmixer_Channel_List[channel].channel_in_use; | |
4541 } | |
4542 | |
4543 /* Else, return the number of channels in use */ | |
4544 for(i=0; i<Number_of_Channels_global; i++) | |
4545 { | |
4546 if(ALmixer_Channel_List[i].channel_in_use) | |
4547 { | |
4548 counter++; | |
4549 } | |
4550 } | |
4551 return counter; | |
4552 } | |
4553 | |
4554 | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4555 static ALint Internal_QuerySource(ALuint source) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4556 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4557 ALint channel; |
0 | 4558 if(0 == source) |
4559 { | |
4560 return Internal_QueryChannel(-1); | |
4561 } | |
4562 | |
4563 channel = Internal_GetChannel(source); | |
4564 if(-1 == channel) | |
4565 { | |
4566 ALmixer_SetError("Cannot query source: %s", ALmixer_GetError()); | |
4567 return -1; | |
4568 } | |
4569 | |
4570 return Internal_QueryChannel(channel); | |
4571 } | |
4572 | |
4573 | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4574 static ALuint Internal_CountUnreservedUsedChannels() |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4575 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4576 ALint i; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4577 ALuint counter = 0; |
0 | 4578 |
4579 | |
4580 /* Else, return the number of channels in use */ | |
4581 for(i=Number_of_Reserve_Channels_global; i<Number_of_Channels_global; i++) | |
4582 { | |
4583 if(ALmixer_Channel_List[i].channel_in_use) | |
4584 { | |
4585 counter++; | |
4586 } | |
4587 } | |
4588 return counter; | |
4589 } | |
4590 | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4591 static ALuint Internal_CountUnreservedFreeChannels() |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4592 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4593 ALint i; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4594 ALuint counter = 0; |
0 | 4595 |
4596 | |
4597 /* Else, return the number of channels in use */ | |
4598 for(i=Number_of_Reserve_Channels_global; i<Number_of_Channels_global; i++) | |
4599 { | |
4600 if( ! ALmixer_Channel_List[i].channel_in_use) | |
4601 { | |
4602 counter++; | |
4603 } | |
4604 } | |
4605 return counter; | |
4606 } | |
4607 | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4608 static ALuint Internal_CountAllUsedChannels() |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4609 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4610 ALint i; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4611 ALuint counter = 0; |
0 | 4612 |
4613 | |
4614 /* Else, return the number of channels in use */ | |
4615 for(i=0; i<Number_of_Channels_global; i++) | |
4616 { | |
4617 if(ALmixer_Channel_List[i].channel_in_use) | |
4618 { | |
4619 counter++; | |
4620 } | |
4621 } | |
4622 return counter; | |
4623 } | |
4624 | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4625 static ALuint Internal_CountAllFreeChannels() |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4626 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4627 ALint i; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4628 ALuint counter = 0; |
0 | 4629 |
4630 | |
4631 /* Else, return the number of channels in use */ | |
4632 for(i=0; i<Number_of_Channels_global; i++) | |
4633 { | |
4634 if( ! ALmixer_Channel_List[i].channel_in_use) | |
4635 { | |
4636 counter++; | |
4637 } | |
4638 } | |
4639 return counter; | |
4640 } | |
4641 | |
4642 | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4643 static ALint Internal_PlayingChannel(ALint channel) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4644 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4645 ALint i; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4646 ALint counter = 0; |
0 | 4647 ALint state; |
4648 | |
4649 if(channel >= Number_of_Channels_global) | |
4650 { | |
4651 ALmixer_SetError("Invalid channel: %d", channel); | |
4652 return -1; | |
4653 } | |
4654 | |
4655 if(channel >= 0) | |
4656 { | |
4657 if(ALmixer_Channel_List[channel].channel_in_use) | |
4658 { | |
4659 alGetSourcei( | |
4660 ALmixer_Channel_List[channel].alsource, | |
4661 AL_SOURCE_STATE, &state | |
4662 ); | |
4663 if(AL_PLAYING == state) | |
4664 { | |
4665 return 1; | |
4666 } | |
4667 } | |
4668 return 0; | |
4669 } | |
4670 | |
4671 /* Else, return the number of channels in use */ | |
4672 for(i=0; i<Number_of_Channels_global; i++) | |
4673 { | |
4674 if(ALmixer_Channel_List[i].channel_in_use) | |
4675 { | |
4676 alGetSourcei( | |
4677 ALmixer_Channel_List[i].alsource, | |
4678 AL_SOURCE_STATE, &state | |
4679 ); | |
4680 if(AL_PLAYING == state) | |
4681 { | |
4682 counter++; | |
4683 } | |
4684 } | |
4685 } | |
4686 return counter; | |
4687 } | |
4688 | |
4689 | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4690 static ALint Internal_PlayingSource(ALuint source) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4691 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4692 ALint channel; |
0 | 4693 if(0 == source) |
4694 { | |
4695 return Internal_PlayingChannel(-1); | |
4696 } | |
4697 | |
4698 channel = Internal_GetChannel(source); | |
4699 if(-1 == channel) | |
4700 { | |
4701 ALmixer_SetError("Cannot query source: %s", ALmixer_GetError()); | |
4702 return -1; | |
4703 } | |
4704 | |
4705 return Internal_PlayingChannel(channel); | |
4706 } | |
4707 | |
4708 | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4709 static ALint Internal_PausedChannel(ALint channel) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4710 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4711 ALint i; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4712 ALint counter = 0; |
0 | 4713 ALint state; |
4714 | |
4715 if(channel >= Number_of_Channels_global) | |
4716 { | |
4717 ALmixer_SetError("Invalid channel: %d", channel); | |
4718 return -1; | |
4719 } | |
4720 | |
4721 if(channel >= 0) | |
4722 { | |
4723 if(ALmixer_Channel_List[channel].channel_in_use) | |
4724 { | |
4725 alGetSourcei( | |
4726 ALmixer_Channel_List[channel].alsource, | |
4727 AL_SOURCE_STATE, &state | |
4728 ); | |
4729 if(AL_PAUSED == state) | |
4730 { | |
4731 return 1; | |
4732 } | |
4733 } | |
4734 return 0; | |
4735 } | |
4736 | |
4737 /* Else, return the number of channels in use */ | |
4738 for(i=0; i<Number_of_Channels_global; i++) | |
4739 { | |
4740 if(ALmixer_Channel_List[i].channel_in_use) | |
4741 { | |
4742 alGetSourcei( | |
4743 ALmixer_Channel_List[i].alsource, | |
4744 AL_SOURCE_STATE, &state | |
4745 ); | |
4746 if(AL_PAUSED == state) | |
4747 { | |
4748 counter++; | |
4749 } | |
4750 } | |
4751 } | |
4752 return counter; | |
4753 } | |
4754 | |
4755 | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4756 static ALint Internal_PausedSource(ALuint source) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4757 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4758 ALint channel; |
0 | 4759 if(0 == source) |
4760 { | |
4761 return Internal_PausedChannel(-1); | |
4762 } | |
4763 | |
4764 channel = Internal_GetChannel(source); | |
4765 if(-1 == channel) | |
4766 { | |
4767 ALmixer_SetError("Cannot query source: %s", ALmixer_GetError()); | |
4768 return -1; | |
4769 } | |
4770 | |
4771 return Internal_PausedChannel(channel); | |
4772 } | |
4773 | |
4774 | |
4775 | |
37
b346b6608eab
Fixed memory leak in Quit due to changes related to background thread removal. FreeData was quick escaping because it checked for ALmixer_Initialized which is now false by the time the code is reached.
Eric Wing <ewing@anscamobile.com>
parents:
36
diff
changeset
|
4776 static void Internal_FreeData(ALmixer_Data* data) |
b346b6608eab
Fixed memory leak in Quit due to changes related to background thread removal. FreeData was quick escaping because it checked for ALmixer_Initialized which is now false by the time the code is reached.
Eric Wing <ewing@anscamobile.com>
parents:
36
diff
changeset
|
4777 { |
b346b6608eab
Fixed memory leak in Quit due to changes related to background thread removal. FreeData was quick escaping because it checked for ALmixer_Initialized which is now false by the time the code is reached.
Eric Wing <ewing@anscamobile.com>
parents:
36
diff
changeset
|
4778 ALenum error; |
b346b6608eab
Fixed memory leak in Quit due to changes related to background thread removal. FreeData was quick escaping because it checked for ALmixer_Initialized which is now false by the time the code is reached.
Eric Wing <ewing@anscamobile.com>
parents:
36
diff
changeset
|
4779 if(NULL == data) |
b346b6608eab
Fixed memory leak in Quit due to changes related to background thread removal. FreeData was quick escaping because it checked for ALmixer_Initialized which is now false by the time the code is reached.
Eric Wing <ewing@anscamobile.com>
parents:
36
diff
changeset
|
4780 { |
b346b6608eab
Fixed memory leak in Quit due to changes related to background thread removal. FreeData was quick escaping because it checked for ALmixer_Initialized which is now false by the time the code is reached.
Eric Wing <ewing@anscamobile.com>
parents:
36
diff
changeset
|
4781 return; |
b346b6608eab
Fixed memory leak in Quit due to changes related to background thread removal. FreeData was quick escaping because it checked for ALmixer_Initialized which is now false by the time the code is reached.
Eric Wing <ewing@anscamobile.com>
parents:
36
diff
changeset
|
4782 } |
b346b6608eab
Fixed memory leak in Quit due to changes related to background thread removal. FreeData was quick escaping because it checked for ALmixer_Initialized which is now false by the time the code is reached.
Eric Wing <ewing@anscamobile.com>
parents:
36
diff
changeset
|
4783 |
b346b6608eab
Fixed memory leak in Quit due to changes related to background thread removal. FreeData was quick escaping because it checked for ALmixer_Initialized which is now false by the time the code is reached.
Eric Wing <ewing@anscamobile.com>
parents:
36
diff
changeset
|
4784 if(data->decoded_all) |
b346b6608eab
Fixed memory leak in Quit due to changes related to background thread removal. FreeData was quick escaping because it checked for ALmixer_Initialized which is now false by the time the code is reached.
Eric Wing <ewing@anscamobile.com>
parents:
36
diff
changeset
|
4785 { |
b346b6608eab
Fixed memory leak in Quit due to changes related to background thread removal. FreeData was quick escaping because it checked for ALmixer_Initialized which is now false by the time the code is reached.
Eric Wing <ewing@anscamobile.com>
parents:
36
diff
changeset
|
4786 /* If access_data was enabled, then the Sound_Sample* |
b346b6608eab
Fixed memory leak in Quit due to changes related to background thread removal. FreeData was quick escaping because it checked for ALmixer_Initialized which is now false by the time the code is reached.
Eric Wing <ewing@anscamobile.com>
parents:
36
diff
changeset
|
4787 * still exists. We need to free it |
b346b6608eab
Fixed memory leak in Quit due to changes related to background thread removal. FreeData was quick escaping because it checked for ALmixer_Initialized which is now false by the time the code is reached.
Eric Wing <ewing@anscamobile.com>
parents:
36
diff
changeset
|
4788 */ |
b346b6608eab
Fixed memory leak in Quit due to changes related to background thread removal. FreeData was quick escaping because it checked for ALmixer_Initialized which is now false by the time the code is reached.
Eric Wing <ewing@anscamobile.com>
parents:
36
diff
changeset
|
4789 if(data->sample != NULL) |
b346b6608eab
Fixed memory leak in Quit due to changes related to background thread removal. FreeData was quick escaping because it checked for ALmixer_Initialized which is now false by the time the code is reached.
Eric Wing <ewing@anscamobile.com>
parents:
36
diff
changeset
|
4790 { |
b346b6608eab
Fixed memory leak in Quit due to changes related to background thread removal. FreeData was quick escaping because it checked for ALmixer_Initialized which is now false by the time the code is reached.
Eric Wing <ewing@anscamobile.com>
parents:
36
diff
changeset
|
4791 Sound_FreeSample(data->sample); |
b346b6608eab
Fixed memory leak in Quit due to changes related to background thread removal. FreeData was quick escaping because it checked for ALmixer_Initialized which is now false by the time the code is reached.
Eric Wing <ewing@anscamobile.com>
parents:
36
diff
changeset
|
4792 } |
b346b6608eab
Fixed memory leak in Quit due to changes related to background thread removal. FreeData was quick escaping because it checked for ALmixer_Initialized which is now false by the time the code is reached.
Eric Wing <ewing@anscamobile.com>
parents:
36
diff
changeset
|
4793 alDeleteBuffers(1, data->buffer); |
b346b6608eab
Fixed memory leak in Quit due to changes related to background thread removal. FreeData was quick escaping because it checked for ALmixer_Initialized which is now false by the time the code is reached.
Eric Wing <ewing@anscamobile.com>
parents:
36
diff
changeset
|
4794 if((error = alGetError()) != AL_NO_ERROR) |
b346b6608eab
Fixed memory leak in Quit due to changes related to background thread removal. FreeData was quick escaping because it checked for ALmixer_Initialized which is now false by the time the code is reached.
Eric Wing <ewing@anscamobile.com>
parents:
36
diff
changeset
|
4795 { |
b346b6608eab
Fixed memory leak in Quit due to changes related to background thread removal. FreeData was quick escaping because it checked for ALmixer_Initialized which is now false by the time the code is reached.
Eric Wing <ewing@anscamobile.com>
parents:
36
diff
changeset
|
4796 fprintf(stderr, "ALmixer_FreeData: alDeleteBuffers failed. %s\n", alGetString(error)); |
b346b6608eab
Fixed memory leak in Quit due to changes related to background thread removal. FreeData was quick escaping because it checked for ALmixer_Initialized which is now false by the time the code is reached.
Eric Wing <ewing@anscamobile.com>
parents:
36
diff
changeset
|
4797 } |
b346b6608eab
Fixed memory leak in Quit due to changes related to background thread removal. FreeData was quick escaping because it checked for ALmixer_Initialized which is now false by the time the code is reached.
Eric Wing <ewing@anscamobile.com>
parents:
36
diff
changeset
|
4798 } |
b346b6608eab
Fixed memory leak in Quit due to changes related to background thread removal. FreeData was quick escaping because it checked for ALmixer_Initialized which is now false by the time the code is reached.
Eric Wing <ewing@anscamobile.com>
parents:
36
diff
changeset
|
4799 else |
b346b6608eab
Fixed memory leak in Quit due to changes related to background thread removal. FreeData was quick escaping because it checked for ALmixer_Initialized which is now false by the time the code is reached.
Eric Wing <ewing@anscamobile.com>
parents:
36
diff
changeset
|
4800 { |
b346b6608eab
Fixed memory leak in Quit due to changes related to background thread removal. FreeData was quick escaping because it checked for ALmixer_Initialized which is now false by the time the code is reached.
Eric Wing <ewing@anscamobile.com>
parents:
36
diff
changeset
|
4801 ALuint i; |
b346b6608eab
Fixed memory leak in Quit due to changes related to background thread removal. FreeData was quick escaping because it checked for ALmixer_Initialized which is now false by the time the code is reached.
Eric Wing <ewing@anscamobile.com>
parents:
36
diff
changeset
|
4802 |
b346b6608eab
Fixed memory leak in Quit due to changes related to background thread removal. FreeData was quick escaping because it checked for ALmixer_Initialized which is now false by the time the code is reached.
Eric Wing <ewing@anscamobile.com>
parents:
36
diff
changeset
|
4803 /* Delete buffer copies if access_data was enabled */ |
b346b6608eab
Fixed memory leak in Quit due to changes related to background thread removal. FreeData was quick escaping because it checked for ALmixer_Initialized which is now false by the time the code is reached.
Eric Wing <ewing@anscamobile.com>
parents:
36
diff
changeset
|
4804 if(data->buffer_map_list != NULL) |
b346b6608eab
Fixed memory leak in Quit due to changes related to background thread removal. FreeData was quick escaping because it checked for ALmixer_Initialized which is now false by the time the code is reached.
Eric Wing <ewing@anscamobile.com>
parents:
36
diff
changeset
|
4805 { |
b346b6608eab
Fixed memory leak in Quit due to changes related to background thread removal. FreeData was quick escaping because it checked for ALmixer_Initialized which is now false by the time the code is reached.
Eric Wing <ewing@anscamobile.com>
parents:
36
diff
changeset
|
4806 for(i=0; i<data->max_queue_buffers; i++) |
b346b6608eab
Fixed memory leak in Quit due to changes related to background thread removal. FreeData was quick escaping because it checked for ALmixer_Initialized which is now false by the time the code is reached.
Eric Wing <ewing@anscamobile.com>
parents:
36
diff
changeset
|
4807 { |
b346b6608eab
Fixed memory leak in Quit due to changes related to background thread removal. FreeData was quick escaping because it checked for ALmixer_Initialized which is now false by the time the code is reached.
Eric Wing <ewing@anscamobile.com>
parents:
36
diff
changeset
|
4808 free(data->buffer_map_list[i].data); |
b346b6608eab
Fixed memory leak in Quit due to changes related to background thread removal. FreeData was quick escaping because it checked for ALmixer_Initialized which is now false by the time the code is reached.
Eric Wing <ewing@anscamobile.com>
parents:
36
diff
changeset
|
4809 } |
b346b6608eab
Fixed memory leak in Quit due to changes related to background thread removal. FreeData was quick escaping because it checked for ALmixer_Initialized which is now false by the time the code is reached.
Eric Wing <ewing@anscamobile.com>
parents:
36
diff
changeset
|
4810 free(data->buffer_map_list); |
b346b6608eab
Fixed memory leak in Quit due to changes related to background thread removal. FreeData was quick escaping because it checked for ALmixer_Initialized which is now false by the time the code is reached.
Eric Wing <ewing@anscamobile.com>
parents:
36
diff
changeset
|
4811 } |
b346b6608eab
Fixed memory leak in Quit due to changes related to background thread removal. FreeData was quick escaping because it checked for ALmixer_Initialized which is now false by the time the code is reached.
Eric Wing <ewing@anscamobile.com>
parents:
36
diff
changeset
|
4812 if(data->circular_buffer_queue != NULL) |
b346b6608eab
Fixed memory leak in Quit due to changes related to background thread removal. FreeData was quick escaping because it checked for ALmixer_Initialized which is now false by the time the code is reached.
Eric Wing <ewing@anscamobile.com>
parents:
36
diff
changeset
|
4813 { |
b346b6608eab
Fixed memory leak in Quit due to changes related to background thread removal. FreeData was quick escaping because it checked for ALmixer_Initialized which is now false by the time the code is reached.
Eric Wing <ewing@anscamobile.com>
parents:
36
diff
changeset
|
4814 CircularQueueUnsignedInt_FreeQueue(data->circular_buffer_queue); |
b346b6608eab
Fixed memory leak in Quit due to changes related to background thread removal. FreeData was quick escaping because it checked for ALmixer_Initialized which is now false by the time the code is reached.
Eric Wing <ewing@anscamobile.com>
parents:
36
diff
changeset
|
4815 } |
b346b6608eab
Fixed memory leak in Quit due to changes related to background thread removal. FreeData was quick escaping because it checked for ALmixer_Initialized which is now false by the time the code is reached.
Eric Wing <ewing@anscamobile.com>
parents:
36
diff
changeset
|
4816 |
b346b6608eab
Fixed memory leak in Quit due to changes related to background thread removal. FreeData was quick escaping because it checked for ALmixer_Initialized which is now false by the time the code is reached.
Eric Wing <ewing@anscamobile.com>
parents:
36
diff
changeset
|
4817 Sound_FreeSample(data->sample); |
b346b6608eab
Fixed memory leak in Quit due to changes related to background thread removal. FreeData was quick escaping because it checked for ALmixer_Initialized which is now false by the time the code is reached.
Eric Wing <ewing@anscamobile.com>
parents:
36
diff
changeset
|
4818 alDeleteBuffers(data->max_queue_buffers, data->buffer); |
b346b6608eab
Fixed memory leak in Quit due to changes related to background thread removal. FreeData was quick escaping because it checked for ALmixer_Initialized which is now false by the time the code is reached.
Eric Wing <ewing@anscamobile.com>
parents:
36
diff
changeset
|
4819 if((error = alGetError()) != AL_NO_ERROR) |
b346b6608eab
Fixed memory leak in Quit due to changes related to background thread removal. FreeData was quick escaping because it checked for ALmixer_Initialized which is now false by the time the code is reached.
Eric Wing <ewing@anscamobile.com>
parents:
36
diff
changeset
|
4820 { |
b346b6608eab
Fixed memory leak in Quit due to changes related to background thread removal. FreeData was quick escaping because it checked for ALmixer_Initialized which is now false by the time the code is reached.
Eric Wing <ewing@anscamobile.com>
parents:
36
diff
changeset
|
4821 fprintf(stderr, "ALmixer_FreeData: alDeleteBuffers failed. %s\n", alGetString(error)); |
b346b6608eab
Fixed memory leak in Quit due to changes related to background thread removal. FreeData was quick escaping because it checked for ALmixer_Initialized which is now false by the time the code is reached.
Eric Wing <ewing@anscamobile.com>
parents:
36
diff
changeset
|
4822 } |
b346b6608eab
Fixed memory leak in Quit due to changes related to background thread removal. FreeData was quick escaping because it checked for ALmixer_Initialized which is now false by the time the code is reached.
Eric Wing <ewing@anscamobile.com>
parents:
36
diff
changeset
|
4823 } |
b346b6608eab
Fixed memory leak in Quit due to changes related to background thread removal. FreeData was quick escaping because it checked for ALmixer_Initialized which is now false by the time the code is reached.
Eric Wing <ewing@anscamobile.com>
parents:
36
diff
changeset
|
4824 free(data->buffer); |
b346b6608eab
Fixed memory leak in Quit due to changes related to background thread removal. FreeData was quick escaping because it checked for ALmixer_Initialized which is now false by the time the code is reached.
Eric Wing <ewing@anscamobile.com>
parents:
36
diff
changeset
|
4825 |
b346b6608eab
Fixed memory leak in Quit due to changes related to background thread removal. FreeData was quick escaping because it checked for ALmixer_Initialized which is now false by the time the code is reached.
Eric Wing <ewing@anscamobile.com>
parents:
36
diff
changeset
|
4826 LinkedList_Remove(s_listOfALmixerData, |
b346b6608eab
Fixed memory leak in Quit due to changes related to background thread removal. FreeData was quick escaping because it checked for ALmixer_Initialized which is now false by the time the code is reached.
Eric Wing <ewing@anscamobile.com>
parents:
36
diff
changeset
|
4827 LinkedList_Find(s_listOfALmixerData, data, NULL) |
b346b6608eab
Fixed memory leak in Quit due to changes related to background thread removal. FreeData was quick escaping because it checked for ALmixer_Initialized which is now false by the time the code is reached.
Eric Wing <ewing@anscamobile.com>
parents:
36
diff
changeset
|
4828 ); |
b346b6608eab
Fixed memory leak in Quit due to changes related to background thread removal. FreeData was quick escaping because it checked for ALmixer_Initialized which is now false by the time the code is reached.
Eric Wing <ewing@anscamobile.com>
parents:
36
diff
changeset
|
4829 |
b346b6608eab
Fixed memory leak in Quit due to changes related to background thread removal. FreeData was quick escaping because it checked for ALmixer_Initialized which is now false by the time the code is reached.
Eric Wing <ewing@anscamobile.com>
parents:
36
diff
changeset
|
4830 free(data); |
b346b6608eab
Fixed memory leak in Quit due to changes related to background thread removal. FreeData was quick escaping because it checked for ALmixer_Initialized which is now false by the time the code is reached.
Eric Wing <ewing@anscamobile.com>
parents:
36
diff
changeset
|
4831 } |
b346b6608eab
Fixed memory leak in Quit due to changes related to background thread removal. FreeData was quick escaping because it checked for ALmixer_Initialized which is now false by the time the code is reached.
Eric Wing <ewing@anscamobile.com>
parents:
36
diff
changeset
|
4832 |
b346b6608eab
Fixed memory leak in Quit due to changes related to background thread removal. FreeData was quick escaping because it checked for ALmixer_Initialized which is now false by the time the code is reached.
Eric Wing <ewing@anscamobile.com>
parents:
36
diff
changeset
|
4833 |
b346b6608eab
Fixed memory leak in Quit due to changes related to background thread removal. FreeData was quick escaping because it checked for ALmixer_Initialized which is now false by the time the code is reached.
Eric Wing <ewing@anscamobile.com>
parents:
36
diff
changeset
|
4834 |
0 | 4835 |
4836 | |
4837 | |
4838 /* Private function for Updating ALmixer. | |
4839 * This is a very big and ugly function. | |
4840 * It should return the number of buffers that were | |
4841 * queued during the call. The value might be | |
4842 * used to guage how long you might wait to | |
4843 * call the next update loop in case you are worried | |
4844 * about preserving CPU cycles. The idea is that | |
4845 * when a buffer is queued, there was probably some | |
4846 * CPU intensive looping which took awhile. | |
4847 * It's mainly provided as a convenience. | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4848 * Timing the call with ALmixer_GetTicks() would produce |
0 | 4849 * more accurate information. |
4850 * Returns a negative value if there was an error, | |
4851 * the value being the number of errors. | |
4852 */ | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4853 static ALint Update_ALmixer(void* data) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4854 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4855 ALint retval = 0; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4856 ALint error_flag = 0; |
0 | 4857 ALenum error; |
4858 ALint state; | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4859 ALint i=0; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4860 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4861 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4862 SDL_LockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4863 #endif |
40
2b0b55b7f8cf
Resync to get interruption changes.
Eric Wing <ewing@anscamobile.com>
parents:
37
diff
changeset
|
4864 if( (AL_FALSE == ALmixer_Initialized) || (AL_TRUE == g_inInterruption) ) |
0 | 4865 { |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4866 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4867 SDL_UnlockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4868 #endif |
0 | 4869 return 0; |
4870 } | |
22
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
4871 |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
4872 /* Bypass if in interruption event */ |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
4873 if(NULL == alcGetCurrentContext()) |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
4874 { |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
4875 #ifdef ENABLE_ALMIXER_THREADS |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
4876 SDL_UnlockMutex(s_simpleLock); |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
4877 #endif |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
4878 return 0; |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
4879 } |
0 | 4880 |
4881 /* Check the quick flag to see if anything needs updating */ | |
4882 /* If anything is playing, then we have to do work */ | |
4883 if( 0 == Is_Playing_global) | |
4884 { | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4885 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4886 SDL_UnlockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4887 #endif |
0 | 4888 return 0; |
4889 } | |
4890 /* Clear error */ | |
4891 if((error = alGetError()) != AL_NO_ERROR) | |
4892 { | |
4893 fprintf(stderr, "08Testing errpr before unqueue because getting stuff, for OS X this is expected: %s\n", | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4894 alGetString(error)); |
0 | 4895 } |
4896 alGetError(); | |
4897 | |
4898 for(i=0; i<Number_of_Channels_global; i++) | |
4899 { | |
4900 if( ALmixer_Channel_List[i].channel_in_use ) | |
4901 { | |
4902 | |
4903 /* For simplicity, before we do anything else, | |
4904 * we can check the timeout and fading values | |
4905 * and do the appropriate things | |
4906 */ | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4907 ALuint current_time = ALmixer_GetTicks(); |
0 | 4908 |
4909 /* Check to see if we need to halt due to Timed play */ | |
4910 if(ALmixer_Channel_List[i].expire_ticks != -1) | |
4911 { | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4912 ALuint target_time = (ALuint)ALmixer_Channel_List[i].expire_ticks |
0 | 4913 + ALmixer_Channel_List[i].start_time; |
4914 alGetSourcei(ALmixer_Channel_List[i].alsource, | |
4915 AL_SOURCE_STATE, &state); | |
4916 if((error = alGetError()) != AL_NO_ERROR) | |
4917 { | |
4918 fprintf(stderr, "06Testing errpr before unqueue because getting stuff, for OS X this is expected: %s\n", | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4919 alGetString(error)); |
0 | 4920 } |
4921 | |
4922 /* Check the time, and also make sure that it is not | |
4923 * paused (if paused, we don't want to make the | |
4924 * evaluation because when resumed, we will adjust | |
4925 * the times to compensate for the pause). | |
4926 */ | |
4927 if( (current_time >= target_time) | |
4928 && (state != AL_PAUSED) ) | |
4929 { | |
4930 /* Stop the playback */ | |
10
c808684660a7
Bug fix: Moved Invoke_Callback before CleanChannel because I was trying to get the ALmixer_Data pointer, but it was cleared:
Eric Wing <ewing . public |-at-| gmail . com>
parents:
6
diff
changeset
|
4931 Internal_HaltChannel(i, AL_FALSE); |
0 | 4932 if((error = alGetError()) != AL_NO_ERROR) |
4933 { | |
4934 fprintf(stderr, "07Testing errpr before unqueue because getting stuff, for OS X this is expected: %s\n", | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4935 alGetString(error)); |
0 | 4936 } |
4937 | |
4938 /* Everything should be done so go on to the next loop */ | |
4939 continue; | |
4940 } | |
4941 } /* End if time expired check */ | |
4942 | |
4943 /* Check to see if we need to adjust the volume for fading */ | |
4944 if( ALmixer_Channel_List[i].fade_enabled ) | |
4945 { | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4946 ALuint target_time = ALmixer_Channel_List[i].fade_expire_ticks |
0 | 4947 + ALmixer_Channel_List[i].fade_start_time; |
4948 alGetSourcei(ALmixer_Channel_List[i].alsource, | |
4949 AL_SOURCE_STATE, &state); | |
4950 if((error = alGetError()) != AL_NO_ERROR) | |
4951 { | |
4952 fprintf(stderr, "05Testing errpr before unqueue because getting stuff, for OS X this is expected: %s\n", | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4953 alGetString(error)); |
0 | 4954 } |
4955 | |
4956 /* Check the time, and also make sure that it is not | |
4957 * paused (if paused, we don't want to make the | |
4958 * evaluation because when resumed, we will adjust | |
4959 * the times to compensate for the pause). | |
4960 */ | |
4961 if(state != AL_PAUSED) | |
4962 { | |
4963 ALfloat t; | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4964 ALuint delta_time; |
0 | 4965 ALfloat current_volume; |
4966 if(current_time >= target_time) | |
4967 { | |
4968 /* Need to constrain value to the end time | |
4969 * (can't go pass the value for calculations) | |
4970 */ | |
4971 current_time = target_time; | |
4972 /* We can disable the fade flag now */ | |
4973 ALmixer_Channel_List[i].fade_enabled = 0; | |
4974 } | |
4975 /* Use the linear interpolation formula: | |
4976 * X = (1-t)x0 + tx1 | |
4977 * where x0 would be the start value | |
4978 * and x1 is the final value | |
4979 * and t is delta_time*inv_time (adjusts 0 <= time <= 1) | |
4980 * delta_time = current_time-start_time | |
4981 * inv_time = 1/ (end_time-start_time) | |
4982 * so t = current_time-start_time / (end_time-start_time) | |
4983 * | |
4984 */ | |
4985 delta_time = current_time - ALmixer_Channel_List[i].fade_start_time; | |
4986 t = (ALfloat) delta_time * ALmixer_Channel_List[i].fade_inv_time; | |
4987 current_volume = (1.0f-t) * ALmixer_Channel_List[i].fade_start_volume | |
4988 + t * ALmixer_Channel_List[i].fade_end_volume; | |
20
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
4989 /* |
12
bfe90b4f3d87
Bug fixes to FadeIn.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
10
diff
changeset
|
4990 fprintf(stderr, "start_vol=%f, end_vol:%f, current_volume: %f\n", ALmixer_Channel_List[i].fade_start_volume, ALmixer_Channel_List[i].fade_end_volume, current_volume); |
20
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
4991 */ |
0 | 4992 /* Set the volume */ |
4993 alSourcef(ALmixer_Channel_List[i].alsource, | |
12
bfe90b4f3d87
Bug fixes to FadeIn.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
10
diff
changeset
|
4994 AL_GAIN, current_volume); |
0 | 4995 if((error = alGetError()) != AL_NO_ERROR) |
4996 { | |
4997 fprintf(stderr, "04Testing errpr before unqueue because getting stuff, for OS X this is expected: %s\n", | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
4998 alGetString(error)); |
0 | 4999 } |
5000 | |
5001 /* | |
5002 fprintf(stderr, "Current time =%d\n", current_time); | |
5003 fprintf(stderr, "Current vol=%f on channel %d\n", current_volume, i); | |
5004 */ | |
5005 } /* End if not PAUSED */ | |
5006 } /* End if fade_enabled */ | |
5007 | |
5008 | |
5009 /* Okay, now that the time expired and fading stuff | |
5010 * is done, do the rest of the hard stuff | |
5011 */ | |
5012 | |
5013 | |
5014 /* For predecoded, check to see if done */ | |
5015 if( ALmixer_Channel_List[i].almixer_data->decoded_all ) | |
5016 { | |
5017 | |
5018 #if 0 | |
5019 /********* Remove this **********/ | |
5020 ALint buffers_processed; | |
5021 ALint buffers_still_queued; | |
5022 fprintf(stderr, "For Predecoded\n"); | |
5023 | |
5024 alGetSourcei( | |
5025 ALmixer_Channel_List[i].alsource, | |
5026 AL_SOURCE_STATE, &state | |
5027 ); | |
5028 switch(state) { | |
5029 case AL_PLAYING: | |
5030 fprintf(stderr, "Channel '%d' is PLAYING\n", i); | |
5031 break; | |
5032 case AL_PAUSED: | |
5033 fprintf(stderr, "Channel '%d' is PAUSED\n",i); | |
5034 break; | |
5035 case AL_STOPPED: | |
5036 fprintf(stderr, "Channel '%d' is STOPPED\n",i); | |
5037 break; | |
5038 case AL_INITIAL: | |
5039 fprintf(stderr, "Channel '%d' is INITIAL\n",i); | |
5040 break; | |
5041 default: | |
5042 fprintf(stderr, "Channel '%d' is UNKNOWN\n",i); | |
5043 break; | |
5044 } | |
5045 | |
5046 alGetSourcei( | |
5047 ALmixer_Channel_List[i].alsource, | |
5048 AL_BUFFERS_PROCESSED, &buffers_processed | |
5049 ); | |
5050 fprintf(stderr, "Buffers processed = %d\n", buffers_processed); | |
5051 | |
5052 alGetSourcei( | |
5053 ALmixer_Channel_List[i].alsource, | |
5054 AL_BUFFERS_QUEUED, &buffers_still_queued | |
5055 ); | |
5056 | |
5057 /******** END REMOVE *******/ | |
5058 #endif | |
5059 /* FIXME: Ugh! Somewhere an alError is being thrown ("Invalid Enum Value"), but I can't | |
5060 * find it. It only seems to be thrown for OS X. I placed error messages after every al* | |
5061 * command I could find in the above loops, but the error doesn't seem to show | |
5062 * up until around here. I mistook it for a get queued buffers | |
5063 * error in OS X. I don't think there's an error down there. | |
5064 * For now, I'm clearing the error here. | |
5065 */ | |
5066 | |
5067 if((error = alGetError()) != AL_NO_ERROR) | |
5068 { | |
5069 fprintf(stderr, "03Testing errpr before unqueue because getting stuff, for OS X this is expected: %s\n", | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5070 alGetString(error)); |
0 | 5071 } |
5072 | |
5073 | |
5074 alGetSourcei( | |
5075 ALmixer_Channel_List[i].alsource, | |
5076 AL_SOURCE_STATE, &state | |
5077 ); | |
5078 if((error = alGetError()) != AL_NO_ERROR) | |
5079 { | |
5080 fprintf(stderr, "02Testing errpr before unqueue because getting stuff, for OS X this is expected: %s\n", | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5081 alGetString(error)); |
0 | 5082 } |
5083 | |
5084 | |
5085 if(AL_STOPPED == state) | |
5086 { | |
5087 /* Playback has ended. | |
5088 * Loop if necessary, or launch callback | |
5089 * and clear channel (or clear channel and | |
5090 * then launch callback?) | |
5091 */ | |
5092 | |
5093 | |
5094 /* Need to check for loops */ | |
5095 if(ALmixer_Channel_List[i].loops != 0) | |
5096 { | |
5097 /* Corner Case: If the buffer has | |
5098 * been modified using Seek, | |
5099 * the loop will start at the seek | |
5100 * position. | |
5101 */ | |
5102 if(ALmixer_Channel_List[i].loops != -1) | |
5103 { | |
5104 ALmixer_Channel_List[i].loops--; | |
5105 } | |
5106 alSourcePlay(ALmixer_Channel_List[i].alsource); | |
5107 if((error = alGetError()) != AL_NO_ERROR) | |
5108 { | |
5109 fprintf(stderr, "50Testing error: %s\n", | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5110 alGetString(error)); |
0 | 5111 } |
5112 continue; | |
5113 } | |
5114 /* No loops. End play. */ | |
5115 else | |
5116 { | |
5117 /* Problem: It seems that when mixing | |
5118 * streamed and predecoded sources, | |
5119 * the previous instance lingers, | |
5120 * so we need to force remove | |
5121 * the data from the source. | |
5122 * The sharing problem | |
5123 * occurs when a previous predecoded buffer is played on | |
5124 * a source, and then a streamed source is played later | |
5125 * on that same source. OpenAL isn't consistently | |
5126 * removing the previous buffer so both get played. | |
5127 * (Different dists seem to have different quirks. | |
5128 * The problem might lead to crashes in the worst case.) | |
5129 */ | |
5130 /* Additional problem: There is another | |
5131 * inconsistency among OpenAL distributions. | |
5132 * Both Loki and Creative Windows seem to keep | |
5133 * the buffer queued which requires removing. | |
5134 * But the Creative Macintosh version does | |
5135 * not have any buffer queued after play | |
5136 * and it returns the error: Invalid Enum Value | |
5137 * if I try to unqueue it. | |
5138 * So I'm going to put in a check to see if I | |
5139 * can detect any buffers queued first | |
5140 * and then unqueue them if I can see them. | |
5141 * Additional note: The new CoreAudio based | |
5142 * implementation leaves it's buffer queued | |
5143 * like Loki and Creative Windows. But | |
5144 * considering all the problems I'm having | |
5145 * with the different distributions, this | |
5146 * check seems reasonable. | |
5147 */ | |
5148 ALint buffers_still_queued; | |
5149 if((error = alGetError()) != AL_NO_ERROR) | |
5150 { | |
5151 fprintf(stderr, "01Testing errpr before unqueue because getting stuff, for OS X this is expected: %s\n", | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5152 alGetString(error)); |
0 | 5153 } |
5154 | |
5155 alGetSourcei( | |
5156 ALmixer_Channel_List[i].alsource, | |
5157 AL_BUFFERS_QUEUED, &buffers_still_queued | |
5158 ); | |
5159 if((error = alGetError()) != AL_NO_ERROR) | |
5160 { | |
5161 fprintf(stderr, "Error with unqueue, for OS X this is expected: %s\n", | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5162 alGetString(error)); |
0 | 5163 ALmixer_SetError("Failed detecting unqueued predecoded buffer (expected with OS X): %s", |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5164 alGetString(error) ); |
0 | 5165 error_flag--; |
5166 } | |
5167 if(buffers_still_queued > 0) | |
5168 { | |
1 | 5169 |
5170 #if 0 /* This triggers an error in OS X Core Audio. */ | |
5171 alSourceUnqueueBuffers( | |
5172 ALmixer_Channel_List[i].alsource, | |
5173 1, | |
5174 ALmixer_Channel_List[i].almixer_data->buffer | |
5175 ); | |
5176 #else | |
5177 /* fprintf(stderr, "In the Bob Aron section...about to clear source\n"); | |
0 | 5178 PrintQueueStatus(ALmixer_Channel_List[i].alsource); |
1 | 5179 */ |
0 | 5180 /* Rather than force unqueuing the buffer, let's see if |
5181 * setting the buffer to none works (the OpenAL 1.0 | |
5182 * Reference Annotation suggests this should work). | |
5183 */ | |
5184 alSourcei(ALmixer_Channel_List[i].alsource, | |
5185 AL_BUFFER, AL_NONE); | |
5186 /* | |
5187 PrintQueueStatus(ALmixer_Channel_List[i].alsource); | |
5188 */ | |
1 | 5189 #endif |
0 | 5190 if((error = alGetError()) != AL_NO_ERROR) |
5191 { | |
5192 fprintf(stderr, "Error with unqueue, after alSourceUnqueueBuffers, buffers_still_queued=%d, error is: %s", buffers_still_queued, | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5193 alGetString(error)); |
0 | 5194 ALmixer_SetError("Predecoded Unqueue buffer failed: %s", |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5195 alGetString(error) ); |
0 | 5196 error_flag--; |
5197 } | |
5198 | |
5199 } | |
5200 | |
10
c808684660a7
Bug fix: Moved Invoke_Callback before CleanChannel because I was trying to get the ALmixer_Data pointer, but it was cleared:
Eric Wing <ewing . public |-at-| gmail . com>
parents:
6
diff
changeset
|
5201 /* Launch callback */ |
c808684660a7
Bug fix: Moved Invoke_Callback before CleanChannel because I was trying to get the ALmixer_Data pointer, but it was cleared:
Eric Wing <ewing . public |-at-| gmail . com>
parents:
6
diff
changeset
|
5202 Invoke_Channel_Done_Callback(i, AL_TRUE); |
c808684660a7
Bug fix: Moved Invoke_Callback before CleanChannel because I was trying to get the ALmixer_Data pointer, but it was cleared:
Eric Wing <ewing . public |-at-| gmail . com>
parents:
6
diff
changeset
|
5203 |
0 | 5204 Clean_Channel(i); |
5205 /* Subtract counter */ | |
5206 Is_Playing_global--; | |
5207 | |
5208 | |
5209 /* We're done for this loop. | |
5210 * Go to next channel | |
5211 */ | |
5212 continue; | |
5213 } | |
5214 continue; | |
5215 } | |
5216 } /* End if decoded_all */ | |
5217 /* For streamed */ | |
5218 else | |
5219 { | |
5220 ALint buffers_processed; | |
5221 ALint buffers_still_queued; | |
5222 ALint current_buffer_id; | |
5223 | |
5224 ALuint unqueued_buffer_id; | |
28
60500a33735a
Initial backend changes to decouple assumption of 1 buffer queued per channel / per pass. API will eventually be changed/broken to support this.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
27
diff
changeset
|
5225 ALuint number_of_buffers_to_queue_this_pass = ALmixer_Channel_List[i].almixer_data->num_target_buffers_per_pass; |
60500a33735a
Initial backend changes to decouple assumption of 1 buffer queued per channel / per pass. API will eventually be changed/broken to support this.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
27
diff
changeset
|
5226 ALuint current_count_of_buffer_queue_passes = 0; |
60500a33735a
Initial backend changes to decouple assumption of 1 buffer queued per channel / per pass. API will eventually be changed/broken to support this.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
27
diff
changeset
|
5227 |
0 | 5228 #if 0 |
5229 /********* Remove this **********/ | |
5230 fprintf(stderr, "For Streamed\n"); | |
5231 | |
5232 alGetSourcei( | |
5233 ALmixer_Channel_List[i].alsource, | |
5234 AL_SOURCE_STATE, &state | |
5235 ); | |
5236 switch(state) { | |
5237 case AL_PLAYING: | |
5238 fprintf(stderr, "Channel '%d' is PLAYING\n", i); | |
5239 break; | |
5240 case AL_PAUSED: | |
5241 fprintf(stderr, "Channel '%d' is PAUSED\n",i); | |
5242 break; | |
5243 case AL_STOPPED: | |
5244 fprintf(stderr, "Channel '%d' is STOPPED\n",i); | |
5245 break; | |
5246 case AL_INITIAL: | |
5247 fprintf(stderr, "Channel '%d' is INITIAL\n",i); | |
5248 break; | |
5249 default: | |
5250 fprintf(stderr, "Channel '%d' is UNKNOWN\n",i); | |
5251 break; | |
5252 } | |
5253 /******** END REMOVE *******/ | |
5254 #endif | |
5255 /* Get the number of buffers still queued */ | |
5256 alGetSourcei( | |
5257 ALmixer_Channel_List[i].alsource, | |
5258 AL_BUFFERS_QUEUED, &buffers_still_queued | |
5259 ); | |
5260 if((error = alGetError()) != AL_NO_ERROR) | |
5261 { | |
5262 fprintf(stderr, "51Testing error: %s\n", | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5263 alGetString(error)); |
0 | 5264 } |
5265 /* Get the number of buffers processed | |
5266 * so we know if we need to refill | |
5267 */ | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5268 /* WARNING: It looks like Snow Leopard some times crashes on this call under x86_64 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5269 * typically when I suffer a lot of buffer underruns. |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5270 */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5271 // fprintf(stderr, "calling AL_BUFFERS_PROCESSED on source:%d", ALmixer_Channel_List[i].alsource); |
0 | 5272 alGetSourcei( |
5273 ALmixer_Channel_List[i].alsource, | |
5274 AL_BUFFERS_PROCESSED, &buffers_processed | |
5275 ); | |
5276 if((error = alGetError()) != AL_NO_ERROR) | |
5277 { | |
5278 fprintf(stderr, "52Testing error: %s\n", | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5279 alGetString(error)); |
0 | 5280 } |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5281 // fprintf(stderr, "finished AL_BUFFERS_PROCESSED, buffers_processed=%d", buffers_processed); |
0 | 5282 |
5283 /* WTF!!! The Nvidia distribution is failing on the alGetSourcei(source, AL_BUFFER, buf_id) call. | |
5284 * I need this call to figure out which buffer OpenAL is currently playing. | |
5285 * It keeps returning an "Invalid Enum" error. | |
5286 * This is totally inane! It's a basic query. | |
5287 * By the spec, this functionality is not explicitly defined so Nvidia refuses to | |
5288 * fix this behavior, even though all other distributions work fine with this. | |
5289 * The only workaround for this is for | |
5290 * a significant rewrite of my code which requires me to | |
5291 * duplicate the OpenAL queued buffers state with my own | |
5292 * code and try to derive what the current playing buffer is by indirect observation of | |
5293 * looking at buffers_processed. But of course this has a ton of downsides since my | |
5294 * queries do not give me perfect timing of what OpenAL is actually doing and | |
5295 * the fact that some of the distributions seem to have buffer queuing problems | |
5296 * with their query results (CoreAudio). This also means a ton of extra code | |
5297 * on my side. The lack of support of a 1 line call has required me to | |
5298 * implement yet another entire state machine. <sigh> | |
5299 */ | |
5300 #if 0 /* This code will not work until possibly OpenAL 1.1 because of Nvidia */ | |
5301 /* Get the id to the current buffer playing */ | |
5302 alGetSourcei( | |
5303 ALmixer_Channel_List[i].alsource, | |
5304 AL_BUFFER, ¤t_buffer_id | |
5305 ); | |
5306 if((error = alGetError()) != AL_NO_ERROR) | |
5307 { | |
5308 fprintf(stderr, "53Testing error: %s\n", | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5309 alGetString(error)); |
0 | 5310 } |
5311 | |
5312 /* Before the hard stuff, check to see if the | |
5313 * current queued AL buffer has changed. | |
5314 * If it has, we should launch a data callback if | |
5315 * necessary | |
5316 */ | |
5317 if( ((ALuint)current_buffer_id) != | |
5318 ALmixer_Channel_List[i].almixer_data->current_buffer) | |
5319 { | |
5320 ALmixer_Channel_List[i].almixer_data->current_buffer | |
5321 = (ALuint)current_buffer_id; | |
5322 | |
5323 Invoke_Streamed_Channel_Data_Callback(i, ALmixer_Channel_List[i].almixer_data, current_buffer_id); | |
5324 } | |
5325 #else | |
5326 /* Only do this if "access_data" was requested (i.e. the circular_buffer!=NULL) | |
5327 * And if one of the two are true: | |
5328 * Either buffers_processed > 0 (because the current_buffer might have changed) | |
5329 * or if the current_buffer==0 (because we are in an initial state or recovering from | |
5330 * a buffer underrun) | |
5331 */ | |
5332 if((ALmixer_Channel_List[i].almixer_data->circular_buffer_queue != NULL) | |
5333 && ( | |
5334 (buffers_processed > 0) || (0 == ALmixer_Channel_List[i].almixer_data->current_buffer) | |
5335 ) | |
5336 ) | |
5337 { | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5338 ALint k; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5339 ALuint queue_ret_flag; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5340 ALubyte is_out_of_sync = 0; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5341 ALuint my_queue_size = CircularQueueUnsignedInt_Size(ALmixer_Channel_List[i].almixer_data->circular_buffer_queue); |
1 | 5342 /* Ugh, I have to deal with signed/unsigned mismatch here. */ |
5343 ALint buffers_unplayed_int = buffers_still_queued - buffers_processed; | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5344 ALuint unplayed_buffers; |
1 | 5345 if(buffers_unplayed_int < 0) |
5346 { | |
5347 unplayed_buffers = 0; | |
5348 } | |
5349 else | |
5350 { | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5351 unplayed_buffers = (ALuint)buffers_unplayed_int; |
1 | 5352 } |
0 | 5353 /* |
5354 fprintf(stderr, "Queue in processed check, before pop, buffers_processed=%d\n", buffers_processed); | |
5355 CircularQueueUnsignedInt_Print(ALmixer_Channel_List[i].almixer_data->circular_buffer_queue); | |
5356 */ | |
5357 /* We can't make any determinations solely based on the number of buffers_processed | |
5358 * because currently, we only unqueue 1 buffer per loop. That means if 2 or more | |
5359 * buffers became processed in one loop, the following loop, we would have | |
5360 * at least that_many-1 buffers_processed (plus possible new processed). | |
5361 * If we tried to just remove 1 buffer from our queue, we would be incorrect | |
5362 * because we would not actually reflect the current playing buffer. | |
5363 * So the solution seems to be to make sure our queue is the same size | |
5364 * as the number of buffers_queued-buffers_processed, and return the head of our queue | |
5365 * as the current playing buffer. | |
5366 */ | |
5367 /* Also, we have a corner case. When we first start playing or if we have | |
5368 * a buffer underrun, we have not done a data callback. | |
5369 * In this case, we need to see if there is any new data in our queue | |
5370 * and if so, launch that data callback. | |
5371 */ | |
5372 /* Warning, this code risks the possibility of no data callback being fired if | |
5373 * the system is really late (or skipped buffers). | |
5374 */ | |
5375 | |
5376 /* First, let's syncronize our queue with the OpenAL queue */ | |
5377 #if 0 | |
5378 fprintf(stderr, "inside, Buffers processed=%d, Buffers queued=%d, my queue=%d\n", | |
5379 buffers_processed, buffers_still_queued, my_queue_size); | |
1 | 5380 #endif |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5381 is_out_of_sync = 1; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5382 for(k=0; k<buffers_processed; k++) |
0 | 5383 { |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5384 queue_ret_flag = CircularQueueUnsignedInt_PopFront( |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5385 ALmixer_Channel_List[i].almixer_data->circular_buffer_queue); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5386 if(0 == queue_ret_flag) |
0 | 5387 { |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5388 fprintf(stderr, "53 Error popping queue\n"); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5389 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5390 } |
0 | 5391 my_queue_size = CircularQueueUnsignedInt_Size(ALmixer_Channel_List[i].almixer_data->circular_buffer_queue); |
5392 /* We have several possibilities we need to handle: | |
5393 * 1) We are in an initial state or underrun and need to do a data callback on the head. | |
5394 * 2) We were out of sync and need to do a new data callback on the new head. | |
5395 * 3) We were not out of sync but just had left over processed buffers which caused us to | |
5396 * fall in this block of code. (Don't do anything.) | |
5397 */ | |
5398 if( (0 == ALmixer_Channel_List[i].almixer_data->current_buffer) || (1 == is_out_of_sync) ) | |
5399 { | |
5400 if(my_queue_size > 0) | |
5401 { | |
5402 current_buffer_id = CircularQueueUnsignedInt_Front( | |
5403 ALmixer_Channel_List[i].almixer_data->circular_buffer_queue); | |
5404 if(0 == current_buffer_id) | |
5405 { | |
5406 fprintf(stderr, "53a Internal Error, current_buffer_id=0 when it shouldn't be 0\n"); | |
5407 } | |
5408 /* | |
5409 else | |
5410 { | |
5411 fprintf(stderr, "Queue in processed check, after pop\n"); | |
5412 CircularQueueUnsignedInt_Print(ALmixer_Channel_List[i].almixer_data->circular_buffer_queue); | |
5413 } | |
5414 */ | |
5415 ALmixer_Channel_List[i].almixer_data->current_buffer | |
5416 = (ALuint)current_buffer_id; | |
5417 | |
5418 #if 0 | |
5419 /* Remove me...only for checking...doesn't work on Nvidia */ | |
5420 { | |
5421 ALuint real_id; | |
5422 alGetSourcei( | |
5423 ALmixer_Channel_List[i].alsource, | |
5424 AL_BUFFER, &real_id | |
5425 ); | |
5426 alGetError(); | |
5427 fprintf(stderr, "Callback fired on data buffer=%d, real_id shoud be=%d\n", current_buffer_id, real_id); | |
5428 } | |
5429 #endif | |
5430 Invoke_Streamed_Channel_Data_Callback(i, ALmixer_Channel_List[i].almixer_data, current_buffer_id); | |
5431 } | |
5432 else | |
5433 { | |
1 | 5434 /* |
0 | 5435 fprintf(stderr, "53b, Notice/Warning:, OpenAL queue has been depleted.\n"); |
1 | 5436 PrintQueueStatus(ALmixer_Channel_List[i].alsource); |
5437 */ | |
0 | 5438 /* In this case, we might either be in an underrun or finished with playback */ |
5439 ALmixer_Channel_List[i].almixer_data->current_buffer = 0; | |
5440 } | |
5441 } | |
5442 } | |
5443 #endif | |
5444 | |
5445 | |
5446 | |
5447 /* Just a test - remove | |
5448 if( ALmixer_Channel_List[i].loops > 0) | |
5449 { | |
5450 fprintf(stderr, ">>>>>>>>>>>>>>>Loops = %d\n", | |
5451 ALmixer_Channel_List[i].loops); | |
5452 } | |
5453 */ | |
5454 #if 0 | |
5455 fprintf(stderr, "Buffers processed = %d\n", buffers_processed); | |
5456 fprintf(stderr, "Buffers queued= %d\n", buffers_still_queued); | |
5457 #endif | |
5458 /* We've used up a buffer so we need to unqueue and replace */ | |
5459 /* Okay, it gets more complicated here: | |
5460 * We need to Queue more data | |
5461 * if buffers_processed > 0 or | |
5462 * if num_of_buffers_in_use < NUMBER_OF_QUEUE_BUFFERS | |
5463 * but we don't do this if at EOF, | |
5464 * except when there is looping | |
5465 */ | |
28
60500a33735a
Initial backend changes to decouple assumption of 1 buffer queued per channel / per pass. API will eventually be changed/broken to support this.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
27
diff
changeset
|
5466 |
60500a33735a
Initial backend changes to decouple assumption of 1 buffer queued per channel / per pass. API will eventually be changed/broken to support this.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
27
diff
changeset
|
5467 /* NEW FEATURE: Try to queue up more buffers per pass, allowing the size of the buffer to be decoupled. */ |
60500a33735a
Initial backend changes to decouple assumption of 1 buffer queued per channel / per pass. API will eventually be changed/broken to support this.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
27
diff
changeset
|
5468 /* TODO: Optimization: If number of available buffers (max_buffers-buffers_in_use), adjust the number of buffers to queue for this pass. */ |
60500a33735a
Initial backend changes to decouple assumption of 1 buffer queued per channel / per pass. API will eventually be changed/broken to support this.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
27
diff
changeset
|
5469 for(current_count_of_buffer_queue_passes=0; current_count_of_buffer_queue_passes<number_of_buffers_to_queue_this_pass; current_count_of_buffer_queue_passes++) |
60500a33735a
Initial backend changes to decouple assumption of 1 buffer queued per channel / per pass. API will eventually be changed/broken to support this.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
27
diff
changeset
|
5470 { |
60500a33735a
Initial backend changes to decouple assumption of 1 buffer queued per channel / per pass. API will eventually be changed/broken to support this.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
27
diff
changeset
|
5471 |
0 | 5472 /* For this to work, we must rely on EVERYTHING |
5473 * else to unset the EOF if there is looping. | |
5474 * Remember, even Play() must do this | |
5475 */ | |
5476 | |
5477 /* If not EOF, then we are still playing. | |
5478 * Inside, we might find num_of_buffers < NUM...QUEUE_BUF.. | |
5479 * or buffers_process > 0 | |
5480 * in which case we queue up. | |
5481 * We also might find no buffers we need to fill, | |
5482 * in which case we just keep going | |
5483 */ | |
5484 if( ! ALmixer_Channel_List[i].almixer_data->eof) | |
5485 { | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5486 ALuint bytes_returned; |
0 | 5487 /* We have a priority. We first must assign |
5488 * unused buffers in reserve. If there is nothing | |
5489 * left, then we may unqueue buffers. We can't | |
5490 * do it the other way around because we will | |
5491 * lose the pointer to the unqueued buffer | |
5492 */ | |
5493 if(ALmixer_Channel_List[i].almixer_data->num_buffers_in_use | |
5494 < ALmixer_Channel_List[i].almixer_data->max_queue_buffers) | |
5495 { | |
1 | 5496 #if 0 |
0 | 5497 fprintf(stderr, "Getting more data in NOT_EOF and num_buffers_in_use (%d) < max_queue (%d)\n", |
5498 ALmixer_Channel_List[i].almixer_data->num_buffers_in_use, | |
5499 ALmixer_Channel_List[i].almixer_data->max_queue_buffers); | |
1 | 5500 #endif |
0 | 5501 /* Going to add an unused packet. |
5502 * Grab next packet */ | |
5503 bytes_returned = GetMoreData( | |
5504 ALmixer_Channel_List[i].almixer_data, | |
5505 ALmixer_Channel_List[i].almixer_data->buffer[ | |
5506 ALmixer_Channel_List[i].almixer_data->num_buffers_in_use] | |
5507 ); | |
5508 } | |
5509 /* For processed > 0 */ | |
5510 else if(buffers_processed > 0) | |
5511 { | |
5512 /* Unqueue only 1 buffer for now. | |
5513 * If there are more than one, | |
5514 * let the next Update pass deal with it | |
5515 * so we don't stall the program for too long. | |
5516 */ | |
5517 #if 0 | |
5518 fprintf(stderr, "About to Unqueue, Buffers processed = %d\n", buffers_processed); | |
5519 fprintf(stderr, "Buffers queued= %d\n", buffers_still_queued); | |
5520 fprintf(stderr, "Unqueuing a buffer\n"); | |
5521 #endif | |
5522 alSourceUnqueueBuffers( | |
5523 ALmixer_Channel_List[i].alsource, | |
5524 1, &unqueued_buffer_id | |
5525 ); | |
5526 if((error = alGetError()) != AL_NO_ERROR) | |
5527 { | |
5528 fprintf(stderr, "Error with unqueue: %s", | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5529 alGetString(error)); |
0 | 5530 ALmixer_SetError("Unqueue buffer failed: %s", |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5531 alGetString(error) ); |
0 | 5532 error_flag--; |
5533 } | |
5534 /* | |
5535 fprintf(stderr, "Right after unqueue..."); | |
5536 PrintQueueStatus(ALmixer_Channel_List[i].alsource); | |
5537 fprintf(stderr, "Getting more data for NOT_EOF, max_buffers filled\n"); | |
5538 */ | |
5539 /* Grab unqueued packet */ | |
5540 bytes_returned = GetMoreData( | |
5541 ALmixer_Channel_List[i].almixer_data, | |
5542 unqueued_buffer_id); | |
5543 } | |
5544 /* We are still streaming, but currently | |
5545 * don't need to fill any buffers */ | |
5546 else | |
5547 { | |
5548 /* Might want to check state */ | |
5549 /* In case the playback stopped, | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5550 * we need to resume |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5551 * a.k.a. buffer underrun |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5552 */ |
1 | 5553 #if 1 |
5554 /* Try not refetching the state here because I'm getting a duplicate | |
5555 buffer playback (hiccup) */ | |
0 | 5556 alGetSourcei( |
5557 ALmixer_Channel_List[i].alsource, | |
5558 AL_SOURCE_STATE, &state | |
5559 ); | |
1 | 5560 if((error = alGetError()) != AL_NO_ERROR) |
5561 { | |
5562 fprintf(stderr, "54bTesting error: %s\n", | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5563 alGetString(error)); |
1 | 5564 } |
5565 /* Get the number of buffers processed | |
5566 */ | |
5567 alGetSourcei( | |
5568 ALmixer_Channel_List[i].alsource, | |
5569 AL_BUFFERS_PROCESSED, | |
5570 &buffers_processed | |
5571 ); | |
5572 if((error = alGetError()) != AL_NO_ERROR) | |
5573 { | |
5574 fprintf(stderr, "54cError, Can't get buffers_processed: %s\n", | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5575 alGetString(error)); |
1 | 5576 } |
5577 #endif | |
0 | 5578 if(AL_STOPPED == state) |
5579 { | |
5580 /* Resuming in not eof, but nothing to buffer */ | |
1 | 5581 |
5582 /* Okay, here's another lately discovered problem: | |
5583 * I can't find it in the spec, but for at least some of the | |
5584 * implementations, if I call play on a stopped source that | |
5585 * has processed buffers, all those buffers get marked as unprocessed | |
5586 * on alSourcePlay. So if I had a queue of 25 with 24 of the buffers | |
5587 * processed, on resume, the earlier 24 buffers will get replayed, | |
5588 * causing a "hiccup" like sound in the playback. | |
5589 * To avoid this, I must unqueue all processed buffers before | |
5590 * calling play. But to complicate things, I need to worry about resyncing | |
5591 * the circular queue with this since I designed this thing | |
5592 * with some correlation between the two. However, I might | |
5593 * have already handled this, so I will try writing this code without | |
5594 * syncing for now. | |
5595 * There is currently an assumption that a buffer | |
5596 * was queued above so I actually have something | |
5597 * to play. | |
5598 */ | |
5599 ALint temp_count; | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5600 #if 0 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5601 fprintf(stderr, "STOPPED1, need to clear processed=%d, status is:\n", buffers_processed); |
1 | 5602 PrintQueueStatus(ALmixer_Channel_List[i].alsource); |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5603 #endif |
1 | 5604 for(temp_count=0; temp_count<buffers_processed; temp_count++) |
5605 { | |
5606 alSourceUnqueueBuffers( | |
5607 ALmixer_Channel_List[i].alsource, | |
5608 1, &unqueued_buffer_id | |
5609 ); | |
5610 if((error = alGetError()) != AL_NO_ERROR) | |
5611 { | |
5612 fprintf(stderr, "55aTesting error: %s\n", | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5613 alGetString(error)); |
1 | 5614 error_flag--; |
5615 } | |
5616 } | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5617 #if 0 |
1 | 5618 fprintf(stderr, "After unqueue clear...:\n"); |
5619 PrintQueueStatus(ALmixer_Channel_List[i].alsource); | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5620 #endif |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5621 /* My assertion: We are STOPPED but not EOF. |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5622 * This means we have a buffer underrun. |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5623 * We just cleared out the unqueued buffers. |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5624 * So we need to reset the mixer_data to reflect we have |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5625 * no buffers in queue. |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5626 * We need to GetMoreData and then queue up the data. |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5627 * Then we need to resume playing. |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5628 */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5629 #if 0 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5630 int buffers_queued; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5631 alGetSourcei( |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5632 ALmixer_Channel_List[i].alsource, |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5633 AL_BUFFERS_QUEUED, |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5634 &buffers_queued |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5635 ); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5636 |
1 | 5637 if((error = alGetError()) != AL_NO_ERROR) |
5638 { | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5639 fprintf(stderr, "Error in PrintQueueStatus, Can't get buffers_queued: %s\n", |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5640 alGetString(error)); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5641 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5642 assert(buffers_queued == 0); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5643 fprintf(stderr, "buffer underrun: buffers_queued:%d\n", buffers_queued); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5644 #endif |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5645 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5646 /* Reset the number of buffers in use to 0 */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5647 ALmixer_Channel_List[i].almixer_data->num_buffers_in_use = 0; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5648 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5649 /* Get more data and put it in the first buffer */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5650 bytes_returned = GetMoreData( |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5651 ALmixer_Channel_List[i].almixer_data, |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5652 ALmixer_Channel_List[i].almixer_data->buffer[0] |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5653 ); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5654 /* NOTE: We might want to look for EOF and handle it here. |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5655 * Currently, I just let the next loop handle it which seems to be working. |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5656 */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5657 if(bytes_returned > 0) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5658 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5659 /* Queue up the new data */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5660 alSourceQueueBuffers( |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5661 ALmixer_Channel_List[i].alsource, |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5662 1, |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5663 &ALmixer_Channel_List[i].almixer_data->buffer[0] |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5664 ); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5665 if((error = alGetError()) != AL_NO_ERROR) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5666 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5667 fprintf(stderr, "56e alSourceQueueBuffers error: %s\n", |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5668 alGetString(error)); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5669 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5670 /* Increment the number of buffers in use */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5671 ALmixer_Channel_List[i].almixer_data->num_buffers_in_use++; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5672 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5673 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5674 /* We need to empty and update the circular buffer queue if it is in use */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5675 if(ALmixer_Channel_List[i].almixer_data->circular_buffer_queue != NULL) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5676 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5677 ALuint queue_ret_flag; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5678 CircularQueueUnsignedInt_Clear(ALmixer_Channel_List[i].almixer_data->circular_buffer_queue); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5679 queue_ret_flag = CircularQueueUnsignedInt_PushBack( |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5680 ALmixer_Channel_List[i].almixer_data->circular_buffer_queue, |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5681 ALmixer_Channel_List[i].almixer_data->buffer[0] |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5682 ); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5683 if(0 == queue_ret_flag) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5684 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5685 fprintf(stderr, "56fSerious internal error: CircularQueue could not push into queue.\n"); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5686 ALmixer_SetError("Serious internal error: CircularQueue failed to push into queue"); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5687 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5688 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5689 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5690 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5691 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5692 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5693 /* Resume playback from underrun */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5694 alSourcePlay(ALmixer_Channel_List[i].alsource); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5695 if((error = alGetError()) != AL_NO_ERROR) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5696 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5697 fprintf(stderr, "55Tbesting error: %s\n", |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5698 alGetString(error)); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5699 } |
1 | 5700 } |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5701 |
0 | 5702 } |
5703 /* Let's escape to the next loop. | |
5704 * All code below this point is for queuing up | |
5705 */ | |
5706 /* | |
1 | 5707 fprintf(stderr, "Entry: Nothing to do...continue\n\n"); |
5708 */ | |
0 | 5709 continue; |
5710 } | |
5711 /* We now know we have to fill an available | |
5712 * buffer. | |
5713 */ | |
5714 | |
5715 /* In the previous branch, we just grabbed more data. | |
5716 * Let's check it to make sure it's okay, | |
5717 * and then queue it up | |
5718 */ | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5719 /* This check doesn't work anymore because it is now ALuint */ |
0 | 5720 #if 0 |
5721 if(-1 == bytes_returned) | |
5722 { | |
5723 /* Problem occurred...not sure what to do */ | |
5724 /* Go to next loop? */ | |
5725 error_flag--; | |
5726 /* Set the eof flag to force a quit so | |
5727 * we don't get stuck in an infinite loop | |
5728 */ | |
5729 ALmixer_Channel_List[i].almixer_data->eof = 1; | |
5730 continue; | |
5731 } | |
5732 #endif | |
5733 /* This is a special case where we've run | |
5734 * out of data. We should check for loops | |
5735 * and get more data. If there is no loop, | |
5736 * then do nothing and wait for future | |
5737 * update passes to handle the EOF. | |
5738 * The advantage of handling the loop here | |
5739 * instead of waiting for play to stop is | |
5740 * that we should be able to keep the buffer | |
5741 * filled. | |
5742 */ | |
5743 #if 0 | |
5744 else if(0 == bytes_returned) | |
5745 #endif | |
5746 if(0 == bytes_returned) | |
5747 { | |
6
4b1048af7e55
Disabled some of the debugging printfs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
3
diff
changeset
|
5748 /* |
0 | 5749 fprintf(stderr, "We got 0 bytes from reading. Checking for loops\n"); |
6
4b1048af7e55
Disabled some of the debugging printfs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
3
diff
changeset
|
5750 */ |
0 | 5751 /* Check for loops */ |
5752 if( ALmixer_Channel_List[i].loops != 0 ) | |
5753 { | |
5754 /* We have to loop, so rewind | |
5755 * and fetch more data | |
5756 */ | |
6
4b1048af7e55
Disabled some of the debugging printfs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
3
diff
changeset
|
5757 /* |
0 | 5758 fprintf(stderr, "Rewinding data\n"); |
6
4b1048af7e55
Disabled some of the debugging printfs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
3
diff
changeset
|
5759 */ |
0 | 5760 if(0 == Sound_Rewind( |
5761 ALmixer_Channel_List[i].almixer_data->sample)) | |
5762 { | |
5763 fprintf(stderr, "Rewinding failed\n"); | |
5764 ALmixer_SetError( Sound_GetError() ); | |
5765 ALmixer_Channel_List[i].loops = 0; | |
5766 error_flag--; | |
5767 /* We'll continue on because we do have some valid data */ | |
5768 continue; | |
5769 } | |
5770 /* Remember to reset the data->eof flag */ | |
5771 ALmixer_Channel_List[i].almixer_data->eof = 0; | |
5772 if(ALmixer_Channel_List[i].loops > 0) | |
5773 { | |
5774 ALmixer_Channel_List[i].loops--; | |
5775 } | |
5776 /* Try grabbing another packet now. | |
5777 * Since we may have already unqueued a | |
5778 * buffer, we don't want to lose it. | |
5779 */ | |
5780 if(ALmixer_Channel_List[i].almixer_data->num_buffers_in_use | |
5781 < ALmixer_Channel_List[i].almixer_data->max_queue_buffers) | |
5782 { | |
6
4b1048af7e55
Disabled some of the debugging printfs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
3
diff
changeset
|
5783 /* |
0 | 5784 fprintf(stderr, "We got %d bytes from reading loop. Filling unused packet\n", bytes_returned); |
6
4b1048af7e55
Disabled some of the debugging printfs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
3
diff
changeset
|
5785 */ |
0 | 5786 /* Grab next packet */ |
5787 bytes_returned = GetMoreData( | |
5788 ALmixer_Channel_List[i].almixer_data, | |
5789 ALmixer_Channel_List[i].almixer_data->buffer[ | |
5790 ALmixer_Channel_List[i].almixer_data->num_buffers_in_use] | |
5791 ); | |
6
4b1048af7e55
Disabled some of the debugging printfs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
3
diff
changeset
|
5792 /* |
0 | 5793 fprintf(stderr, "We reread %d bytes into unused packet\n", bytes_returned); |
6
4b1048af7e55
Disabled some of the debugging printfs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
3
diff
changeset
|
5794 */ |
0 | 5795 } |
5796 /* Refilling unqueued packet */ | |
5797 else | |
5798 { | |
6
4b1048af7e55
Disabled some of the debugging printfs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
3
diff
changeset
|
5799 /* |
0 | 5800 fprintf(stderr, "We got %d bytes from reading loop. Filling unqueued packet\n", bytes_returned); |
6
4b1048af7e55
Disabled some of the debugging printfs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
3
diff
changeset
|
5801 */ |
0 | 5802 /* Grab next packet */ |
5803 bytes_returned = GetMoreData( | |
5804 ALmixer_Channel_List[i].almixer_data, | |
5805 unqueued_buffer_id); | |
6
4b1048af7e55
Disabled some of the debugging printfs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
3
diff
changeset
|
5806 /* |
0 | 5807 fprintf(stderr, "We reread %d bytes into unqueued packet\n", bytes_returned); |
6
4b1048af7e55
Disabled some of the debugging printfs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
3
diff
changeset
|
5808 */ |
0 | 5809 } |
5810 /* Another error check */ | |
5811 /* | |
5812 if(bytes_returned <= 0) | |
5813 */ | |
5814 if(0 == bytes_returned) | |
5815 { | |
5816 fprintf(stderr, "??????????ERROR\n"); | |
5817 ALmixer_SetError("Could not loop because after rewind, no data could be retrieved"); | |
5818 /* Problem occurred...not sure what to do */ | |
5819 /* Go to next loop? */ | |
5820 error_flag--; | |
5821 /* Set the eof flag to force a quit so | |
5822 * we don't get stuck in an infinite loop | |
5823 */ | |
5824 ALmixer_Channel_List[i].almixer_data->eof = 1; | |
5825 continue; | |
5826 } | |
5827 /* We made it to the end. We still need | |
5828 * to BufferData, so let this branch | |
5829 * fall into the next piece of | |
5830 * code below which will handle that | |
5831 */ | |
5832 | |
5833 | |
5834 } /* END loop check */ | |
5835 else | |
5836 { | |
5837 /* No more loops to do. | |
5838 * EOF flag should be set. | |
5839 * Just go to next loop and | |
5840 * let things be handled correctly | |
5841 * in future update calls | |
5842 */ | |
1 | 5843 /* |
0 | 5844 fprintf(stderr, "SHOULD BE EOF\n"); |
5845 | |
5846 PrintQueueStatus(ALmixer_Channel_List[i].alsource); | |
1 | 5847 */ |
0 | 5848 continue; |
5849 } | |
5850 } /* END if bytes_returned == 0 */ | |
5851 /********* Possible trouble point. I might be queueing empty buffers on the mac. | |
5852 * This check doesn't say if the buffer is valid. Only the EOF assumption is a clue at this point | |
5853 */ | |
5854 /* Fall here */ | |
5855 /* Everything is normal. We aren't | |
5856 * at an EOF, but need to simply | |
5857 * queue more data. The data is already checked for good, | |
5858 * so queue it up */ | |
5859 if(ALmixer_Channel_List[i].almixer_data->num_buffers_in_use | |
5860 < ALmixer_Channel_List[i].almixer_data->max_queue_buffers) | |
5861 { | |
5862 /* Keep count of how many buffers we have | |
5863 * to queue so we can return the value | |
5864 */ | |
5865 retval++; | |
1 | 5866 /* |
0 | 5867 fprintf(stderr, "NOT_EOF???, about to Queue more data for num_buffers (%d) < max_queue (%d)\n", |
5868 ALmixer_Channel_List[i].almixer_data->num_buffers_in_use, | |
5869 ALmixer_Channel_List[i].almixer_data->max_queue_buffers); | |
1 | 5870 */ |
0 | 5871 alSourceQueueBuffers( |
5872 ALmixer_Channel_List[i].alsource, | |
5873 1, | |
5874 &ALmixer_Channel_List[i].almixer_data->buffer[ | |
5875 ALmixer_Channel_List[i].almixer_data->num_buffers_in_use] | |
5876 ); | |
5877 if((error = alGetError()) != AL_NO_ERROR) | |
5878 { | |
5879 fprintf(stderr, "56Testing error: %s\n", | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5880 alGetString(error)); |
0 | 5881 } |
5882 /* This is part of the hideous Nvidia workaround. In order to figure out | |
5883 * which buffer to show during callbacks (for things like | |
5884 * o-scopes), I must keep a copy of the buffers that are queued in my own | |
5885 * data structure. This code will be called only if | |
5886 * "access_data" was set, indicated by whether the queue is NULL. | |
5887 */ | |
5888 if(ALmixer_Channel_List[i].almixer_data->circular_buffer_queue != NULL) | |
5889 { | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5890 ALuint queue_ret_flag; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5891 // fprintf(stderr, "56d: CircularQueue_PushBack.\n"); |
0 | 5892 queue_ret_flag = CircularQueueUnsignedInt_PushBack( |
5893 ALmixer_Channel_List[i].almixer_data->circular_buffer_queue, | |
5894 ALmixer_Channel_List[i].almixer_data->buffer[ALmixer_Channel_List[i].almixer_data->num_buffers_in_use] | |
5895 ); | |
5896 if(0 == queue_ret_flag) | |
5897 { | |
5898 fprintf(stderr, "56aSerious internal error: CircularQueue could not push into queue.\n"); | |
5899 ALmixer_SetError("Serious internal error: CircularQueue failed to push into queue"); | |
5900 } | |
5901 /* | |
5902 else | |
5903 { | |
5904 CircularQueueUnsignedInt_Print(ALmixer_Channel_List[i].almixer_data->circular_buffer_queue); | |
5905 } | |
5906 */ | |
5907 } | |
5908 } | |
5909 /* for processed > 0 */ | |
5910 else | |
5911 { | |
5912 /* Keep count of how many buffers we have | |
5913 * to queue so we can return the value | |
5914 */ | |
5915 retval++; | |
5916 /* | |
5917 fprintf(stderr, "NOT_EOF, about to Queue more data for filled max_queue (%d)\n", | |
5918 ALmixer_Channel_List[i].almixer_data->max_queue_buffers); | |
5919 */ | |
5920 alSourceQueueBuffers( | |
5921 ALmixer_Channel_List[i].alsource, | |
5922 1, &unqueued_buffer_id); | |
5923 if((error = alGetError()) != AL_NO_ERROR) | |
5924 { | |
5925 ALmixer_SetError("Could not QueueBuffer: %s", | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5926 alGetString(error) ); |
0 | 5927 error_flag--; |
5928 continue; | |
5929 } | |
5930 /* This is part of the hideous Nvidia workaround. In order to figure out | |
5931 * which buffer to show during callbacks (for things like | |
5932 * o-scopes), I must keep a copy of the buffers that are queued in my own | |
5933 * data structure. This code will be called only if | |
5934 * "access_data" was set, indicated by whether the queue is NULL. | |
5935 */ | |
5936 if(ALmixer_Channel_List[i].almixer_data->circular_buffer_queue != NULL) | |
5937 { | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5938 ALuint queue_ret_flag; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5939 // fprintf(stderr, "56e: CircularQueue_PushBack.\n"); |
0 | 5940 queue_ret_flag = CircularQueueUnsignedInt_PushBack( |
5941 ALmixer_Channel_List[i].almixer_data->circular_buffer_queue, | |
5942 unqueued_buffer_id | |
5943 ); | |
5944 if(0 == queue_ret_flag) | |
5945 { | |
5946 fprintf(stderr, "56bSerious internal error: CircularQueue could not push into queue.\n"); | |
5947 ALmixer_SetError("Serious internal error: CircularQueue failed to push into queue"); | |
5948 } | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5949 #if 0 |
0 | 5950 else |
5951 { | |
5952 CircularQueueUnsignedInt_Print(ALmixer_Channel_List[i].almixer_data->circular_buffer_queue); | |
5953 } | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5954 #endif |
0 | 5955 } |
5956 } | |
5957 /* If we used an available buffer queue, | |
5958 * then we need to update the number of them in use | |
5959 */ | |
5960 if(ALmixer_Channel_List[i].almixer_data->num_buffers_in_use | |
5961 < ALmixer_Channel_List[i].almixer_data->max_queue_buffers) | |
5962 { | |
5963 /* Increment the number of buffers in use */ | |
5964 ALmixer_Channel_List[i].almixer_data->num_buffers_in_use++; | |
5965 } | |
5966 /* Might want to check state */ | |
5967 /* In case the playback stopped, | |
5968 * we need to resume */ | |
1 | 5969 #if 1 |
5970 /* Try not refetching the state here because I'm getting a duplicate | |
5971 buffer playback (hiccup) */ | |
0 | 5972 alGetSourcei( |
5973 ALmixer_Channel_List[i].alsource, | |
5974 AL_SOURCE_STATE, &state | |
5975 ); | |
1 | 5976 if((error = alGetError()) != AL_NO_ERROR) |
5977 { | |
5978 fprintf(stderr, "57bTesting error: %s\n", | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5979 alGetString(error)); |
1 | 5980 } |
5981 /* Get the number of buffers processed | |
5982 */ | |
5983 alGetSourcei( | |
5984 ALmixer_Channel_List[i].alsource, | |
5985 AL_BUFFERS_PROCESSED, | |
5986 &buffers_processed | |
5987 ); | |
5988 if((error = alGetError()) != AL_NO_ERROR) | |
5989 { | |
5990 fprintf(stderr, "57cError, Can't get buffers_processed: %s\n", | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
5991 alGetString(error)); |
1 | 5992 } |
5993 #endif | |
0 | 5994 if(AL_STOPPED == state) |
5995 { | |
1 | 5996 /* |
0 | 5997 fprintf(stderr, "Resuming in not eof\n"); |
1 | 5998 */ |
5999 /* Okay, here's another lately discovered problem: | |
6000 * I can't find it in the spec, but for at least some of the | |
6001 * implementations, if I call play on a stopped source that | |
6002 * has processed buffers, all those buffers get marked as unprocessed | |
6003 * on alSourcePlay. So if I had a queue of 25 with 24 of the buffers | |
6004 * processed, on resume, the earlier 24 buffers will get replayed, | |
6005 * causing a "hiccup" like sound in the playback. | |
6006 * To avoid this, I must unqueue all processed buffers before | |
6007 * calling play. But to complicate things, I need to worry about resyncing | |
6008 * the circular queue with this since I designed this thing | |
6009 * with some correlation between the two. However, I might | |
6010 * have already handled this, so I will try writing this code without | |
6011 * syncing for now. | |
6012 * There is currently an assumption that a buffer | |
6013 * was queued above so I actually have something | |
6014 * to play. | |
6015 */ | |
6016 ALint temp_count; | |
6017 /* | |
6018 fprintf(stderr, "STOPPED2, need to clear processed, status is:\n"); | |
6019 PrintQueueStatus(ALmixer_Channel_List[i].alsource); | |
6020 */ | |
6021 | |
6022 for(temp_count=0; temp_count<buffers_processed; temp_count++) | |
6023 { | |
6024 alSourceUnqueueBuffers( | |
6025 ALmixer_Channel_List[i].alsource, | |
6026 1, &unqueued_buffer_id | |
6027 ); | |
6028 if((error = alGetError()) != AL_NO_ERROR) | |
6029 { | |
6030 fprintf(stderr, "58aTesting error: %s\n", | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6031 alGetString(error)); |
1 | 6032 error_flag--; |
6033 } | |
6034 } | |
6035 /* | |
6036 fprintf(stderr, "After unqueue clear...:\n"); | |
6037 PrintQueueStatus(ALmixer_Channel_List[i].alsource); | |
6038 */ | |
6039 | |
6040 alSourcePlay(ALmixer_Channel_List[i].alsource); | |
6041 if((error = alGetError()) != AL_NO_ERROR) | |
6042 { | |
6043 fprintf(stderr, "55Tbesting 8rror: %s\n", | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6044 alGetString(error)); |
1 | 6045 } |
0 | 6046 } |
6047 continue; | |
6048 } /* END if( ! eof) */ | |
6049 /* We have hit EOF in the SDL_Sound sample and there | |
6050 * are no more loops. However, there may still be | |
6051 * buffers in the OpenAL queue which still need to | |
6052 * be played out. The following body of code will | |
6053 * determine if play is still happening or | |
6054 * initiate the stop/cleanup sequenece. | |
6055 */ | |
6056 else | |
6057 { | |
6058 /* Let's continue to remove the used up | |
6059 * buffers as they come in. */ | |
6060 if(buffers_processed > 0) | |
6061 { | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6062 ALint temp_count; |
0 | 6063 /* Do as a for-loop because I don't want |
6064 * to have to create an array for the | |
6065 * unqueued_buffer_id's | |
6066 */ | |
6067 for(temp_count=0; temp_count<buffers_processed; temp_count++) | |
6068 { | |
6
4b1048af7e55
Disabled some of the debugging printfs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
3
diff
changeset
|
6069 /* |
0 | 6070 fprintf(stderr, "unqueuing remainder, %d\n", temp_count); |
6
4b1048af7e55
Disabled some of the debugging printfs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
3
diff
changeset
|
6071 */ |
0 | 6072 alSourceUnqueueBuffers( |
6073 ALmixer_Channel_List[i].alsource, | |
6074 1, &unqueued_buffer_id | |
6075 ); | |
6076 if((error = alGetError()) != AL_NO_ERROR) | |
6077 { | |
6078 fprintf(stderr, "59Testing error: %s\n", | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6079 alGetString(error)); |
0 | 6080 } |
6081 } | |
6
4b1048af7e55
Disabled some of the debugging printfs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
3
diff
changeset
|
6082 /* |
0 | 6083 fprintf(stderr, "done unqueuing remainder for this loop, %d\n", temp_count); |
6
4b1048af7e55
Disabled some of the debugging printfs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
3
diff
changeset
|
6084 */ |
4b1048af7e55
Disabled some of the debugging printfs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
3
diff
changeset
|
6085 |
0 | 6086 /* Need to update counts since we removed everything. |
6087 * If we don't update the counts here, we end up in the | |
6088 * "Shouldn't be here section, but maybe it's okay due to race conditions" | |
6089 */ | |
6090 alGetSourcei( | |
6091 ALmixer_Channel_List[i].alsource, | |
6092 AL_BUFFERS_QUEUED, &buffers_still_queued | |
6093 ); | |
6094 if((error = alGetError()) != AL_NO_ERROR) | |
6095 { | |
6096 fprintf(stderr, "5100Testing error: %s\n", | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6097 alGetString(error)); |
0 | 6098 } |
6099 /* Get the number of buffers processed | |
6100 * so we know if we need to refill | |
6101 */ | |
6102 alGetSourcei( | |
6103 ALmixer_Channel_List[i].alsource, | |
6104 AL_BUFFERS_PROCESSED, &buffers_processed | |
6105 ); | |
6106 if((error = alGetError()) != AL_NO_ERROR) | |
6107 { | |
6108 fprintf(stderr, "5200Testing error: %s\n", | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6109 alGetString(error)); |
0 | 6110 } |
6111 } | |
6112 | |
6113 | |
6114 /* Else if buffers_processed == 0 | |
6115 * and buffers_still_queued == 0. | |
6116 * then we check to see if the source | |
6117 * is still playing. Quit if stopped | |
6118 * We shouldn't need to worry about | |
6119 * looping because that should have | |
6120 * been handled above. | |
6121 */ | |
6122 if(0 == buffers_still_queued) | |
6123 { | |
6124 /* Make sure playback has stopped before | |
6125 * we shutdown. | |
6126 */ | |
6127 alGetSourcei( | |
6128 ALmixer_Channel_List[i].alsource, | |
6129 AL_SOURCE_STATE, &state | |
6130 ); | |
6131 if((error = alGetError()) != AL_NO_ERROR) | |
6132 { | |
6133 fprintf(stderr, "60Testing error: %s\n", | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6134 alGetString(error)); |
0 | 6135 } |
6136 if(AL_STOPPED == state) | |
6137 { | |
6138 ALmixer_Channel_List[i].almixer_data->num_buffers_in_use = 0; | |
6139 /* Playback has ended. | |
6140 * Loop if necessary, or launch callback | |
6141 * and clear channel (or clear channel and | |
6142 * then launch callback?) | |
10
c808684660a7
Bug fix: Moved Invoke_Callback before CleanChannel because I was trying to get the ALmixer_Data pointer, but it was cleared:
Eric Wing <ewing . public |-at-| gmail . com>
parents:
6
diff
changeset
|
6143 * Update: Need to do callback first because I reference the mixer_data and source |
0 | 6144 */ |
10
c808684660a7
Bug fix: Moved Invoke_Callback before CleanChannel because I was trying to get the ALmixer_Data pointer, but it was cleared:
Eric Wing <ewing . public |-at-| gmail . com>
parents:
6
diff
changeset
|
6145 |
c808684660a7
Bug fix: Moved Invoke_Callback before CleanChannel because I was trying to get the ALmixer_Data pointer, but it was cleared:
Eric Wing <ewing . public |-at-| gmail . com>
parents:
6
diff
changeset
|
6146 /* Launch callback */ |
c808684660a7
Bug fix: Moved Invoke_Callback before CleanChannel because I was trying to get the ALmixer_Data pointer, but it was cleared:
Eric Wing <ewing . public |-at-| gmail . com>
parents:
6
diff
changeset
|
6147 Invoke_Channel_Done_Callback(i, AL_TRUE); |
c808684660a7
Bug fix: Moved Invoke_Callback before CleanChannel because I was trying to get the ALmixer_Data pointer, but it was cleared:
Eric Wing <ewing . public |-at-| gmail . com>
parents:
6
diff
changeset
|
6148 |
0 | 6149 Clean_Channel(i); |
6150 /* Subtract counter */ | |
6151 Is_Playing_global--; | |
6152 | |
6153 | |
6154 /* We're done for this loop. | |
6155 * Go to next channel | |
6156 */ | |
6157 continue; | |
6158 } | |
6159 } /* End end-playback */ | |
6160 else | |
6161 { | |
6162 /* Need to run out buffer */ | |
6163 #if 1 | |
6164 /* Might want to check state */ | |
6165 /* In case the playback stopped, | |
6166 * we need to resume */ | |
6167 alGetSourcei( | |
6168 ALmixer_Channel_List[i].alsource, | |
6169 AL_SOURCE_STATE, &state | |
6170 ); | |
6171 if((error = alGetError()) != AL_NO_ERROR) | |
6172 { | |
6173 fprintf(stderr, "61Testing error: %s\n", | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6174 alGetString(error)); |
0 | 6175 } |
6176 if(AL_STOPPED == state) | |
6177 { | |
6
4b1048af7e55
Disabled some of the debugging printfs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
3
diff
changeset
|
6178 /* |
0 | 6179 fprintf(stderr, "Shouldn't be here. %d Buffers still in queue, but play stopped. This might be correct though because race conditions could have caused the STOP to happen right after our other tests...Checking queue status...\n", buffers_still_queued); |
6
4b1048af7e55
Disabled some of the debugging printfs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
3
diff
changeset
|
6180 */ |
1 | 6181 /* |
0 | 6182 PrintQueueStatus(ALmixer_Channel_List[i].alsource); |
1 | 6183 */ |
0 | 6184 /* Rather than force unqueuing the buffer, let's see if |
6185 * setting the buffer to none works (the OpenAL 1.0 | |
6186 * Reference Annotation suggests this should work). | |
6187 */ | |
6188 alSourcei(ALmixer_Channel_List[i].alsource, | |
6189 AL_BUFFER, AL_NONE); | |
6190 /* | |
6191 PrintQueueStatus(ALmixer_Channel_List[i].alsource); | |
6192 */ | |
6193 /* This doesn't work because in some cases, I think | |
6194 * it causes the sound to be replayed | |
6195 */ | |
6196 /* | |
6197 fprintf(stderr, "Resuming in eof (trying to run out buffers\n"); | |
6198 alSourcePlay(ALmixer_Channel_List[i].alsource); | |
6199 */ | |
6200 } | |
6201 #endif | |
6202 } /* End trap section */ | |
6203 } /* End POST-EOF use-up buffer section */ | |
28
60500a33735a
Initial backend changes to decouple assumption of 1 buffer queued per channel / per pass. API will eventually be changed/broken to support this.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
27
diff
changeset
|
6204 |
60500a33735a
Initial backend changes to decouple assumption of 1 buffer queued per channel / per pass. API will eventually be changed/broken to support this.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
27
diff
changeset
|
6205 } /* END NEW number of queue buffers per pass */ |
60500a33735a
Initial backend changes to decouple assumption of 1 buffer queued per channel / per pass. API will eventually be changed/broken to support this.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
27
diff
changeset
|
6206 |
0 | 6207 } /* END Streamed section */ |
6208 } /* END channel in use */ | |
6209 } /* END for-loop for each channel */ | |
6210 | |
6211 #ifdef ENABLE_ALMIXER_ALC_SYNC | |
6212 alcProcessContext(alcGetCurrentContext()); | |
6213 if((error = alGetError()) != AL_NO_ERROR) | |
6214 { | |
6215 fprintf(stderr, "62Testing error: %s\n", | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6216 alGetString(error)); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6217 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6218 #endif |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6219 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6220 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6221 SDL_UnlockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6222 #endif |
0 | 6223 /* Return the number of errors */ |
6224 if(error_flag < 0) | |
6225 { | |
6226 return error_flag; | |
6227 } | |
6228 /* Return the number of buffers that were queued */ | |
6229 return retval; | |
6230 } | |
6231 | |
6232 #ifdef ENABLE_PARANOID_SIGNEDNESS_CHECK | |
6233 /* This is only here so we can call SDL_OpenAudio() */ | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6234 static void my_dummy_audio_callback(void* userdata, ALbyte* stream, int len) |
0 | 6235 { |
6236 } | |
6237 #endif | |
6238 | |
6239 | |
6240 | |
6241 | |
6242 #ifdef ENABLE_ALMIXER_THREADS | |
6243 /* We might need threads. We | |
6244 * must constantly poll OpenAL to find out | |
6245 * if sound is being streamed, if play has | |
6246 * ended, etc. Without threads, this must | |
6247 * be explicitly done by the user. | |
6248 * We could try to do it for them if we | |
6249 * finish the threads. | |
6250 */ | |
6251 | |
6252 static int Stream_Data_Thread_Callback(void* data) | |
6253 { | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6254 ALint retval; |
0 | 6255 |
31
ad4eb4330fb0
Added initialized check in Begin/End interruption.
Eric Wing <ewing@anscamobile.com>
parents:
30
diff
changeset
|
6256 while(AL_TRUE == g_StreamThreadEnabled) |
0 | 6257 { |
6258 retval = Update_ALmixer(data); | |
6259 /* 0 means that nothing needed updating and | |
6260 * the function returned quickly | |
6261 */ | |
6262 if(0 == retval) | |
6263 { | |
6264 /* Let's be nice and make the thread sleep since | |
6265 * little work was done in update | |
6266 */ | |
6267 /* Make sure times are multiples of 10 | |
6268 * for optimal performance and accuracy in Linux | |
6269 */ | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6270 ALmixer_Delay(10); |
0 | 6271 } |
6272 else | |
6273 { | |
6274 /* should I also be sleeping/yielding here? */ | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6275 ALmixer_Delay(0); |
0 | 6276 } |
6277 } | |
6
4b1048af7e55
Disabled some of the debugging printfs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
3
diff
changeset
|
6278 /* |
0 | 6279 fprintf(stderr, "Thread is closing\n"); |
6
4b1048af7e55
Disabled some of the debugging printfs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
3
diff
changeset
|
6280 */ |
0 | 6281 return 0; |
6282 } | |
6283 #endif /* End of ENABLE_ALMIXER_THREADS */ | |
6284 | |
6285 | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6286 /* SDL/SDL_mixer returns -1 on error and 0 on success. |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6287 * I actually prefer false/true conventions (SDL_Sound/OpenAL/GL) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6288 * so SDL_mixer porting people beware. |
0 | 6289 * Warning: SDL_QuitSubSystem(SDL_INIT_AUDIO) is called which |
6290 * means the SDL audio system will be disabled. It will not | |
6291 * be restored (in case SDL is not actually being used) so | |
6292 * the user will need to restart it if they need it after | |
6293 * OpenAL shuts down. | |
6294 */ | |
22
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
6295 ALboolean ALmixer_Init(ALuint frequency, ALuint num_sources, ALuint refresh) |
0 | 6296 { |
6297 ALCdevice* dev; | |
6298 ALCcontext* context; | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6299 ALint i; |
0 | 6300 ALenum error; |
6301 ALuint* source; | |
6302 | |
6303 #ifdef USING_LOKI_AL_DIST | |
6304 /* The Loki dist requires that I set both the | |
6305 * device and context frequency values separately | |
6306 */ | |
6307 /* Hope this won't overflow */ | |
6308 char device_string[256]; | |
6309 #endif | |
6310 | |
6311 /* (Venting frustration) Damn it! Nobody bothered | |
6312 * documenting how you're supposed to use an attribute | |
6313 * list. In fact, the not even the Loki test program | |
6314 * writers seem to know because they use it inconsistently. | |
6315 * For example, how do you terminate that attribute list? | |
6316 * The Loki test code does it 3 different ways. They | |
6317 * set the last value to 0, or they set it to ALC_INVALID, | |
6318 * or they set two final values: ALC_INVALID, 0 | |
6319 * In Loki, 0 and ALC_INVALID happen to be the same, | |
6320 * but with Creative Labs ALC_INVALID is -1. | |
6321 * So something's going to break. Loki's source | |
6322 * code says to terminate with ALC_INVALID. But I | |
6323 * don't know if that's really true, or it happens | |
6324 * to be a coinicidence because it's defined to 0. | |
6325 * Creative provides no source code, so I can't look at how | |
6326 * they terminate it. | |
6327 * So this is really, really ticking me off... | |
6328 * For now, I'm going to use ALC_INVALID. | |
6329 * (Update...after further review of the API spec, | |
6330 * it seems that a NULL terminated string is the correct | |
6331 * termination value to use, so 0 it is.) | |
6332 */ | |
6333 #if 0 | |
6334 ALint attrlist[] = { | |
6335 ALC_FREQUENCY, ALMIXER_DEFAULT_FREQUENCY, | |
6336 /* Don't know anything about these values. | |
6337 * Trust defaults? */ | |
6338 /* Supposed to be the refresh rate in Hz. | |
6339 * I think 15-120 are supposed to be good | |
6340 * values. Though I haven't gotten any effect except | |
6341 * for one strange instance on a Mac. But it was | |
6342 * unrepeatable. | |
6343 */ | |
6344 #if 0 | |
6345 ALC_REFRESH, 15, | |
6346 #endif | |
6347 /* Sync requires a alcProcessContext() call | |
6348 * for every cycle. By default, this is | |
6349 * not used and the value is AL_FALSE | |
6350 * because it will probably perform | |
6351 * pretty badly for me. | |
6352 */ | |
6353 #ifdef ENABLE_ALMIXER_ALC_SYNC | |
6354 ALC_SYNC, AL_TRUE, | |
6355 #else | |
6356 ALC_SYNC, AL_FALSE, | |
6357 #endif | |
6358 /* Looking at the API spec, it implies | |
6359 * that the list be a NULL terminated string | |
6360 * so it's probably not safe to use ALC_INVALID | |
6361 */ | |
6362 /* | |
6363 ALC_INVALID }; | |
6364 */ | |
6365 '\0'}; | |
6366 #endif | |
6367 /* Redo: I'm going to allow ALC_REFRESH to be set. | |
6368 * However, if no value is specified, I don't | |
6369 * want it in the list so I can get the OpenAL defaults | |
6370 */ | |
6371 ALint attrlist[7]; | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6372 ALsizei current_attrlist_index = 0; |
0 | 6373 |
6374 #ifdef ENABLE_PARANOID_SIGNEDNESS_CHECK | |
6375 /* More problems: I'm getting bit by endian/signedness issues on | |
6376 * different platforms. I can find the endianess easily enough, | |
6377 * but I don't know how to determine what the correct signedness | |
6378 * is (if such a thing exists). I do know that if I try using | |
6379 * unsigned on OSX with an originally signed sample, I get | |
6380 * distortion. However, I don't have any native unsigned samples | |
6381 * to test. But I'm assuming that the platform must be in the | |
6382 * correct signedness no matter what. | |
6383 * I can either assume everybody is signed, or I can try to | |
6384 * determine the value. If I try to determine the values, | |
6385 * I think my only ability to figure it out will be to open | |
6386 * SDL_Audio, and read what the obtained settings were. | |
6387 * Then shutdown everything. However, I don't even know how | |
6388 * reliable this is. | |
6389 * Update: I think I resolved the issues...forgot to update | |
6390 * these comments when it happened. I should check the revision control | |
6391 * log... Anyway, I think the issue was partly related to me not | |
6392 * doing something correctly with the AudioInfo or some kind | |
6393 * of stupid endian bug in my code, and weirdness ensued. Looking at the | |
6394 * revision control, I think I might have assumed that SDL_Sound would | |
6395 * do the right thing with a NULL AudioInfo, but I was incorrect, | |
6396 * and had to fill one out myself. | |
6397 */ | |
6398 SDL_AudioSpec desired; | |
6399 SDL_AudioSpec obtained; | |
6400 #endif | |
6401 | |
6402 | |
6403 /* Make sure ALmixer isn't already initialized */ | |
6404 if(ALmixer_Initialized) | |
6405 { | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6406 return AL_FALSE; |
0 | 6407 } |
6408 | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6409 #ifdef ALMIXER_COMPILE_WITHOUT_SDL |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6410 ALmixer_InitTime(); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6411 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6412 /* Note: The pool may have been created on previous Init's */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6413 /* I leave the pool allocated allocated in case the user wants |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6414 * to read the pool in case of a failure (such as in this function). |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6415 * This is not actually a leak. |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6416 */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6417 if(NULL == s_ALmixerErrorPool) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6418 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6419 s_ALmixerErrorPool = TError_CreateErrorPool(); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6420 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6421 if(NULL == s_ALmixerErrorPool) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6422 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6423 return AL_FALSE; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6424 } |
6
4b1048af7e55
Disabled some of the debugging printfs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
3
diff
changeset
|
6425 /* |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6426 fprintf(stderr, "tError Test0\n"); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6427 ALmixer_SetError("Initing (and testing SetError)"); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6428 fprintf(stderr, "tError Test1: %s\n", ALmixer_GetError()); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6429 fprintf(stderr, "tError Test2: %s\n", ALmixer_GetError()); |
6
4b1048af7e55
Disabled some of the debugging printfs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
3
diff
changeset
|
6430 */ |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6431 #endif |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6432 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6433 |
0 | 6434 /* Set the defaults */ |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6435 /* |
0 | 6436 attrlist[0] = ALC_FREQUENCY; |
6437 attrlist[1] = ALMIXER_DEFAULT_FREQUENCY; | |
6438 attrlist[2] = ALC_SYNC; | |
6439 #ifdef ENABLE_ALMIXER_ALC_SYNC | |
6440 attrlist[3] = ALC_TRUE; | |
6441 #else | |
6442 attrlist[3] = ALC_FALSE; | |
6443 #endif | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6444 */ |
0 | 6445 /* Set frequency value if it is not 0 */ |
6446 if(0 != frequency) | |
6447 { | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6448 attrlist[current_attrlist_index] = ALC_FREQUENCY; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6449 current_attrlist_index++; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6450 attrlist[current_attrlist_index] = (ALint)frequency; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6451 current_attrlist_index++; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6452 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6453 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6454 #ifdef ENABLE_ALMIXER_ALC_SYNC |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6455 attrlist[current_attrlist_index] = ALC_SYNC; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6456 current_attrlist_index++; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6457 attrlist[current_attrlist_index] = ALC_TRUE; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6458 current_attrlist_index++; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6459 #endif |
0 | 6460 |
6461 /* If the user specifies a refresh value, | |
6462 * make room for it | |
6463 */ | |
6464 if(0 != refresh) | |
6465 { | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6466 attrlist[current_attrlist_index] = (ALint)ALC_REFRESH; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6467 current_attrlist_index++; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6468 attrlist[current_attrlist_index] = refresh; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6469 current_attrlist_index++; |
0 | 6470 } |
6471 | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6472 /* End attribute list */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6473 attrlist[current_attrlist_index] = '\0'; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6474 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6475 |
0 | 6476 /* Initialize SDL_Sound */ |
6477 if(! Sound_Init() ) | |
6478 { | |
6479 ALmixer_SetError(Sound_GetError()); | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6480 return AL_FALSE; |
0 | 6481 } |
6482 #ifdef ENABLE_PARANOID_SIGNEDNESS_CHECK | |
6483 /* Here is the paranoid check that opens | |
6484 * SDL audio in an attempt to find the correct | |
6485 * system values. | |
6486 */ | |
6487 /* Doesn't have to be the actual value I think | |
6488 * (as long as it doesn't influence format, in | |
6489 * which case I'm probably screwed anyway because OpenAL | |
6490 * may easily choose to do something else). | |
6491 */ | |
6492 desired.freq = 44100; | |
6493 desired.channels = 2; | |
6494 desired.format = AUDIO_S16SYS; | |
6495 desired.callback = my_dummy_audio_callback; | |
6496 if(SDL_OpenAudio(&desired, &obtained) >= 0) | |
6497 { | |
6498 SIGN_TYPE_16BIT_FORMAT = obtained.format; | |
6499 /* Now to get really paranoid, we should probably | |
6500 * also assume that the 8bit format is also the | |
6501 * same sign type and set that value | |
6502 */ | |
6503 if(AUDIO_S16SYS == obtained.format) | |
6504 { | |
6505 SIGN_TYPE_8BIT_FORMAT = AUDIO_S8; | |
6506 } | |
6507 /* Should be AUDIO_U16SYS */ | |
6508 else | |
6509 { | |
6510 SIGN_TYPE_8BIT_FORMAT = AUDIO_U8; | |
6511 } | |
6512 SDL_CloseAudio(); | |
6513 } | |
6514 else | |
6515 { | |
6516 /* Well, I guess I'm in trouble. I guess it's my best guess | |
6517 */ | |
6518 SIGN_TYPE_16_BIT_FORMAT = AUDIO_S16SYS; | |
6519 SIGN_TYPE_8_BIT_FORMAT = AUDIO_S8; | |
6520 } | |
6521 #endif | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6522 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6523 #ifndef ALMIXER_COMPILE_WITHOUT_SDL |
0 | 6524 /* Weirdness: It seems that SDL_Init(SDL_INIT_AUDIO) |
6525 * causes OpenAL and SMPEG to conflict. For some reason | |
6526 * if SDL_Init on audio is active, then all the SMPEG | |
6527 * decoded sound comes out silent. Unfortunately, | |
6528 * Sound_Init() invokes SDL_Init on audio. I'm | |
6529 * not sure why it actually needs it... | |
6530 * But we'll attempt to disable it here after the | |
6531 * SDL_Sound::Init call and hope it doesn't break SDL_Sound. | |
6532 */ | |
6533 SDL_QuitSubSystem(SDL_INIT_AUDIO); | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6534 #endif |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6535 |
0 | 6536 /* I'm told NULL will call the default string |
6537 * and hopefully do the right thing for each platform | |
6538 */ | |
6539 /* | |
6540 dev = alcOpenDevice( NULL ); | |
6541 */ | |
6542 /* Now I'm told I need to set both the device and context | |
6543 * to have the same sampling rate, so I must pass a string | |
6544 * to OpenDevice(). I don't know how portable these strings are. | |
6545 * I don't even know if the format for strings is | |
6546 * compatible | |
6547 * From the testattrib.c in the Loki test section | |
6548 * dev = alcOpenDevice( (const ALubyte *) "'((sampling-rate 22050))" ); | |
6549 */ | |
6550 | |
6551 #ifdef USING_LOKI_AL_DIST | |
6552 sprintf(device_string, "'((sampling-rate %d))", attrlist[1]); | |
6553 dev = alcOpenDevice( (const ALubyte *) device_string ); | |
6554 #else | |
6555 dev = alcOpenDevice( NULL ); | |
6556 #endif | |
6557 if(NULL == dev) | |
6558 { | |
6559 ALmixer_SetError("Cannot open sound device for OpenAL"); | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6560 return AL_FALSE; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6561 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6562 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6563 #ifdef __APPLE__ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6564 /* The ALC_FREQUENCY attribute is ignored with Apple's implementation. */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6565 /* This extension must be called before the context is created. */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6566 if(0 != frequency) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6567 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6568 Internal_alcMacOSXMixerOutputRate((ALdouble)frequency); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6569 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6570 ALmixer_Frequency_global = (ALuint)Internal_alcMacOSXGetMixerOutputRate(); |
6
4b1048af7e55
Disabled some of the debugging printfs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
3
diff
changeset
|
6571 /* |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6572 fprintf(stderr, "Internal_alcMacOSXMixerOutputRate is: %lf", Internal_alcMacOSXGetMixerOutputRate()); |
6
4b1048af7e55
Disabled some of the debugging printfs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
3
diff
changeset
|
6573 */ |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6574 #endif |
0 | 6575 |
6576 context = alcCreateContext(dev, attrlist); | |
6577 if(NULL == context) | |
6578 { | |
6579 ALmixer_SetError("Cannot create a context OpenAL"); | |
6580 alcCloseDevice(dev); | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6581 return AL_FALSE; |
0 | 6582 } |
6583 | |
6584 | |
6585 /* Hmmm, OSX is returning 1 on alcMakeContextCurrent, | |
6586 * but ALC_NO_ERROR is defined to ALC_FALSE. | |
6587 * According to Garin Hiebert, this is actually an inconsistency | |
6588 * in the Loki version. The function should return a boolean. | |
6589 * instead of ALC_NO_ERROR. Garin suggested I check via | |
6590 * alcGetError(). | |
6591 */ | |
6592 /* clear the error */ | |
6593 alcGetError(dev); | |
6594 alcMakeContextCurrent(context); | |
6595 | |
6596 error = alcGetError(dev); | |
6597 if( (ALC_NO_ERROR != error) ) | |
6598 { | |
6599 ALmixer_SetError("Could not MakeContextCurrent"); | |
6600 alcDestroyContext(context); | |
6601 alcCloseDevice(dev); | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6602 return AL_FALSE; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6603 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6604 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6605 /* It looks like OpenAL won't let us ask it what |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6606 * the set frequency is, so we need to save our |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6607 * own copy. Yuck. |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6608 * Update: J. Valenzuela just updated the Loki |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6609 * dist (2003/01/02) to handle this. |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6610 * The demo is in testattrib.c. |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6611 */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6612 /* |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6613 ALmixer_Frequency_global = frequency; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6614 */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6615 #ifndef __APPLE__ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6616 alcGetIntegerv(dev, ALC_FREQUENCY, 1, &ALmixer_Frequency_global); |
6
4b1048af7e55
Disabled some of the debugging printfs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
3
diff
changeset
|
6617 /* |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6618 fprintf(stderr, "alcGetIntegerv ALC_FREQUENCY is: %d", ALmixer_Frequency_global); |
6
4b1048af7e55
Disabled some of the debugging printfs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
3
diff
changeset
|
6619 */ |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6620 #endif |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6621 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6622 |
0 | 6623 #if 0 |
6624 /* OSX is failing on alcMakeContextCurrent(). Try checking it first? */ | |
6625 if(alcGetCurrentContext() != context) | |
6626 { | |
6627 /* Hmmm, OSX is returning 1 on alcMakeContextCurrent, | |
6628 * but ALC_NO_ERROR is defined to ALC_FALSE. | |
6629 * I think this is a bug in the OpenAL implementation. | |
6630 */ | |
6631 fprintf(stderr,"alcMakeContextCurrent returns %d\n", alcMakeContextCurrent(context)); | |
6632 | |
6633 fprintf(stderr, "Making context current\n"); | |
6634 #ifndef __APPLE__ | |
6635 if(alcMakeContextCurrent(context) != ALC_NO_ERROR) | |
6636 #else | |
6637 if(!alcMakeContextCurrent(context)) | |
6638 #endif | |
6639 { | |
6640 ALmixer_SetError("Could not MakeContextCurrent"); | |
6641 alcDestroyContext(context); | |
6642 alcCloseDevice(dev); | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6643 return AL_FALSE; |
0 | 6644 } |
6645 } | |
6646 #endif | |
6647 | |
6648 | |
6649 /* #endif */ | |
6650 /* Saw this in the README with the OS X OpenAL distribution. | |
6651 * It looked interesting and simple, so I thought I might | |
6652 * try it out. | |
6653 * ***** ALC_CONVERT_DATA_UPON_LOADING | |
6654 * This extension allows the caller to tell OpenAL to preconvert to the native Core | |
6655 * Audio format, the audio data passed to the | |
6656 * library with the alBufferData() call. Preconverting the audio data, reduces CPU | |
6657 * usage by removing an audio data conversion | |
6658 * (per source) at render timem at the expense of a larger memory footprint. | |
6659 * | |
6660 * This feature is toggled on/off by using the alDisable() & alEnable() APIs. This | |
6661 * setting will be applied to all subsequent | |
6662 * calls to alBufferData(). | |
22
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
6663 * |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
6664 * Update: Some people keep reporting that they see the enable fail on Mac, but I can't reproduce it myself. |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
6665 * Rather than deal with it right now, I think I am going to make it an opt-in thing. |
0 | 6666 */ |
22
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
6667 #if defined(__APPLE__) && defined(ALMIXER_USE_OSX_CONVERT_DATA_UPON_LOADING) |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6668 /* |
22
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
6669 iPhone is getting this enum, but is failing on the enable, so I guess I'll define it out. |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
6670 */ |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6671 #if (TARGET_OS_IPHONE == 1) || (TARGET_IPHONE_SIMULATOR == 1) |
22
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
6672 |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6673 #else |
22
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
6674 /* iOS reports this enum exists, but loading it always fails, so make it Mac only. */ |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
6675 ALenum convert_data_enum = alcGetEnumValue(dev, "ALC_MAC_OSX_CONVERT_DATA_UPON_LOADING"); |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
6676 /* |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
6677 fprintf(stderr, "ALC_MAC_OSX_CONVERT_DATA_UPON_LOADING=0x%x", convert_data_enum); |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
6678 */ |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
6679 if(0 != convert_data_enum) |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
6680 { |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
6681 alEnable(convert_data_enum); |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
6682 } |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
6683 if( (AL_NO_ERROR != alGetError()) ) |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
6684 { |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
6685 fprintf(stderr, "ALC_MAC_OSX_CONVERT_DATA_UPON_LOADING attempted but failed"); |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
6686 ALmixer_SetError("ALC_MAC_OSX_CONVERT_DATA_UPON_LOADING attempted but failed"); |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
6687 } |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6688 #endif |
22
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
6689 |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
6690 #endif /* __APPLE__ */ |
0 | 6691 |
6692 | |
6693 | |
6694 | |
31
ad4eb4330fb0
Added initialized check in Begin/End interruption.
Eric Wing <ewing@anscamobile.com>
parents:
30
diff
changeset
|
6695 ALmixer_Initialized = AL_TRUE; |
0 | 6696 |
22
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
6697 if(num_sources == 0) |
0 | 6698 { |
6699 Number_of_Channels_global = ALMIXER_DEFAULT_NUM_CHANNELS; | |
6700 } | |
6701 else | |
6702 { | |
22
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
6703 /* probably should make Number_of_Channels_global an ALuint, but need to cast which_channel all the time */ |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
6704 Number_of_Channels_global = (ALint)num_sources; |
0 | 6705 } |
6706 Number_of_Reserve_Channels_global = 0; | |
6707 Is_Playing_global = 0; | |
6708 /* Set to Null in case system quit and was reinitialized */ | |
6709 Channel_Done_Callback = NULL; | |
6710 Channel_Done_Callback_Userdata = NULL; | |
6711 Channel_Data_Callback = NULL; | |
1 | 6712 Channel_Data_Callback_Userdata = NULL; |
0 | 6713 |
13
54aa96ae8912
Added LinkedList class to project.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
12
diff
changeset
|
6714 /* Allocate memory for linked list of ALmixerData. */ |
54aa96ae8912
Added LinkedList class to project.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
12
diff
changeset
|
6715 s_listOfALmixerData = LinkedList_Create(); |
54aa96ae8912
Added LinkedList class to project.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
12
diff
changeset
|
6716 if(NULL == s_listOfALmixerData) |
54aa96ae8912
Added LinkedList class to project.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
12
diff
changeset
|
6717 { |
54aa96ae8912
Added LinkedList class to project.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
12
diff
changeset
|
6718 ALmixer_SetError("Couldn't create linked list"); |
54aa96ae8912
Added LinkedList class to project.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
12
diff
changeset
|
6719 alcDestroyContext(context); |
54aa96ae8912
Added LinkedList class to project.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
12
diff
changeset
|
6720 alcCloseDevice(dev); |
31
ad4eb4330fb0
Added initialized check in Begin/End interruption.
Eric Wing <ewing@anscamobile.com>
parents:
30
diff
changeset
|
6721 ALmixer_Initialized = AL_FALSE; |
13
54aa96ae8912
Added LinkedList class to project.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
12
diff
changeset
|
6722 Number_of_Channels_global = 0; |
54aa96ae8912
Added LinkedList class to project.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
12
diff
changeset
|
6723 return AL_FALSE; |
54aa96ae8912
Added LinkedList class to project.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
12
diff
changeset
|
6724 } |
54aa96ae8912
Added LinkedList class to project.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
12
diff
changeset
|
6725 |
0 | 6726 /* Allocate memory for the list of channels */ |
6727 ALmixer_Channel_List = (struct ALmixer_Channel*) malloc(Number_of_Channels_global * sizeof(struct ALmixer_Channel)); | |
6728 if(NULL == ALmixer_Channel_List) | |
6729 { | |
6730 ALmixer_SetError("Out of Memory for Channel List"); | |
13
54aa96ae8912
Added LinkedList class to project.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
12
diff
changeset
|
6731 LinkedList_Free(s_listOfALmixerData); |
0 | 6732 alcDestroyContext(context); |
6733 alcCloseDevice(dev); | |
31
ad4eb4330fb0
Added initialized check in Begin/End interruption.
Eric Wing <ewing@anscamobile.com>
parents:
30
diff
changeset
|
6734 ALmixer_Initialized = AL_FALSE; |
0 | 6735 Number_of_Channels_global = 0; |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6736 return AL_FALSE; |
0 | 6737 } |
6738 | |
6739 /* Allocate memory for the list of sources that map to the channels */ | |
6740 Source_Map_List = (Source_Map*) malloc(Number_of_Channels_global * sizeof(Source_Map)); | |
6741 if(NULL == Source_Map_List) | |
6742 { | |
6743 ALmixer_SetError("Out of Memory for Source Map List"); | |
6744 free(ALmixer_Channel_List); | |
13
54aa96ae8912
Added LinkedList class to project.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
12
diff
changeset
|
6745 LinkedList_Free(s_listOfALmixerData); |
0 | 6746 alcDestroyContext(context); |
6747 alcCloseDevice(dev); | |
31
ad4eb4330fb0
Added initialized check in Begin/End interruption.
Eric Wing <ewing@anscamobile.com>
parents:
30
diff
changeset
|
6748 ALmixer_Initialized = AL_FALSE; |
0 | 6749 Number_of_Channels_global = 0; |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6750 return AL_FALSE; |
0 | 6751 } |
6752 | |
6753 /* Create array that will hold the sources */ | |
6754 source = (ALuint*)malloc(Number_of_Channels_global * sizeof(ALuint)); | |
6755 if(NULL == source) | |
6756 { | |
6757 ALmixer_SetError("Out of Memory for sources"); | |
6758 free(Source_Map_List); | |
6759 free(ALmixer_Channel_List); | |
13
54aa96ae8912
Added LinkedList class to project.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
12
diff
changeset
|
6760 LinkedList_Free(s_listOfALmixerData); |
0 | 6761 alcDestroyContext(context); |
6762 alcCloseDevice(dev); | |
31
ad4eb4330fb0
Added initialized check in Begin/End interruption.
Eric Wing <ewing@anscamobile.com>
parents:
30
diff
changeset
|
6763 ALmixer_Initialized = AL_FALSE; |
0 | 6764 Number_of_Channels_global = 0; |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6765 return AL_FALSE; |
0 | 6766 } |
6767 | |
6768 /* Clear the error state */ | |
6769 alGetError(); | |
6770 /* Generate the OpenAL sources */ | |
6771 alGenSources(Number_of_Channels_global, source); | |
6772 if( (error=alGetError()) != AL_NO_ERROR) | |
6773 { | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6774 ALmixer_SetError("Couldn't generate sources: %s\n", alGetString(error)); |
0 | 6775 free(ALmixer_Channel_List); |
6776 free(Source_Map_List); | |
13
54aa96ae8912
Added LinkedList class to project.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
12
diff
changeset
|
6777 LinkedList_Free(s_listOfALmixerData); |
0 | 6778 alcDestroyContext(context); |
6779 alcCloseDevice(dev); | |
31
ad4eb4330fb0
Added initialized check in Begin/End interruption.
Eric Wing <ewing@anscamobile.com>
parents:
30
diff
changeset
|
6780 ALmixer_Initialized = AL_FALSE; |
0 | 6781 Number_of_Channels_global = 0; |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6782 return AL_FALSE; |
0 | 6783 } |
6784 | |
6785 /* Initialize each channel and associate one source to one channel */ | |
6786 for(i=0; i<Number_of_Channels_global; i++) | |
6787 { | |
6788 if(0 == source[i]) | |
6789 { | |
6790 fprintf(stderr, "SDL_ALmixer serious problem. This OpenAL implementation allowed 0 to be a valid source id which is in conflict with assumptions made in this library.\n"); | |
6791 } | |
6792 | |
6793 Init_Channel(i); | |
6794 /* Keeping the source allocation out of the Init function | |
6795 * in case I want to reuse the Init | |
6796 * function for resetting data | |
6797 */ | |
6798 ALmixer_Channel_List[i].alsource = source[i]; | |
6799 /* Now also keep a copy of the source to channel mapping | |
6800 * in case we need to look up a channel from the source | |
6801 * instead of a source from a channel | |
6802 */ | |
6803 Source_Map_List[i].source = source[i]; | |
6804 Source_Map_List[i].channel = i; | |
6805 /* Clean the channel because there are some things that need to | |
6806 * be done that can't happen until the source is set | |
6807 */ | |
6808 Clean_Channel(i); | |
6809 } | |
6810 | |
6811 /* The Source_Map_List must be sorted by source for binary searches | |
6812 */ | |
6813 qsort(Source_Map_List, Number_of_Channels_global, sizeof(Source_Map), Compare_Source_Map); | |
6814 | |
6
4b1048af7e55
Disabled some of the debugging printfs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
3
diff
changeset
|
6815 /* |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6816 ALmixer_OutputDecoders(); |
6
4b1048af7e55
Disabled some of the debugging printfs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
3
diff
changeset
|
6817 */ |
13
54aa96ae8912
Added LinkedList class to project.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
12
diff
changeset
|
6818 |
54aa96ae8912
Added LinkedList class to project.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
12
diff
changeset
|
6819 |
54aa96ae8912
Added LinkedList class to project.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
12
diff
changeset
|
6820 |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6821 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6822 s_simpleLock = SDL_CreateMutex(); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6823 if(NULL == s_simpleLock) |
0 | 6824 { |
6825 /* SDL sets the error message already? */ | |
6826 free(source); | |
6827 free(ALmixer_Channel_List); | |
6828 free(Source_Map_List); | |
13
54aa96ae8912
Added LinkedList class to project.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
12
diff
changeset
|
6829 LinkedList_Free(s_listOfALmixerData); |
0 | 6830 alcDestroyContext(context); |
6831 alcCloseDevice(dev); | |
31
ad4eb4330fb0
Added initialized check in Begin/End interruption.
Eric Wing <ewing@anscamobile.com>
parents:
30
diff
changeset
|
6832 ALmixer_Initialized = AL_FALSE; |
0 | 6833 Number_of_Channels_global = 0; |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6834 return AL_FALSE; |
0 | 6835 } |
6836 | |
31
ad4eb4330fb0
Added initialized check in Begin/End interruption.
Eric Wing <ewing@anscamobile.com>
parents:
30
diff
changeset
|
6837 g_StreamThreadEnabled = AL_TRUE; |
0 | 6838 Stream_Thread_global = SDL_CreateThread(Stream_Data_Thread_Callback, NULL); |
6839 if(NULL == Stream_Thread_global) | |
6840 { | |
6841 /* SDL sets the error message already? */ | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6842 SDL_DestroyMutex(s_simpleLock); |
0 | 6843 free(source); |
6844 free(ALmixer_Channel_List); | |
6845 free(Source_Map_List); | |
13
54aa96ae8912
Added LinkedList class to project.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
12
diff
changeset
|
6846 LinkedList_Free(s_listOfALmixerData); |
0 | 6847 alcDestroyContext(context); |
6848 alcCloseDevice(dev); | |
31
ad4eb4330fb0
Added initialized check in Begin/End interruption.
Eric Wing <ewing@anscamobile.com>
parents:
30
diff
changeset
|
6849 ALmixer_Initialized = AL_FALSE; |
0 | 6850 Number_of_Channels_global = 0; |
31
ad4eb4330fb0
Added initialized check in Begin/End interruption.
Eric Wing <ewing@anscamobile.com>
parents:
30
diff
changeset
|
6851 g_StreamThreadEnabled = AL_FALSE; |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6852 return AL_FALSE; |
0 | 6853 } |
24
e085cbc573cf
iOS optimization/bug/workaround.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
22
diff
changeset
|
6854 |
e085cbc573cf
iOS optimization/bug/workaround.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
22
diff
changeset
|
6855 /* Note: Only a few platforms change the priority. See implementation for notes. */ |
e085cbc573cf
iOS optimization/bug/workaround.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
22
diff
changeset
|
6856 Internal_LowerThreadPriority(Stream_Thread_global); |
0 | 6857 |
6
4b1048af7e55
Disabled some of the debugging printfs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
3
diff
changeset
|
6858 /* |
0 | 6859 fprintf(stderr, "Using threads\n"); |
6
4b1048af7e55
Disabled some of the debugging printfs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
3
diff
changeset
|
6860 */ |
0 | 6861 #endif /* End of ENABLE_ALMIXER_THREADS */ |
6862 | |
6863 /* We don't need this array any more because all the sources | |
6864 * are connected to channels | |
6865 */ | |
6866 free(source); | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6867 return AL_TRUE; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6868 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6869 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6870 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6871 ALboolean ALmixer_InitContext(ALuint frequency, ALuint refresh) |
0 | 6872 { |
6873 ALCdevice* dev; | |
6874 ALCcontext* context; | |
6875 ALCenum error; | |
6876 | |
6877 #ifdef USING_LOKI_AL_DIST | |
6878 /* The Loki dist requires that I set both the | |
6879 * device and context frequency values separately | |
6880 */ | |
6881 /* Hope this won't overflow */ | |
6882 char device_string[256]; | |
6883 #endif | |
6884 | |
6885 /* (Venting frustration) Damn it! Nobody bothered | |
6886 * documenting how you're supposed to use an attribute | |
6887 * list. In fact, the not even the Loki test program | |
6888 * writers seem to know because they use it inconsistently. | |
6889 * For example, how do you terminate that attribute list? | |
6890 * The Loki test code does it 3 different ways. They | |
6891 * set the last value to 0, or they set it to ALC_INVALID, | |
6892 * or they set two final values: ALC_INVALID, 0 | |
6893 * In Loki, 0 and ALC_INVALID happen to be the same, | |
6894 * but with Creative Labs ALC_INVALID is -1. | |
6895 * So something's going to break. Loki's source | |
6896 * code says to terminate with ALC_INVALID. But I | |
6897 * don't know if that's really true, or it happens | |
6898 * to be a coinicidence because it's defined to 0. | |
6899 * Creative provides no source code, so I can't look at how | |
6900 * they terminate it. | |
6901 * So this is really, really ticking me off... | |
6902 * For now, I'm going to use ALC_INVALID. | |
6903 * (Update...after further review of the API spec, | |
6904 * it seems that a NULL terminated string is the correct | |
6905 * termination value to use, so 0 it is.) | |
6906 */ | |
6907 #if 0 | |
6908 ALint attrlist[] = { | |
6909 ALC_FREQUENCY, ALMIXER_DEFAULT_FREQUENCY, | |
6910 /* Don't know anything about these values. | |
6911 * Trust defaults? */ | |
6912 /* Supposed to be the refresh rate in Hz. | |
6913 * I think 15-120 are supposed to be good | |
6914 * values. Though I haven't gotten any effect except | |
6915 * for one strange instance on a Mac. But it was | |
6916 * unrepeatable. | |
6917 */ | |
6918 #if 0 | |
6919 ALC_REFRESH, 15, | |
6920 #endif | |
6921 /* Sync requires a alcProcessContext() call | |
6922 * for every cycle. By default, this is | |
6923 * not used and the value is AL_FALSE | |
6924 * because it will probably perform | |
6925 * pretty badly for me. | |
6926 */ | |
6927 #ifdef ENABLE_ALMIXER_ALC_SYNC | |
6928 ALC_SYNC, AL_TRUE, | |
6929 #else | |
6930 ALC_SYNC, AL_FALSE, | |
6931 #endif | |
6932 /* Looking at the API spec, it implies | |
6933 * that the list be a NULL terminated string | |
6934 * so it's probably not safe to use ALC_INVALID | |
6935 */ | |
6936 /* | |
6937 ALC_INVALID }; | |
6938 */ | |
6939 '\0'}; | |
6940 #endif | |
6941 /* Redo: I'm going to allow ALC_REFRESH to be set. | |
6942 * However, if no value is specified, I don't | |
6943 * want it in the list so I can get the OpenAL defaults | |
6944 */ | |
6945 ALint attrlist[7]; | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6946 ALsizei current_attrlist_index = 0; |
0 | 6947 |
6948 #ifdef ENABLE_PARANOID_SIGNEDNESS_CHECK | |
6949 /* More problems: I'm getting bit by endian/signedness issues on | |
6950 * different platforms. I can find the endianess easily enough, | |
6951 * but I don't know how to determine what the correct signedness | |
6952 * is (if such a thing exists). I do know that if I try using | |
6953 * unsigned on OSX with an originally signed sample, I get | |
6954 * distortion. However, I don't have any native unsigned samples | |
6955 * to test. But I'm assuming that the platform must be in the | |
6956 * correct signedness no matter what. | |
6957 * I can either assume everybody is signed, or I can try to | |
6958 * determine the value. If I try to determine the values, | |
6959 * I think my only ability to figure it out will be to open | |
6960 * SDL_Audio, and read what the obtained settings were. | |
6961 * Then shutdown everything. However, I don't even know how | |
6962 * reliable this is. | |
6963 * Update: I think I resolved the issues...forgot to update | |
6964 * these comments when it happened. I should check the revision control | |
6965 * log... Anyway, I think the issue was partly related to me not | |
6966 * doing something correctly with the AudioInfo or some kind | |
6967 * of stupid endian bug in my code, and weirdness ensued. Looking at the | |
6968 * revision control, I think I might have assumed that SDL_Sound would | |
6969 * do the right thing with a NULL AudioInfo, but I was incorrect, | |
6970 * and had to fill one out myself. | |
6971 */ | |
6972 SDL_AudioSpec desired; | |
6973 SDL_AudioSpec obtained; | |
6974 #endif | |
6975 | |
6976 | |
6977 | |
6978 | |
6979 /* Make sure ALmixer isn't already initialized */ | |
6980 if(ALmixer_Initialized) | |
6981 { | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6982 return AL_FALSE; |
0 | 6983 } |
6984 | |
6985 /* Set the defaults */ | |
6986 attrlist[0] = ALC_FREQUENCY; | |
6987 attrlist[1] = ALMIXER_DEFAULT_FREQUENCY; | |
6988 attrlist[2] = ALC_SYNC; | |
6989 #ifdef ENABLE_ALMIXER_ALC_SYNC | |
6990 attrlist[3] = ALC_TRUE; | |
6991 #else | |
6992 attrlist[3] = ALC_FALSE; | |
6993 #endif | |
6994 /* Set frequency value if it is not 0 */ | |
6995 if(0 != frequency) | |
6996 { | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6997 attrlist[current_attrlist_index] = ALC_FREQUENCY; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6998 current_attrlist_index++; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
6999 attrlist[current_attrlist_index] = (ALint)frequency; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7000 current_attrlist_index++; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7001 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7002 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7003 #ifdef ENABLE_ALMIXER_ALC_SYNC |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7004 attrlist[current_attrlist_index] = ALC_SYNC; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7005 current_attrlist_index++; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7006 attrlist[current_attrlist_index] = ALC_TRUE; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7007 current_attrlist_index++; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7008 #endif |
0 | 7009 |
7010 /* If the user specifies a refresh value, | |
7011 * make room for it | |
7012 */ | |
7013 if(0 != refresh) | |
7014 { | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7015 attrlist[current_attrlist_index] = (ALint)ALC_REFRESH; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7016 current_attrlist_index++; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7017 attrlist[current_attrlist_index] = refresh; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7018 current_attrlist_index++; |
0 | 7019 } |
7020 | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7021 /* End attribute list */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7022 attrlist[current_attrlist_index] = '\0'; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7023 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7024 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7025 |
0 | 7026 /* Initialize SDL_Sound */ |
7027 if(! Sound_Init() ) | |
7028 { | |
7029 ALmixer_SetError(Sound_GetError()); | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7030 return AL_FALSE; |
0 | 7031 } |
7032 #ifdef ENABLE_PARANOID_SIGNEDNESS_CHECK | |
7033 /* Here is the paranoid check that opens | |
7034 * SDL audio in an attempt to find the correct | |
7035 * system values. | |
7036 */ | |
7037 /* Doesn't have to be the actual value I think | |
7038 * (as long as it doesn't influence format, in | |
7039 * which case I'm probably screwed anyway because OpenAL | |
7040 * may easily choose to do something else). | |
7041 */ | |
7042 desired.freq = 44100; | |
7043 desired.channels = 2; | |
7044 desired.format = AUDIO_S16SYS; | |
7045 desired.callback = my_dummy_audio_callback; | |
7046 if(SDL_OpenAudio(&desired, &obtained) >= 0) | |
7047 { | |
7048 SIGN_TYPE_16BIT_FORMAT = obtained.format; | |
7049 /* Now to get really paranoid, we should probably | |
7050 * also assume that the 8bit format is also the | |
7051 * same sign type and set that value | |
7052 */ | |
7053 if(AUDIO_S16SYS == obtained.format) | |
7054 { | |
7055 SIGN_TYPE_8BIT_FORMAT = AUDIO_S8; | |
7056 } | |
7057 /* Should be AUDIO_U16SYS */ | |
7058 else | |
7059 { | |
7060 SIGN_TYPE_8BIT_FORMAT = AUDIO_U8; | |
7061 } | |
7062 SDL_CloseAudio(); | |
7063 } | |
7064 else | |
7065 { | |
7066 /* Well, I guess I'm in trouble. I guess it's my best guess | |
7067 */ | |
7068 SIGN_TYPE_16_BIT_FORMAT = AUDIO_S16SYS; | |
7069 SIGN_TYPE_8_BIT_FORMAT = AUDIO_S8; | |
7070 } | |
7071 #endif | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7072 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7073 #ifndef ALMIXER_COMPILE_WITHOUT_SDL |
0 | 7074 /* Weirdness: It seems that SDL_Init(SDL_INIT_AUDIO) |
7075 * causes OpenAL and SMPEG to conflict. For some reason | |
7076 * if SDL_Init on audio is active, then all the SMPEG | |
7077 * decoded sound comes out silent. Unfortunately, | |
7078 * Sound_Init() invokes SDL_Init on audio. I'm | |
7079 * not sure why it actually needs it... | |
7080 * But we'll attempt to disable it here after the | |
7081 * SDL_Sound::Init call and hope it doesn't break SDL_Sound. | |
7082 */ | |
7083 SDL_QuitSubSystem(SDL_INIT_AUDIO); | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7084 #endif |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7085 |
0 | 7086 /* I'm told NULL will call the default string |
7087 * and hopefully do the right thing for each platform | |
7088 */ | |
7089 /* | |
7090 dev = alcOpenDevice( NULL ); | |
7091 */ | |
7092 /* Now I'm told I need to set both the device and context | |
7093 * to have the same sampling rate, so I must pass a string | |
7094 * to OpenDevice(). I don't know how portable these strings are. | |
7095 * I don't even know if the format for strings is | |
7096 * compatible | |
7097 * From the testattrib.c in the Loki test section | |
7098 * dev = alcOpenDevice( (const ALubyte *) "'((sampling-rate 22050))" ); | |
7099 */ | |
7100 | |
7101 #ifdef USING_LOKI_AL_DIST | |
7102 sprintf(device_string, "'((sampling-rate %d))", attrlist[1]); | |
7103 dev = alcOpenDevice( (const ALubyte *) device_string ); | |
7104 #else | |
7105 dev = alcOpenDevice( NULL ); | |
7106 #endif | |
7107 if(NULL == dev) | |
7108 { | |
7109 ALmixer_SetError("Cannot open sound device for OpenAL"); | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7110 return AL_FALSE; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7111 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7112 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7113 #ifdef __APPLE__ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7114 /* The ALC_FREQUENCY attribute is ignored with Apple's implementation. */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7115 /* This extension must be called before the context is created. */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7116 if(0 != frequency) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7117 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7118 Internal_alcMacOSXMixerOutputRate((ALdouble)frequency); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7119 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7120 ALmixer_Frequency_global = (ALuint)Internal_alcMacOSXGetMixerOutputRate(); |
6
4b1048af7e55
Disabled some of the debugging printfs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
3
diff
changeset
|
7121 /* |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7122 fprintf(stderr, "Internal_alcMacOSXMixerOutputRate is: %lf", Internal_alcMacOSXGetMixerOutputRate()); |
6
4b1048af7e55
Disabled some of the debugging printfs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
3
diff
changeset
|
7123 */ |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7124 #endif |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7125 |
0 | 7126 |
7127 context = alcCreateContext(dev, attrlist); | |
7128 if(NULL == context) | |
7129 { | |
7130 ALmixer_SetError("Cannot create a context OpenAL"); | |
7131 alcCloseDevice(dev); | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7132 return AL_FALSE; |
0 | 7133 } |
7134 | |
7135 | |
7136 /* Hmmm, OSX is returning 1 on alcMakeContextCurrent, | |
7137 * but ALC_NO_ERROR is defined to ALC_FALSE. | |
7138 * According to Garin Hiebert, this is actually an inconsistency | |
7139 * in the Loki version. The function should return a boolean. | |
7140 * instead of ALC_NO_ERROR. Garin suggested I check via | |
7141 * alcGetError(). | |
7142 */ | |
7143 /* clear the error */ | |
7144 alcGetError(dev); | |
7145 alcMakeContextCurrent(context); | |
7146 | |
7147 error = alcGetError(dev); | |
7148 if( (ALC_NO_ERROR != error) ) | |
7149 { | |
7150 ALmixer_SetError("Could not MakeContextCurrent"); | |
7151 alcDestroyContext(context); | |
7152 alcCloseDevice(dev); | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7153 return AL_FALSE; |
0 | 7154 } |
7155 | |
7156 | |
7157 #if 0 | |
7158 /* OSX is failing on alcMakeContextCurrent(). Try checking it first? */ | |
7159 if(alcGetCurrentContext() != context) | |
7160 { | |
7161 /* Hmmm, OSX is returning 1 on alcMakeContextCurrent, | |
7162 * but ALC_NO_ERROR is defined to ALC_FALSE. | |
7163 * I think this is a bug in the OpenAL implementation. | |
7164 */ | |
7165 fprintf(stderr,"alcMakeContextCurrent returns %d\n", alcMakeContextCurrent(context)); | |
7166 | |
7167 fprintf(stderr, "Making context current\n"); | |
7168 #ifndef __APPLE__ | |
7169 if(alcMakeContextCurrent(context) != ALC_NO_ERROR) | |
7170 #else | |
7171 if(!alcMakeContextCurrent(context)) | |
7172 #endif | |
7173 { | |
7174 ALmixer_SetError("Could not MakeContextCurrent"); | |
7175 alcDestroyContext(context); | |
7176 alcCloseDevice(dev); | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7177 return AL_FALSE; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7178 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7179 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7180 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7181 #endif |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7182 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7183 /* It looks like OpenAL won't let us ask it what |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7184 * the set frequency is, so we need to save our |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7185 * own copy. Yuck. |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7186 * Update: J. Valenzuela just updated the Loki |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7187 * dist (2003/01/02) to handle this. |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7188 * The demo is in testattrib.c. |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7189 */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7190 #ifndef __APPLE__ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7191 alcGetIntegerv(dev, ALC_FREQUENCY, 1, &ALmixer_Frequency_global); |
6
4b1048af7e55
Disabled some of the debugging printfs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
3
diff
changeset
|
7192 /* |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7193 fprintf(stderr, "alcGetIntegerv ALC_FREQUENCY is: %d", ALmixer_Frequency_global); |
6
4b1048af7e55
Disabled some of the debugging printfs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
3
diff
changeset
|
7194 */ |
4b1048af7e55
Disabled some of the debugging printfs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
3
diff
changeset
|
7195 #endif |
4b1048af7e55
Disabled some of the debugging printfs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
3
diff
changeset
|
7196 |
4b1048af7e55
Disabled some of the debugging printfs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
3
diff
changeset
|
7197 |
0 | 7198 |
7199 /* Saw this in the README with the OS X OpenAL distribution. | |
7200 * It looked interesting and simple, so I thought I might | |
7201 * try it out. | |
7202 * ***** ALC_CONVERT_DATA_UPON_LOADING | |
7203 * This extension allows the caller to tell OpenAL to preconvert to the native Core | |
7204 * Audio format, the audio data passed to the | |
7205 * library with the alBufferData() call. Preconverting the audio data, reduces CPU | |
7206 * usage by removing an audio data conversion | |
7207 * (per source) at render timem at the expense of a larger memory footprint. | |
7208 * | |
7209 * This feature is toggled on/off by using the alDisable() & alEnable() APIs. This | |
7210 * setting will be applied to all subsequent | |
7211 * calls to alBufferData(). | |
22
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7212 * Update: Some people keep reporting that they see the enable fail on Mac, but I can't reproduce it myself. |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7213 * Rather than deal with it right now, I think I am going to make it an opt-in thing. |
0 | 7214 */ |
22
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7215 #if defined(__APPLE__) && defined(ALMIXER_USE_OSX_CONVERT_DATA_UPON_LOADING) |
6
4b1048af7e55
Disabled some of the debugging printfs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
3
diff
changeset
|
7216 /* |
22
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7217 iPhone is getting this enum, but is failing on the enable, so I guess I'll define it out. |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7218 */ |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7219 #if (TARGET_OS_IPHONE == 1) || (TARGET_IPHONE_SIMULATOR == 1) |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7220 |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7221 #else |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7222 /* iOS reports this enum exists, but loading it always fails, so make it Mac only. */ |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7223 ALenum convert_data_enum = alcGetEnumValue(dev, "ALC_MAC_OSX_CONVERT_DATA_UPON_LOADING"); |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7224 /* |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7225 fprintf(stderr, "ALC_MAC_OSX_CONVERT_DATA_UPON_LOADING=0x%x", convert_data_enum); |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7226 */ |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7227 if(0 != convert_data_enum) |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7228 { |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7229 alEnable(convert_data_enum); |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7230 } |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7231 if( (AL_NO_ERROR != alGetError()) ) |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7232 { |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7233 fprintf(stderr, "ALC_MAC_OSX_CONVERT_DATA_UPON_LOADING attempted but failed"); |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7234 ALmixer_SetError("ALC_MAC_OSX_CONVERT_DATA_UPON_LOADING attempted but failed"); |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7235 } |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7236 #endif |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7237 #endif |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7238 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7239 return AL_TRUE; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7240 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7241 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7242 |
22
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7243 ALboolean ALmixer_InitMixer(ALuint num_sources) |
0 | 7244 { |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7245 ALint i; |
0 | 7246 ALenum error; |
7247 ALuint* source; | |
7248 | |
7249 | |
31
ad4eb4330fb0
Added initialized check in Begin/End interruption.
Eric Wing <ewing@anscamobile.com>
parents:
30
diff
changeset
|
7250 ALmixer_Initialized = AL_TRUE; |
0 | 7251 |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7252 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7253 #ifdef ALMIXER_COMPILE_WITHOUT_SDL |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7254 ALmixer_InitTime(); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7255 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7256 /* Note: The pool may have been created on previous Init's */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7257 /* I leave the pool allocated allocated in case the user wants |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7258 * to read the pool in case of a failure (such as in this function). |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7259 * This is not actually a leak. |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7260 */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7261 if(NULL == s_ALmixerErrorPool) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7262 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7263 s_ALmixerErrorPool = TError_CreateErrorPool(); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7264 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7265 if(NULL == s_ALmixerErrorPool) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7266 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7267 return AL_FALSE; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7268 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7269 /* |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7270 fprintf(stderr, "tError Test0\n"); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7271 ALmixer_SetError("Initing (and testing SetError)"); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7272 fprintf(stderr, "tError Test1: %s\n", ALmixer_GetError()); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7273 fprintf(stderr, "tError Test2: %s\n", ALmixer_GetError()); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7274 */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7275 #endif |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7276 |
22
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7277 if(num_sources == 0) |
0 | 7278 { |
7279 Number_of_Channels_global = ALMIXER_DEFAULT_NUM_CHANNELS; | |
7280 } | |
7281 else | |
7282 { | |
22
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7283 Number_of_Channels_global = (ALint)num_sources; |
0 | 7284 } |
7285 Number_of_Reserve_Channels_global = 0; | |
7286 Is_Playing_global = 0; | |
7287 /* Set to Null in case system quit and was reinitialized */ | |
7288 Channel_Done_Callback = NULL; | |
7289 Channel_Done_Callback_Userdata = NULL; | |
7290 Channel_Data_Callback = NULL; | |
1 | 7291 Channel_Data_Callback_Userdata = NULL; |
0 | 7292 |
13
54aa96ae8912
Added LinkedList class to project.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
12
diff
changeset
|
7293 /* Allocate memory for linked list of ALmixerData. */ |
54aa96ae8912
Added LinkedList class to project.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
12
diff
changeset
|
7294 s_listOfALmixerData = LinkedList_Create(); |
54aa96ae8912
Added LinkedList class to project.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
12
diff
changeset
|
7295 if(NULL == s_listOfALmixerData) |
54aa96ae8912
Added LinkedList class to project.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
12
diff
changeset
|
7296 { |
54aa96ae8912
Added LinkedList class to project.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
12
diff
changeset
|
7297 ALmixer_SetError("Couldn't create linked list"); |
31
ad4eb4330fb0
Added initialized check in Begin/End interruption.
Eric Wing <ewing@anscamobile.com>
parents:
30
diff
changeset
|
7298 ALmixer_Initialized = AL_FALSE; |
13
54aa96ae8912
Added LinkedList class to project.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
12
diff
changeset
|
7299 Number_of_Channels_global = 0; |
54aa96ae8912
Added LinkedList class to project.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
12
diff
changeset
|
7300 return AL_FALSE; |
54aa96ae8912
Added LinkedList class to project.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
12
diff
changeset
|
7301 } |
54aa96ae8912
Added LinkedList class to project.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
12
diff
changeset
|
7302 |
54aa96ae8912
Added LinkedList class to project.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
12
diff
changeset
|
7303 |
0 | 7304 /* Allocate memory for the list of channels */ |
7305 ALmixer_Channel_List = (struct ALmixer_Channel*) malloc(Number_of_Channels_global * sizeof(struct ALmixer_Channel)); | |
7306 if(NULL == ALmixer_Channel_List) | |
7307 { | |
7308 ALmixer_SetError("Out of Memory for Channel List"); | |
13
54aa96ae8912
Added LinkedList class to project.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
12
diff
changeset
|
7309 LinkedList_Free(s_listOfALmixerData); |
31
ad4eb4330fb0
Added initialized check in Begin/End interruption.
Eric Wing <ewing@anscamobile.com>
parents:
30
diff
changeset
|
7310 ALmixer_Initialized = AL_FALSE; |
0 | 7311 Number_of_Channels_global = 0; |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7312 return AL_FALSE; |
0 | 7313 } |
7314 | |
7315 /* Allocate memory for the list of sources that map to the channels */ | |
7316 Source_Map_List = (Source_Map*) malloc(Number_of_Channels_global * sizeof(Source_Map)); | |
7317 if(NULL == Source_Map_List) | |
7318 { | |
7319 ALmixer_SetError("Out of Memory for Source Map List"); | |
7320 free(ALmixer_Channel_List); | |
13
54aa96ae8912
Added LinkedList class to project.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
12
diff
changeset
|
7321 LinkedList_Free(s_listOfALmixerData); |
31
ad4eb4330fb0
Added initialized check in Begin/End interruption.
Eric Wing <ewing@anscamobile.com>
parents:
30
diff
changeset
|
7322 ALmixer_Initialized = AL_FALSE; |
0 | 7323 Number_of_Channels_global = 0; |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7324 return AL_FALSE; |
0 | 7325 } |
7326 | |
7327 /* Create array that will hold the sources */ | |
7328 source = (ALuint*)malloc(Number_of_Channels_global * sizeof(ALuint)); | |
7329 if(NULL == source) | |
7330 { | |
7331 ALmixer_SetError("Out of Memory for sources"); | |
7332 free(Source_Map_List); | |
7333 free(ALmixer_Channel_List); | |
13
54aa96ae8912
Added LinkedList class to project.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
12
diff
changeset
|
7334 LinkedList_Free(s_listOfALmixerData); |
31
ad4eb4330fb0
Added initialized check in Begin/End interruption.
Eric Wing <ewing@anscamobile.com>
parents:
30
diff
changeset
|
7335 ALmixer_Initialized = AL_FALSE; |
0 | 7336 Number_of_Channels_global = 0; |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7337 return AL_FALSE; |
0 | 7338 } |
7339 | |
7340 /* Clear the error state */ | |
7341 alGetError(); | |
7342 /* Generate the OpenAL sources */ | |
7343 alGenSources(Number_of_Channels_global, source); | |
7344 if( (error=alGetError()) != AL_NO_ERROR) | |
7345 { | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7346 ALmixer_SetError("Couldn't generate sources: %s\n", alGetString(error)); |
0 | 7347 free(ALmixer_Channel_List); |
7348 free(Source_Map_List); | |
13
54aa96ae8912
Added LinkedList class to project.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
12
diff
changeset
|
7349 LinkedList_Free(s_listOfALmixerData); |
31
ad4eb4330fb0
Added initialized check in Begin/End interruption.
Eric Wing <ewing@anscamobile.com>
parents:
30
diff
changeset
|
7350 ALmixer_Initialized = AL_FALSE; |
0 | 7351 Number_of_Channels_global = 0; |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7352 return AL_FALSE; |
0 | 7353 } |
7354 | |
7355 /* Initialize each channel and associate one source to one channel */ | |
7356 for(i=0; i<Number_of_Channels_global; i++) | |
7357 { | |
7358 Init_Channel(i); | |
7359 /* Keeping the source allocation out of the Init function | |
7360 * in case I want to reuse the Init | |
7361 * function for resetting data | |
7362 */ | |
7363 ALmixer_Channel_List[i].alsource = source[i]; | |
7364 /* Now also keep a copy of the source to channel mapping | |
7365 * in case we need to look up a channel from the source | |
7366 * instead of a source from a channel | |
7367 */ | |
7368 Source_Map_List[i].source = source[i]; | |
7369 Source_Map_List[i].channel = i; | |
7370 /* Clean the channel because there are some things that need to | |
7371 * be done that can't happen until the source is set | |
7372 */ | |
7373 Clean_Channel(i); | |
7374 } | |
7375 | |
7376 /* The Source_Map_List must be sorted by source for binary searches | |
7377 */ | |
7378 qsort(Source_Map_List, Number_of_Channels_global, sizeof(Source_Map), Compare_Source_Map); | |
7379 | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7380 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7381 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7382 s_simpleLock = SDL_CreateMutex(); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7383 if(NULL == s_simpleLock) |
0 | 7384 { |
7385 /* SDL sets the error message already? */ | |
7386 free(source); | |
7387 free(ALmixer_Channel_List); | |
7388 free(Source_Map_List); | |
31
ad4eb4330fb0
Added initialized check in Begin/End interruption.
Eric Wing <ewing@anscamobile.com>
parents:
30
diff
changeset
|
7389 ALmixer_Initialized = AL_FALSE; |
0 | 7390 Number_of_Channels_global = 0; |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7391 return AL_FALSE; |
0 | 7392 } |
7393 | |
7394 | |
31
ad4eb4330fb0
Added initialized check in Begin/End interruption.
Eric Wing <ewing@anscamobile.com>
parents:
30
diff
changeset
|
7395 g_StreamThreadEnabled = AL_TRUE; |
0 | 7396 Stream_Thread_global = SDL_CreateThread(Stream_Data_Thread_Callback, NULL); |
7397 if(NULL == Stream_Thread_global) | |
7398 { | |
7399 /* SDL sets the error message already? */ | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7400 SDL_DestroyMutex(s_simpleLock); |
0 | 7401 free(source); |
7402 free(ALmixer_Channel_List); | |
7403 free(Source_Map_List); | |
31
ad4eb4330fb0
Added initialized check in Begin/End interruption.
Eric Wing <ewing@anscamobile.com>
parents:
30
diff
changeset
|
7404 ALmixer_Initialized = AL_FALSE; |
0 | 7405 Number_of_Channels_global = 0; |
31
ad4eb4330fb0
Added initialized check in Begin/End interruption.
Eric Wing <ewing@anscamobile.com>
parents:
30
diff
changeset
|
7406 g_StreamThreadEnabled = AL_FALSE; |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7407 return AL_FALSE; |
0 | 7408 } |
24
e085cbc573cf
iOS optimization/bug/workaround.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
22
diff
changeset
|
7409 |
e085cbc573cf
iOS optimization/bug/workaround.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
22
diff
changeset
|
7410 /* Note: Only a few platforms change the priority. See implementation for notes. */ |
e085cbc573cf
iOS optimization/bug/workaround.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
22
diff
changeset
|
7411 Internal_LowerThreadPriority(Stream_Thread_global); |
e085cbc573cf
iOS optimization/bug/workaround.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
22
diff
changeset
|
7412 |
6
4b1048af7e55
Disabled some of the debugging printfs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
3
diff
changeset
|
7413 /* |
0 | 7414 fprintf(stderr, "Using threads\n"); |
6
4b1048af7e55
Disabled some of the debugging printfs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
3
diff
changeset
|
7415 */ |
0 | 7416 #endif /* End of ENABLE_ALMIXER_THREADS */ |
7417 | |
7418 /* We don't need this array any more because all the sources | |
7419 * are connected to channels | |
7420 */ | |
7421 free(source); | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7422 return AL_TRUE; |
0 | 7423 } |
7424 | |
22
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7425 void ALmixer_BeginInterruption() |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7426 { |
31
ad4eb4330fb0
Added initialized check in Begin/End interruption.
Eric Wing <ewing@anscamobile.com>
parents:
30
diff
changeset
|
7427 if((AL_TRUE == g_inInterruption) || (AL_FALSE == ALmixer_Initialized)) |
29
1c23805d5ce9
Optimization to destroy bookkeeping thread on BeginInterruption() and recreate it on EndInterruption(). I'm concerned that Android may be running this thread and eating up unnecessary sleep cycles, particularly on certain devices that may have pathological sleep disorders. (There is a report about Samsung Galaxy Tab.)
Eric Wing <ewing . public |-at-| gmail . com>
parents:
28
diff
changeset
|
7428 { |
1c23805d5ce9
Optimization to destroy bookkeeping thread on BeginInterruption() and recreate it on EndInterruption(). I'm concerned that Android may be running this thread and eating up unnecessary sleep cycles, particularly on certain devices that may have pathological sleep disorders. (There is a report about Samsung Galaxy Tab.)
Eric Wing <ewing . public |-at-| gmail . com>
parents:
28
diff
changeset
|
7429 return; |
1c23805d5ce9
Optimization to destroy bookkeeping thread on BeginInterruption() and recreate it on EndInterruption(). I'm concerned that Android may be running this thread and eating up unnecessary sleep cycles, particularly on certain devices that may have pathological sleep disorders. (There is a report about Samsung Galaxy Tab.)
Eric Wing <ewing . public |-at-| gmail . com>
parents:
28
diff
changeset
|
7430 } |
1c23805d5ce9
Optimization to destroy bookkeeping thread on BeginInterruption() and recreate it on EndInterruption(). I'm concerned that Android may be running this thread and eating up unnecessary sleep cycles, particularly on certain devices that may have pathological sleep disorders. (There is a report about Samsung Galaxy Tab.)
Eric Wing <ewing . public |-at-| gmail . com>
parents:
28
diff
changeset
|
7431 #ifdef ENABLE_ALMIXER_THREADS |
1c23805d5ce9
Optimization to destroy bookkeeping thread on BeginInterruption() and recreate it on EndInterruption(). I'm concerned that Android may be running this thread and eating up unnecessary sleep cycles, particularly on certain devices that may have pathological sleep disorders. (There is a report about Samsung Galaxy Tab.)
Eric Wing <ewing . public |-at-| gmail . com>
parents:
28
diff
changeset
|
7432 /* Kill bookkeeping thread to help minimize wasted CPU resources */ |
1c23805d5ce9
Optimization to destroy bookkeeping thread on BeginInterruption() and recreate it on EndInterruption(). I'm concerned that Android may be running this thread and eating up unnecessary sleep cycles, particularly on certain devices that may have pathological sleep disorders. (There is a report about Samsung Galaxy Tab.)
Eric Wing <ewing . public |-at-| gmail . com>
parents:
28
diff
changeset
|
7433 |
1c23805d5ce9
Optimization to destroy bookkeeping thread on BeginInterruption() and recreate it on EndInterruption(). I'm concerned that Android may be running this thread and eating up unnecessary sleep cycles, particularly on certain devices that may have pathological sleep disorders. (There is a report about Samsung Galaxy Tab.)
Eric Wing <ewing . public |-at-| gmail . com>
parents:
28
diff
changeset
|
7434 /* Is locking really necessary here? */ |
1c23805d5ce9
Optimization to destroy bookkeeping thread on BeginInterruption() and recreate it on EndInterruption(). I'm concerned that Android may be running this thread and eating up unnecessary sleep cycles, particularly on certain devices that may have pathological sleep disorders. (There is a report about Samsung Galaxy Tab.)
Eric Wing <ewing . public |-at-| gmail . com>
parents:
28
diff
changeset
|
7435 /* SDL_LockMutex(s_simpleLock); */ |
32
71fce7ac6e13
Bug fix: Boolean should have been flipped...causes deadlock.
Eric Wing <ewing@anscamobile.com>
parents:
31
diff
changeset
|
7436 g_StreamThreadEnabled = AL_FALSE; |
29
1c23805d5ce9
Optimization to destroy bookkeeping thread on BeginInterruption() and recreate it on EndInterruption(). I'm concerned that Android may be running this thread and eating up unnecessary sleep cycles, particularly on certain devices that may have pathological sleep disorders. (There is a report about Samsung Galaxy Tab.)
Eric Wing <ewing . public |-at-| gmail . com>
parents:
28
diff
changeset
|
7437 /* SDL_UnlockMutex(s_simpleLock); */ |
1c23805d5ce9
Optimization to destroy bookkeeping thread on BeginInterruption() and recreate it on EndInterruption(). I'm concerned that Android may be running this thread and eating up unnecessary sleep cycles, particularly on certain devices that may have pathological sleep disorders. (There is a report about Samsung Galaxy Tab.)
Eric Wing <ewing . public |-at-| gmail . com>
parents:
28
diff
changeset
|
7438 |
1c23805d5ce9
Optimization to destroy bookkeeping thread on BeginInterruption() and recreate it on EndInterruption(). I'm concerned that Android may be running this thread and eating up unnecessary sleep cycles, particularly on certain devices that may have pathological sleep disorders. (There is a report about Samsung Galaxy Tab.)
Eric Wing <ewing . public |-at-| gmail . com>
parents:
28
diff
changeset
|
7439 SDL_WaitThread(Stream_Thread_global, NULL); |
1c23805d5ce9
Optimization to destroy bookkeeping thread on BeginInterruption() and recreate it on EndInterruption(). I'm concerned that Android may be running this thread and eating up unnecessary sleep cycles, particularly on certain devices that may have pathological sleep disorders. (There is a report about Samsung Galaxy Tab.)
Eric Wing <ewing . public |-at-| gmail . com>
parents:
28
diff
changeset
|
7440 Stream_Thread_global = NULL; |
1c23805d5ce9
Optimization to destroy bookkeeping thread on BeginInterruption() and recreate it on EndInterruption(). I'm concerned that Android may be running this thread and eating up unnecessary sleep cycles, particularly on certain devices that may have pathological sleep disorders. (There is a report about Samsung Galaxy Tab.)
Eric Wing <ewing . public |-at-| gmail . com>
parents:
28
diff
changeset
|
7441 |
22
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7442 #endif |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7443 s_interruptionContext = alcGetCurrentContext(); |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7444 if(NULL != s_interruptionContext) |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7445 { |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7446 /* iOS alcSuspendContext is a no-op */ |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7447 alcSuspendContext(s_interruptionContext); |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7448 alcMakeContextCurrent(NULL); |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7449 } |
29
1c23805d5ce9
Optimization to destroy bookkeeping thread on BeginInterruption() and recreate it on EndInterruption(). I'm concerned that Android may be running this thread and eating up unnecessary sleep cycles, particularly on certain devices that may have pathological sleep disorders. (There is a report about Samsung Galaxy Tab.)
Eric Wing <ewing . public |-at-| gmail . com>
parents:
28
diff
changeset
|
7450 |
40
2b0b55b7f8cf
Resync to get interruption changes.
Eric Wing <ewing@anscamobile.com>
parents:
37
diff
changeset
|
7451 g_inInterruption = AL_TRUE; |
22
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7452 } |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7453 |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7454 void ALmixer_EndInterruption() |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7455 { |
31
ad4eb4330fb0
Added initialized check in Begin/End interruption.
Eric Wing <ewing@anscamobile.com>
parents:
30
diff
changeset
|
7456 if((AL_FALSE == g_inInterruption) || (AL_FALSE == ALmixer_Initialized)) |
29
1c23805d5ce9
Optimization to destroy bookkeeping thread on BeginInterruption() and recreate it on EndInterruption(). I'm concerned that Android may be running this thread and eating up unnecessary sleep cycles, particularly on certain devices that may have pathological sleep disorders. (There is a report about Samsung Galaxy Tab.)
Eric Wing <ewing . public |-at-| gmail . com>
parents:
28
diff
changeset
|
7457 { |
1c23805d5ce9
Optimization to destroy bookkeeping thread on BeginInterruption() and recreate it on EndInterruption(). I'm concerned that Android may be running this thread and eating up unnecessary sleep cycles, particularly on certain devices that may have pathological sleep disorders. (There is a report about Samsung Galaxy Tab.)
Eric Wing <ewing . public |-at-| gmail . com>
parents:
28
diff
changeset
|
7458 return; |
1c23805d5ce9
Optimization to destroy bookkeeping thread on BeginInterruption() and recreate it on EndInterruption(). I'm concerned that Android may be running this thread and eating up unnecessary sleep cycles, particularly on certain devices that may have pathological sleep disorders. (There is a report about Samsung Galaxy Tab.)
Eric Wing <ewing . public |-at-| gmail . com>
parents:
28
diff
changeset
|
7459 } |
22
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7460 |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7461 /* Note: iOS, you need to set the AudioSession active. |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7462 * But if the AudioSession is not initialized, this SetActive |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7463 * call fails. |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7464 * So this is probably better if calling app sets this. |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7465 */ |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7466 /* |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7467 #if (TARGET_OS_IPHONE == 1) || (TARGET_IPHONE_SIMULATOR == 1) |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7468 OSStatus the_error = AudioSessionSetActive(true); |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7469 if(noErr != the_error) |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7470 { |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7471 fprintf(stderr, "Error setting audio session active! %d\n", the_error); |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7472 } |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7473 #endif |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7474 */ |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7475 |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7476 if(NULL != s_interruptionContext) |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7477 { |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7478 alcMakeContextCurrent(s_interruptionContext); |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7479 alcProcessContext(s_interruptionContext); |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7480 s_interruptionContext = NULL; |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7481 } |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7482 #ifdef ENABLE_ALMIXER_THREADS |
31
ad4eb4330fb0
Added initialized check in Begin/End interruption.
Eric Wing <ewing@anscamobile.com>
parents:
30
diff
changeset
|
7483 g_StreamThreadEnabled = AL_TRUE; |
29
1c23805d5ce9
Optimization to destroy bookkeeping thread on BeginInterruption() and recreate it on EndInterruption(). I'm concerned that Android may be running this thread and eating up unnecessary sleep cycles, particularly on certain devices that may have pathological sleep disorders. (There is a report about Samsung Galaxy Tab.)
Eric Wing <ewing . public |-at-| gmail . com>
parents:
28
diff
changeset
|
7484 |
1c23805d5ce9
Optimization to destroy bookkeeping thread on BeginInterruption() and recreate it on EndInterruption(). I'm concerned that Android may be running this thread and eating up unnecessary sleep cycles, particularly on certain devices that may have pathological sleep disorders. (There is a report about Samsung Galaxy Tab.)
Eric Wing <ewing . public |-at-| gmail . com>
parents:
28
diff
changeset
|
7485 Stream_Thread_global = SDL_CreateThread(Stream_Data_Thread_Callback, NULL); |
1c23805d5ce9
Optimization to destroy bookkeeping thread on BeginInterruption() and recreate it on EndInterruption(). I'm concerned that Android may be running this thread and eating up unnecessary sleep cycles, particularly on certain devices that may have pathological sleep disorders. (There is a report about Samsung Galaxy Tab.)
Eric Wing <ewing . public |-at-| gmail . com>
parents:
28
diff
changeset
|
7486 if(NULL == Stream_Thread_global) |
1c23805d5ce9
Optimization to destroy bookkeeping thread on BeginInterruption() and recreate it on EndInterruption(). I'm concerned that Android may be running this thread and eating up unnecessary sleep cycles, particularly on certain devices that may have pathological sleep disorders. (There is a report about Samsung Galaxy Tab.)
Eric Wing <ewing . public |-at-| gmail . com>
parents:
28
diff
changeset
|
7487 { |
1c23805d5ce9
Optimization to destroy bookkeeping thread on BeginInterruption() and recreate it on EndInterruption(). I'm concerned that Android may be running this thread and eating up unnecessary sleep cycles, particularly on certain devices that may have pathological sleep disorders. (There is a report about Samsung Galaxy Tab.)
Eric Wing <ewing . public |-at-| gmail . com>
parents:
28
diff
changeset
|
7488 fprintf(stderr, "Critical Error: Could not create bookkeeping thread in EndInterruption\n"); |
1c23805d5ce9
Optimization to destroy bookkeeping thread on BeginInterruption() and recreate it on EndInterruption(). I'm concerned that Android may be running this thread and eating up unnecessary sleep cycles, particularly on certain devices that may have pathological sleep disorders. (There is a report about Samsung Galaxy Tab.)
Eric Wing <ewing . public |-at-| gmail . com>
parents:
28
diff
changeset
|
7489 } |
1c23805d5ce9
Optimization to destroy bookkeeping thread on BeginInterruption() and recreate it on EndInterruption(). I'm concerned that Android may be running this thread and eating up unnecessary sleep cycles, particularly on certain devices that may have pathological sleep disorders. (There is a report about Samsung Galaxy Tab.)
Eric Wing <ewing . public |-at-| gmail . com>
parents:
28
diff
changeset
|
7490 #endif |
31
ad4eb4330fb0
Added initialized check in Begin/End interruption.
Eric Wing <ewing@anscamobile.com>
parents:
30
diff
changeset
|
7491 g_inInterruption = AL_FALSE; |
22
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7492 } |
0 | 7493 |
40
2b0b55b7f8cf
Resync to get interruption changes.
Eric Wing <ewing@anscamobile.com>
parents:
37
diff
changeset
|
7494 |
2b0b55b7f8cf
Resync to get interruption changes.
Eric Wing <ewing@anscamobile.com>
parents:
37
diff
changeset
|
7495 ALboolean ALmixer_IsInInterruption() |
2b0b55b7f8cf
Resync to get interruption changes.
Eric Wing <ewing@anscamobile.com>
parents:
37
diff
changeset
|
7496 { |
2b0b55b7f8cf
Resync to get interruption changes.
Eric Wing <ewing@anscamobile.com>
parents:
37
diff
changeset
|
7497 if(AL_FALSE == ALmixer_Initialized) |
2b0b55b7f8cf
Resync to get interruption changes.
Eric Wing <ewing@anscamobile.com>
parents:
37
diff
changeset
|
7498 { |
2b0b55b7f8cf
Resync to get interruption changes.
Eric Wing <ewing@anscamobile.com>
parents:
37
diff
changeset
|
7499 return AL_FALSE; |
2b0b55b7f8cf
Resync to get interruption changes.
Eric Wing <ewing@anscamobile.com>
parents:
37
diff
changeset
|
7500 } |
2b0b55b7f8cf
Resync to get interruption changes.
Eric Wing <ewing@anscamobile.com>
parents:
37
diff
changeset
|
7501 return g_inInterruption; |
2b0b55b7f8cf
Resync to get interruption changes.
Eric Wing <ewing@anscamobile.com>
parents:
37
diff
changeset
|
7502 } |
2b0b55b7f8cf
Resync to get interruption changes.
Eric Wing <ewing@anscamobile.com>
parents:
37
diff
changeset
|
7503 |
0 | 7504 /* Keep the return value void to allow easy use with |
7505 * atexit() | |
7506 */ | |
7507 void ALmixer_Quit() | |
7508 { | |
7509 ALCcontext* context; | |
7510 ALCdevice* dev; | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7511 ALint i; |
0 | 7512 |
7513 if( ! ALmixer_Initialized) | |
7514 { | |
7515 return; | |
7516 } | |
29
1c23805d5ce9
Optimization to destroy bookkeeping thread on BeginInterruption() and recreate it on EndInterruption(). I'm concerned that Android may be running this thread and eating up unnecessary sleep cycles, particularly on certain devices that may have pathological sleep disorders. (There is a report about Samsung Galaxy Tab.)
Eric Wing <ewing . public |-at-| gmail . com>
parents:
28
diff
changeset
|
7517 |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7518 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7519 SDL_LockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7520 #endif |
22
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7521 |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7522 /* Several things we need to do: |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7523 First, we need to check if we are in an interruption. |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7524 If so, we need to reactivate the alcContext so we can call OpenAL functions. |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7525 Next, we should delete the OpenAL sources. |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7526 Next, we need to free all the sound data via ALmixer_FreeData(). |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7527 Finally, we can delete the OpenAL context. |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7528 */ |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7529 |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7530 context = alcGetCurrentContext(); |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7531 if(NULL == context) |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7532 { |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7533 /* We might have an interruption event where the current context is NULL */ |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7534 if(NULL == s_interruptionContext) |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7535 { |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7536 /* Nothing left to try. I think we're done. */ |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7537 fprintf(stderr, "ALmixer_Quit: Assertion Error. Expecting to find an OpenAL context, but could not find one.\n"); |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7538 return; |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7539 } |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7540 else |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7541 { |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7542 context = s_interruptionContext; |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7543 /* reactivate the context so we can call OpenAL functions */ |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7544 alcMakeContextCurrent(context); |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7545 s_interruptionContext = NULL; |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7546 } |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7547 } |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7548 |
0 | 7549 /* Shutdown everything before closing context */ |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7550 Internal_HaltChannel(-1, AL_FALSE); |
0 | 7551 |
7552 /* This flag will cause the thread to terminate */ | |
31
ad4eb4330fb0
Added initialized check in Begin/End interruption.
Eric Wing <ewing@anscamobile.com>
parents:
30
diff
changeset
|
7553 ALmixer_Initialized = AL_FALSE; |
ad4eb4330fb0
Added initialized check in Begin/End interruption.
Eric Wing <ewing@anscamobile.com>
parents:
30
diff
changeset
|
7554 #ifdef ENABLE_ALMIXER_THREADS |
ad4eb4330fb0
Added initialized check in Begin/End interruption.
Eric Wing <ewing@anscamobile.com>
parents:
30
diff
changeset
|
7555 g_StreamThreadEnabled = AL_FALSE; |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7556 SDL_UnlockMutex(s_simpleLock); |
29
1c23805d5ce9
Optimization to destroy bookkeeping thread on BeginInterruption() and recreate it on EndInterruption(). I'm concerned that Android may be running this thread and eating up unnecessary sleep cycles, particularly on certain devices that may have pathological sleep disorders. (There is a report about Samsung Galaxy Tab.)
Eric Wing <ewing . public |-at-| gmail . com>
parents:
28
diff
changeset
|
7557 /* This is safe to call with NULL thread, so we don't need to do anything special for interruptions. */ |
0 | 7558 SDL_WaitThread(Stream_Thread_global, NULL); |
29
1c23805d5ce9
Optimization to destroy bookkeeping thread on BeginInterruption() and recreate it on EndInterruption(). I'm concerned that Android may be running this thread and eating up unnecessary sleep cycles, particularly on certain devices that may have pathological sleep disorders. (There is a report about Samsung Galaxy Tab.)
Eric Wing <ewing . public |-at-| gmail . com>
parents:
28
diff
changeset
|
7559 Stream_Thread_global = NULL; |
0 | 7560 |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7561 SDL_DestroyMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7562 #endif |
31
ad4eb4330fb0
Added initialized check in Begin/End interruption.
Eric Wing <ewing@anscamobile.com>
parents:
30
diff
changeset
|
7563 g_inInterruption = AL_FALSE; |
22
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7564 |
0 | 7565 /* Delete all the OpenAL sources */ |
7566 for(i=0; i<Number_of_Channels_global; i++) | |
7567 { | |
7568 alDeleteSources(1, &ALmixer_Channel_List[i].alsource); | |
7569 } | |
7570 /* Delete all the channels */ | |
7571 free(ALmixer_Channel_List); | |
7572 free(Source_Map_List); | |
22
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7573 |
0 | 7574 /* Reset the Number_of_Channels just in case somebody |
7575 * tries using a ALmixer function. | |
7576 * I probably should put "Initialized" checks everywhere, | |
7577 * but I'm too lazy at the moment. | |
7578 */ | |
7579 Number_of_Channels_global = 0; | |
7580 | |
22
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7581 |
13
54aa96ae8912
Added LinkedList class to project.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
12
diff
changeset
|
7582 /* Delete the list of ALmixerData's before Sound_Quit deletes |
54aa96ae8912
Added LinkedList class to project.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
12
diff
changeset
|
7583 * its own underlying information and I potentially have dangling pointers. |
54aa96ae8912
Added LinkedList class to project.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
12
diff
changeset
|
7584 */ |
54aa96ae8912
Added LinkedList class to project.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
12
diff
changeset
|
7585 while(LinkedList_Size(s_listOfALmixerData) > 0) |
54aa96ae8912
Added LinkedList class to project.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
12
diff
changeset
|
7586 { |
16
038baa026db3
Fixed bug in LinkedList delete. Shouldn't have both popped list and then called FreeData which would check the list again for the data. Instead, I should just get the data and then call FreeData to let it manipulate the list.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
13
diff
changeset
|
7587 /* Note that ALmixer_FreeData will remove the data from the linked list for us so don't pop the list here. */ |
33
28cf14726606
Fixed infinite loop bug for delete.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
32
diff
changeset
|
7588 ALmixer_Data* almixer_data = LinkedList_PopBack(s_listOfALmixerData); |
37
b346b6608eab
Fixed memory leak in Quit due to changes related to background thread removal. FreeData was quick escaping because it checked for ALmixer_Initialized which is now false by the time the code is reached.
Eric Wing <ewing@anscamobile.com>
parents:
36
diff
changeset
|
7589 /* Watch out: ALmixer_FreeData used to escape because ALmixer_Initialized is now false. */ |
b346b6608eab
Fixed memory leak in Quit due to changes related to background thread removal. FreeData was quick escaping because it checked for ALmixer_Initialized which is now false by the time the code is reached.
Eric Wing <ewing@anscamobile.com>
parents:
36
diff
changeset
|
7590 Internal_FreeData(almixer_data); |
13
54aa96ae8912
Added LinkedList class to project.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
12
diff
changeset
|
7591 } |
54aa96ae8912
Added LinkedList class to project.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
12
diff
changeset
|
7592 LinkedList_Free(s_listOfALmixerData); |
54aa96ae8912
Added LinkedList class to project.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
12
diff
changeset
|
7593 s_listOfALmixerData = NULL; |
22
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7594 |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7595 |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7596 /* Need to get the device before I close the context */ |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7597 dev = alcGetContextsDevice(context); |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7598 |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7599 alcMakeContextCurrent(NULL); |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7600 alcDestroyContext(context); |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7601 |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7602 if(NULL == dev) |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7603 { |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7604 return; |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7605 } |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7606 alcCloseDevice(dev); |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
7607 |
0 | 7608 Sound_Quit(); |
7609 | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7610 #ifdef ALMIXER_COMPILE_WITHOUT_SDL |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7611 /* Remember: ALmixer_SetError/GetError calls will not work while this is gone. */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7612 TError_FreeErrorPool(s_ALmixerErrorPool); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7613 s_ALmixerErrorPool = NULL; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7614 #endif |
0 | 7615 return; |
7616 } | |
7617 | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7618 ALboolean ALmixer_IsInitialized() |
0 | 7619 { |
7620 return ALmixer_Initialized; | |
7621 } | |
7622 | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7623 ALuint ALmixer_GetFrequency() |
0 | 7624 { |
7625 return ALmixer_Frequency_global; | |
7626 } | |
7627 | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7628 const ALmixer_version* ALmixer_GetLinkedVersion() |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7629 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7630 static ALmixer_version linked_mixver; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7631 ALMIXER_GET_COMPILED_VERSION(&linked_mixver); |
0 | 7632 return(&linked_mixver); |
7633 } | |
7634 | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7635 #ifdef ALMIXER_COMPILE_WITHOUT_SDL |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7636 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7637 const char* ALmixer_GetError() |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7638 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7639 const char* error_string = NULL; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7640 if(NULL == s_ALmixerErrorPool) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7641 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7642 return "Error: You should not call ALmixer_GetError while ALmixer is not initialized"; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7643 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7644 error_string = TError_GetLastErrorStr(s_ALmixerErrorPool); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7645 /* SDL returns empty strings instead of NULL */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7646 if(NULL == error_string) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7647 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7648 return ""; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7649 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7650 else |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7651 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7652 return error_string; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7653 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7654 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7655 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7656 void ALmixer_SetError(const char* err_str, ...) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7657 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7658 if(NULL == s_ALmixerErrorPool) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7659 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7660 fprintf(stderr, "Error: You should not call ALmixer_SetError while ALmixer is not initialized\n"); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7661 return; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7662 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7663 va_list argp; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7664 va_start(argp, err_str); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7665 // SDL_SetError which I'm emulating has no number parameter. |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7666 TError_SetErrorv(s_ALmixerErrorPool, 1, err_str, argp); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7667 va_end(argp); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7668 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7669 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7670 #endif |
0 | 7671 |
7672 | |
7673 | |
7674 | |
7675 #if 0 | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7676 void ALmixer_OutputAttributes() |
0 | 7677 { |
7678 ALint num_flags = 0; | |
7679 ALint* flags = 0; | |
7680 int i; | |
7681 ALCdevice* dev = alcGetContextsDevice( alcGetCurrentContext() ); | |
7682 | |
7683 | |
7684 printf("custom context\n"); | |
7685 | |
7686 alcGetIntegerv(dev, ALC_ATTRIBUTES_SIZE, | |
7687 sizeof num_flags, &num_flags ); | |
7688 | |
7689 printf("Number of Flags: %d\n", num_flags); | |
7690 | |
7691 if(num_flags) | |
7692 { | |
7693 flags = malloc(sizeof(num_flags) * sizeof(ALint)); | |
7694 | |
7695 alcGetIntegerv(dev, ALC_ALL_ATTRIBUTES, | |
7696 sizeof num_flags * sizeof(ALint), | |
7697 flags ); | |
7698 } | |
7699 for(i = 0; i < num_flags-1; i += 2) | |
7700 { | |
7701 printf("key 0x%x : value %d\n", | |
7702 flags[i], flags[i+1]); | |
7703 } | |
7704 free(flags); | |
7705 } | |
7706 #endif | |
7707 | |
7708 | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7709 void ALmixer_OutputDecoders() |
0 | 7710 { |
7711 Sound_Version sound_compile_version; | |
7712 Sound_Version sound_link_version; | |
7713 | |
7714 const Sound_DecoderInfo **rc = Sound_AvailableDecoders(); | |
7715 const Sound_DecoderInfo **i; | |
7716 const char **ext; | |
7717 FILE* stream = stdout; | |
7718 | |
7719 | |
7720 fprintf(stream, "SDL_sound Information:\n"); | |
7721 | |
7722 SOUND_VERSION(&sound_compile_version); | |
7723 fprintf(stream, "\tCompiled with SDL_sound version: %d.%d.%d\n", | |
7724 sound_compile_version.major, | |
7725 sound_compile_version.minor, | |
7726 sound_compile_version.patch); | |
7727 | |
7728 Sound_GetLinkedVersion(&sound_link_version); | |
7729 fprintf(stream, "\tRunning (linked) with SDL_sound version: %d.%d.%d\n", | |
7730 sound_link_version.major, | |
7731 sound_link_version.minor, | |
7732 sound_link_version.patch); | |
7733 | |
7734 fprintf(stream, "Supported sound formats:\n"); | |
7735 if (rc == NULL) | |
7736 fprintf(stream, " * Apparently, NONE!\n"); | |
7737 else | |
7738 { | |
7739 for (i = rc; *i != NULL; i++) | |
7740 { | |
7741 fprintf(stream, " * %s\n", (*i)->description); | |
7742 | |
7743 for (ext = (*i)->extensions; *ext != NULL; ext++) | |
7744 fprintf(stream, " File extension \"%s\"\n", *ext); | |
7745 | |
7746 fprintf(stream, " Written by %s.\n %s\n\n", | |
7747 (*i)->author, (*i)->url); | |
7748 } /* for */ | |
7749 } /* else */ | |
7750 | |
7751 fprintf(stream, "\n"); | |
7752 } | |
7753 | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7754 void ALmixer_OutputOpenALInfo() |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7755 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7756 ALmixer_version mixer_compile_version; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7757 const ALmixer_version * mixer_link_version=ALmixer_GetLinkedVersion(); |
0 | 7758 FILE* stream = stdout; |
7759 | |
7760 fprintf(stream, "OpenAL Information:\n"); | |
7761 fprintf(stream, "\tAL_VENDOR: %s\n", alGetString( AL_VENDOR ) ); | |
7762 fprintf(stream, "\tAL_VERSION: %s\n", alGetString( AL_VERSION ) ); | |
7763 fprintf(stream, "\tAL_RENDERER: %s\n", alGetString( AL_RENDERER ) ); | |
7764 fprintf(stream, "\tAL_EXTENSIONS: %s\n", alGetString( AL_EXTENSIONS ) ); | |
7765 | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7766 ALMIXER_GET_COMPILED_VERSION(&mixer_compile_version); |
0 | 7767 fprintf(stream, "\nSDL_ALmixer Information:\n"); |
7768 fprintf(stream, "\tCompiled with SDL_ALmixer version: %d.%d.%d\n", | |
7769 mixer_compile_version.major, | |
7770 mixer_compile_version.minor, | |
7771 mixer_compile_version.patch); | |
7772 | |
7773 fprintf(stream, "\tRunning (linked) with SDL_ALmixer version: %d.%d.%d\n", | |
7774 mixer_link_version->major, | |
7775 mixer_link_version->minor, | |
7776 mixer_link_version->patch); | |
7777 | |
7778 fprintf(stream, "\tCompile flags: "); | |
7779 #ifdef ENABLE_LOKI_QUEUE_FIX_HACK | |
7780 fprintf(stream, "ENABLE_LOKI_QUEUE_FIX_HACK "); | |
7781 #endif | |
7782 #ifdef ENABLE_ALMIXER_THREADS | |
7783 fprintf(stream, "ENABLE_ALMIXER_THREADS "); | |
7784 #endif | |
7785 #ifdef ENABLE_ALC_SYNC | |
7786 fprintf(stream, "ENABLE_ALC_SYNC "); | |
7787 #endif | |
7788 fprintf(stream, "\n"); | |
7789 } | |
7790 | |
7791 | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7792 ALint ALmixer_AllocateChannels(ALint numchans) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7793 { |
36
b65ad8b6ccf3
Moved two variable declarations to the top to make old C89/90 compilers happy.
Eric Wing <ewing@anscamobile.com>
parents:
35
diff
changeset
|
7794 ALint retval; |
40
2b0b55b7f8cf
Resync to get interruption changes.
Eric Wing <ewing@anscamobile.com>
parents:
37
diff
changeset
|
7795 if( (AL_FALSE == ALmixer_Initialized) || (AL_TRUE == g_inInterruption) ) |
27
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
7796 { |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
7797 return -1; |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
7798 } |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
7799 |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7800 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7801 SDL_LockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7802 #endif |
0 | 7803 retval = Internal_AllocateChannels(numchans); |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7804 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7805 SDL_UnlockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7806 #endif |
0 | 7807 return retval; |
7808 } | |
7809 | |
7810 | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7811 ALint ALmixer_ReserveChannels(ALint num) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7812 { |
36
b65ad8b6ccf3
Moved two variable declarations to the top to make old C89/90 compilers happy.
Eric Wing <ewing@anscamobile.com>
parents:
35
diff
changeset
|
7813 ALint retval; |
40
2b0b55b7f8cf
Resync to get interruption changes.
Eric Wing <ewing@anscamobile.com>
parents:
37
diff
changeset
|
7814 if( (AL_FALSE == ALmixer_Initialized) || (AL_TRUE == g_inInterruption) ) |
27
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
7815 { |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
7816 return -1; |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
7817 } |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
7818 |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7819 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7820 SDL_LockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7821 #endif |
0 | 7822 retval = Internal_ReserveChannels(num); |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7823 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7824 SDL_UnlockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7825 #endif |
0 | 7826 return retval; |
7827 } | |
7828 | |
7829 | |
7830 | |
7831 | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7832 static ALmixer_Data* DoLoad(Sound_Sample* sample, ALuint buffersize, ALboolean decode_mode_is_predecoded, ALuint max_queue_buffers, ALuint num_startup_buffers, ALboolean access_data) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7833 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7834 ALuint bytes_decoded; |
0 | 7835 ALmixer_Data* ret_data; |
7836 ALenum error; | |
7837 | |
7838 /* Allocate memory */ | |
7839 ret_data = (ALmixer_Data *)malloc(sizeof(ALmixer_Data)); | |
7840 if (NULL == ret_data) | |
7841 { | |
7842 ALmixer_SetError("Out of memory"); | |
7843 return(NULL); | |
7844 } | |
7845 | |
7846 /* Initialize the data fields */ | |
7847 | |
7848 /* Set the Sound_Sample pointer */ | |
7849 ret_data->sample = sample; | |
7850 | |
7851 /* Flag the data to note that it is not in use */ | |
7852 ret_data->in_use = 0; | |
7853 | |
7854 /* Initialize remaining flags */ | |
7855 ret_data->total_time = -1; | |
7856 ret_data->eof = 0; | |
7857 | |
7858 /* Just initialize */ | |
7859 ret_data->num_buffers_in_use = 0; | |
7860 | |
7861 /* Just initialize */ | |
7862 ret_data->total_bytes = 0; | |
7863 | |
7864 /* Just initialize */ | |
7865 ret_data->loaded_bytes = 0; | |
7866 | |
7867 /* Set the max queue buffers (minimum must be 2) */ | |
7868 if(max_queue_buffers < 2) | |
7869 { | |
7870 max_queue_buffers = ALMIXER_DEFAULT_QUEUE_BUFFERS; | |
7871 } | |
7872 ret_data->max_queue_buffers = max_queue_buffers; | |
7873 /* Set up the start up buffers */ | |
7874 if(0 == num_startup_buffers) | |
7875 { | |
7876 num_startup_buffers = ALMIXER_DEFAULT_STARTUP_BUFFERS; | |
7877 } | |
7878 /* Make sure start up buffers is less or equal to max_queue_buffers */ | |
7879 if(num_startup_buffers > max_queue_buffers) | |
7880 { | |
7881 num_startup_buffers = max_queue_buffers; | |
7882 } | |
7883 ret_data->num_startup_buffers = num_startup_buffers; | |
35
76a881923cfc
Bug fix for starvation problem due to for-loop using uninitialized variable.
Eric Wing <ewing@anscamobile.com>
parents:
34
diff
changeset
|
7884 |
76a881923cfc
Bug fix for starvation problem due to for-loop using uninitialized variable.
Eric Wing <ewing@anscamobile.com>
parents:
34
diff
changeset
|
7885 /* TODO: Expose value through public API */ |
76a881923cfc
Bug fix for starvation problem due to for-loop using uninitialized variable.
Eric Wing <ewing@anscamobile.com>
parents:
34
diff
changeset
|
7886 ret_data->num_target_buffers_per_pass = 1; |
76a881923cfc
Bug fix for starvation problem due to for-loop using uninitialized variable.
Eric Wing <ewing@anscamobile.com>
parents:
34
diff
changeset
|
7887 |
0 | 7888 ret_data->buffer_map_list = NULL; |
7889 ret_data->current_buffer = 0; | |
7890 | |
7891 ret_data->circular_buffer_queue = NULL; | |
7892 | |
7893 /* Now decode and load the data into a data chunk */ | |
7894 /* Different cases for Streamed and Predecoded | |
7895 * Streamed might turn into a predecoded if buffersize | |
7896 * is large enough */ | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7897 if(AL_FALSE == decode_mode_is_predecoded) |
0 | 7898 { |
7899 bytes_decoded = Sound_Decode(sample); | |
7900 if(sample->flags & SOUND_SAMPLEFLAG_ERROR) | |
7901 { | |
7902 ALmixer_SetError(Sound_GetError()); | |
7903 Sound_FreeSample(sample); | |
7904 free(ret_data); | |
7905 return NULL; | |
7906 } | |
7907 | |
7908 /* If no data, return an error */ | |
7909 if(0 == bytes_decoded) | |
7910 { | |
7911 ALmixer_SetError("File has no data"); | |
7912 Sound_FreeSample(sample); | |
7913 free(ret_data); | |
7914 return NULL; | |
7915 } | |
7916 | |
7917 /* Note, currently, my Ogg conservative modifications | |
7918 * prevent EOF from being detected in the first read | |
7919 * because of the weird packet behavior of ov_read(). | |
7920 * The EAGAIN will get set, but not the EOF. | |
7921 * I don't know the best way to handle this, | |
7922 * so for now, Ogg's can only be explicitly | |
7923 * predecoded. | |
7924 */ | |
7925 | |
7926 /* Correction: Since we no longer actually keep the | |
7927 * streamed data we read here (we rewind and throw | |
7928 * it away, and start over on Play), it is | |
7929 * safe to read another chunk to see if we've hit EOF | |
7930 */ | |
7931 if(sample->flags & SOUND_SAMPLEFLAG_EAGAIN) | |
7932 { | |
7933 bytes_decoded = Sound_Decode(sample); | |
7934 if(sample->flags & SOUND_SAMPLEFLAG_ERROR) | |
7935 { | |
7936 ALmixer_SetError(Sound_GetError()); | |
7937 Sound_FreeSample(sample); | |
7938 free(ret_data); | |
7939 return NULL; | |
7940 } | |
7941 } | |
7942 | |
7943 | |
7944 /* If we found an EOF, the entire file was | |
7945 * decoded, so we can treat it like one. | |
7946 */ | |
7947 | |
7948 if(sample->flags & SOUND_SAMPLEFLAG_EOF) | |
7949 { | |
6
4b1048af7e55
Disabled some of the debugging printfs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
3
diff
changeset
|
7950 /* |
0 | 7951 fprintf(stderr, "We got LUCKY! File is predecoded even though STREAM was requested\n"); |
6
4b1048af7e55
Disabled some of the debugging printfs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
3
diff
changeset
|
7952 */ |
0 | 7953 ret_data->decoded_all = 1; |
7954 /* Need to keep this information around for | |
7955 * seek and rewind abilities. | |
7956 */ | |
7957 ret_data->total_bytes = bytes_decoded; | |
7958 /* For now, the loaded bytes is the same as total bytes, but | |
7959 * this could change during a seek operation | |
7960 */ | |
7961 ret_data->loaded_bytes = bytes_decoded; | |
7962 | |
7963 /* Let's compute the total playing time | |
7964 * SDL_sound does not yet provide this (we're working on | |
7965 * that at the moment...) | |
7966 */ | |
7967 ret_data->total_time = Compute_Total_Time(&sample->desired, bytes_decoded); | |
7968 | |
7969 /* Create one element in the buffer array for data for OpanAL */ | |
7970 ret_data->buffer = (ALuint*)malloc( sizeof(ALuint) ); | |
7971 if(NULL == ret_data->buffer) | |
7972 { | |
7973 ALmixer_SetError("Out of Memory"); | |
7974 Sound_FreeSample(sample); | |
7975 free(ret_data); | |
7976 return NULL; | |
7977 } | |
7978 /* Clear the error code */ | |
7979 alGetError(); | |
7980 /* Now generate an OpenAL buffer using that first element */ | |
7981 alGenBuffers(1, ret_data->buffer); | |
7982 if( (error = alGetError()) != AL_NO_ERROR) | |
7983 { | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
7984 ALmixer_SetError("alGenBuffers failed: %s\n", alGetString(error)); |
0 | 7985 Sound_FreeSample(sample); |
7986 free(ret_data->buffer); | |
7987 free(ret_data); | |
7988 return NULL; | |
7989 } | |
7990 | |
7991 | |
7992 /* Now copy the data to the OpenAL buffer */ | |
7993 /* We can't just set a pointer because the API needs | |
7994 * its own copy to assist hardware acceleration */ | |
7995 alBufferData(ret_data->buffer[0], | |
7996 TranslateFormat(&sample->desired), | |
7997 sample->buffer, | |
7998 bytes_decoded, | |
7999 sample->desired.rate | |
8000 ); | |
8001 if( (error = alGetError()) != AL_NO_ERROR) | |
8002 { | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8003 ALmixer_SetError("alBufferData failed: %s\n", alGetString(error)); |
0 | 8004 Sound_FreeSample(sample); |
8005 alDeleteBuffers(1, ret_data->buffer); | |
8006 free(ret_data->buffer); | |
8007 free(ret_data); | |
8008 return NULL; | |
8009 } | |
8010 | |
8011 /* We should be done with the sample since it's all | |
8012 * predecoded. So we can free the memory */ | |
8013 | |
8014 /* Additional notes: | |
8015 * We need to keep data around in case Seek() is needed | |
8016 * or other Sound_AudioInfo is needed. | |
8017 * This can either be done by not deleting the sample, | |
8018 * or it can be done by dynamically recreating it | |
8019 * when we need it. | |
8020 */ | |
8021 /* Since OpenAL won't let us retrieve it | |
8022 * (aka dynamically), we have to keep the Sample | |
8023 * around because since the user requested | |
8024 * streamed and we offered predecoded, | |
8025 * we don't want to mess up the user who | |
8026 * was expecting seek support | |
8027 * So Don't Do anything | |
8028 */ | |
8029 /* | |
8030 if(0 == access_data) | |
8031 { | |
8032 Sound_FreeSample(sample); | |
8033 ret_data->sample = NULL; | |
8034 } | |
8035 */ | |
8036 /* Else, We keep a copy of the sample around. | |
8037 * so don't do anything. | |
8038 */ | |
8039 | |
8040 #if 0 | |
8041 #if defined(DISABLE_PREDECODED_SEEK) | |
8042 Sound_FreeSample(sample); | |
8043 ret_data->sample = NULL; | |
8044 #elif !defined(DISABLE_SEEK_MEMORY_OPTIMIZATION) | |
8045 Sound_FreeSample(sample); | |
8046 ret_data->sample = NULL; | |
8047 #else | |
8048 /* We keep a copy of the sample around. | |
8049 * so don't do anything. | |
8050 */ | |
8051 #endif | |
8052 #endif | |
8053 /* okay we're done here */ | |
8054 | |
8055 } | |
8056 /* Else, we need to stream the data, so we'll | |
8057 * create multple buffers for queuing */ | |
8058 else | |
8059 { | |
6
4b1048af7e55
Disabled some of the debugging printfs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
3
diff
changeset
|
8060 /* |
0 | 8061 fprintf(stderr, "Loading streamed data (not lucky)\n"); |
6
4b1048af7e55
Disabled some of the debugging printfs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
3
diff
changeset
|
8062 */ |
0 | 8063 ret_data->decoded_all = 0; |
8064 | |
8065 /* This information is for predecoded. | |
8066 * Set to 0, since we don't know. | |
8067 */ | |
8068 ret_data->total_bytes = 0; | |
8069 | |
22
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
8070 ret_data->total_time = Sound_GetDuration(sample); |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
8071 |
0 | 8072 /* Create buffers for data |
8073 */ | |
8074 ret_data->buffer = (ALuint*)malloc( sizeof(ALuint) * max_queue_buffers); | |
8075 if(NULL == ret_data->buffer) | |
8076 { | |
8077 ALmixer_SetError("Out of Memory"); | |
8078 Sound_FreeSample(sample); | |
8079 free(ret_data); | |
8080 return NULL; | |
8081 } | |
8082 | |
8083 /* Clear the error code */ | |
8084 alGetError(); | |
8085 /* Now generate an OpenAL buffer using that first element */ | |
8086 alGenBuffers(max_queue_buffers, ret_data->buffer); | |
8087 if( (error = alGetError()) != AL_NO_ERROR) | |
8088 { | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8089 ALmixer_SetError("alGenBuffers failed: %s\n", alGetString(error)); |
0 | 8090 Sound_FreeSample(sample); |
8091 free(ret_data->buffer); | |
8092 free(ret_data); | |
8093 return NULL; | |
8094 } | |
8095 | |
8096 /* Redesign: Okay, because of the unqueuing problems and such, | |
8097 * I've decided to redesign where and how queuing is handled. | |
8098 * Before, everything was queued up here. However, this | |
8099 * placed a penalty on load and made performance inconsistent | |
8100 * when samples had to be rewound. It did make things easier | |
8101 * to queue because I could let OpenAL decide which buffer | |
8102 * needed to be queued next. | |
8103 * Now, I'm going to push off the queuing to the actual | |
8104 * Play() command. I'm going to add some book keeping, | |
8105 * and allow for additional buffers to be filled at later | |
8106 * times. | |
8107 */ | |
8108 | |
8109 | |
8110 /* So first of all, because of I already decoded the sample | |
8111 * for testing, I need to decide what to do with it. | |
8112 * The best thing would be be to alBufferData() it. | |
8113 * The problem is it may conflict with the rest of | |
8114 * the system because everything now assumes buffers | |
8115 * are entirely stripped (because of the unqueing | |
8116 * problem). | |
8117 * So it looks like I have to do the crappy thing | |
8118 * and throw away the data, and rewind. | |
8119 */ | |
8120 | |
8121 if(0 == Sound_Rewind(ret_data->sample)) | |
8122 { | |
8123 ALmixer_SetError("Cannot use sample for streamed data because it must be rewindable: %s", Sound_GetError() ); | |
8124 Sound_FreeSample(sample); | |
8125 free(ret_data->buffer); | |
8126 free(ret_data); | |
8127 return NULL; | |
8128 } | |
8129 | |
8130 | |
8131 /* If the user has selected access_data, we need to | |
8132 * keep copies of the queuing buffers around because | |
8133 * OpenAL won't let us access the data. | |
8134 * Allocate the memory for the buffers here | |
8135 * and initialize the albuffer-index map | |
8136 */ | |
8137 if(access_data) | |
8138 { | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8139 ALuint j; |
0 | 8140 /* Create buffers for data access |
8141 * Should be the same number as the number of queue buffers | |
8142 */ | |
1 | 8143 ret_data->buffer_map_list = (ALmixer_Buffer_Map*)malloc( sizeof(ALmixer_Buffer_Map) * max_queue_buffers); |
0 | 8144 if(NULL == ret_data->buffer_map_list) |
8145 { | |
8146 ALmixer_SetError("Out of Memory"); | |
8147 Sound_FreeSample(sample); | |
8148 free(ret_data->buffer); | |
8149 free(ret_data); | |
8150 return NULL; | |
8151 } | |
8152 | |
8153 ret_data->circular_buffer_queue = CircularQueueUnsignedInt_CreateQueue(max_queue_buffers); | |
8154 if(NULL == ret_data->circular_buffer_queue) | |
8155 { | |
8156 ALmixer_SetError("Out of Memory"); | |
8157 free(ret_data->buffer_map_list); | |
8158 Sound_FreeSample(sample); | |
8159 free(ret_data->buffer); | |
8160 free(ret_data); | |
8161 return NULL; | |
8162 } | |
8163 | |
8164 | |
8165 for(j=0; j<max_queue_buffers; j++) | |
8166 { | |
8167 ret_data->buffer_map_list[j].albuffer = ret_data->buffer[j]; | |
8168 ret_data->buffer_map_list[j].index = j; | |
8169 ret_data->buffer_map_list[j].num_bytes = 0; | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8170 ret_data->buffer_map_list[j].data = (ALbyte*)malloc( sizeof(ALbyte) * buffersize); |
0 | 8171 if(NULL == ret_data->buffer_map_list[j].data) |
8172 { | |
8173 ALmixer_SetError("Out of Memory"); | |
8174 break; | |
8175 } | |
8176 } | |
8177 /* If an error happened, we have to clean up the memory */ | |
8178 if(j < max_queue_buffers) | |
8179 { | |
40
2b0b55b7f8cf
Resync to get interruption changes.
Eric Wing <ewing@anscamobile.com>
parents:
37
diff
changeset
|
8180 ALmixer_SetError("################## Buffer allocation failed"); |
0 | 8181 fprintf(stderr, "################## Buffer allocation failed\n"); |
40
2b0b55b7f8cf
Resync to get interruption changes.
Eric Wing <ewing@anscamobile.com>
parents:
37
diff
changeset
|
8182 while(j>0) |
0 | 8183 { |
8184 free(ret_data->buffer_map_list[j].data); | |
40
2b0b55b7f8cf
Resync to get interruption changes.
Eric Wing <ewing@anscamobile.com>
parents:
37
diff
changeset
|
8185 j--; |
0 | 8186 } |
40
2b0b55b7f8cf
Resync to get interruption changes.
Eric Wing <ewing@anscamobile.com>
parents:
37
diff
changeset
|
8187 // Delete for j=0 because the while loop misses the last one |
2b0b55b7f8cf
Resync to get interruption changes.
Eric Wing <ewing@anscamobile.com>
parents:
37
diff
changeset
|
8188 free(ret_data->buffer_map_list[j].data); |
2b0b55b7f8cf
Resync to get interruption changes.
Eric Wing <ewing@anscamobile.com>
parents:
37
diff
changeset
|
8189 |
0 | 8190 free(ret_data->buffer_map_list); |
8191 CircularQueueUnsignedInt_FreeQueue(ret_data->circular_buffer_queue); | |
8192 Sound_FreeSample(sample); | |
8193 free(ret_data->buffer); | |
8194 free(ret_data); | |
8195 return NULL; | |
8196 } | |
8197 | |
8198 /* The Buffer_Map_List must be sorted by albuffer for binary searches | |
8199 */ | |
1 | 8200 qsort(ret_data->buffer_map_list, max_queue_buffers, sizeof(ALmixer_Buffer_Map), Compare_Buffer_Map); |
0 | 8201 } /* End if access_data==true */ |
8202 | |
8203 | |
8204 } /* End of do stream */ | |
8205 } /* end of DECODE_STREAM */ | |
8206 /* User requested decode all (easy, nothing to figure out) */ | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8207 else if(AL_TRUE == decode_mode_is_predecoded) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8208 { |
6
4b1048af7e55
Disabled some of the debugging printfs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
3
diff
changeset
|
8209 #ifdef ALMIXER_DISABLE_PREDECODED_PRECOMPUTE_BUFFER_SIZE_OPTIMIZATION |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8210 /* SDL_sound (behind the scenes) seems to loop on buffer_size chunks |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8211 * until the buffer is filled. It seems like we can |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8212 * do much better and precompute the size of the buffer |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8213 * so looping isn't needed. |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8214 * WARNING: Due to the way SDL_sound is currently implemented, |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8215 * this may waste a lot of memory up front. |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8216 * SDL_sound seems to pre-create a buffer of the requested size, |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8217 * but on DecodeAll, an entirely new buffer is created and |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8218 * everything is memcpy'd into the new buffer in read chunks |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8219 * of the buffer_size. This means we need roughly twice the memory |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8220 * to load a file. |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8221 */ |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8222 ALint sound_duration = Sound_GetDuration(sample); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8223 if(sound_duration > 0) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8224 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8225 size_t total_bytes = Compute_Total_Bytes_With_Frame_Padding(&sample->desired, (ALuint)sound_duration); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8226 int buffer_resize_succeeded = Sound_SetBufferSize(sample, total_bytes); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8227 if(0 == buffer_resize_succeeded) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8228 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8229 ALmixer_SetError(Sound_GetError()); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8230 Sound_FreeSample(sample); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8231 free(ret_data); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8232 return NULL; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8233 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8234 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8235 #endif /* ALMIXER_DISABLE_PREDECODED_PRECOMPUTE_BUFFER_SIZE_OPTIMIZATION */ |
0 | 8236 bytes_decoded = Sound_DecodeAll(sample); |
8237 if(sample->flags & SOUND_SAMPLEFLAG_ERROR) | |
8238 { | |
8239 ALmixer_SetError(Sound_GetError()); | |
8240 Sound_FreeSample(sample); | |
8241 free(ret_data); | |
8242 return NULL; | |
8243 } | |
8244 | |
8245 /* If no data, return an error */ | |
8246 if(0 == bytes_decoded) | |
8247 { | |
8248 ALmixer_SetError("File has no data"); | |
8249 Sound_FreeSample(sample); | |
8250 free(ret_data); | |
8251 return NULL; | |
8252 } | |
8253 | |
8254 | |
8255 ret_data->decoded_all = 1; | |
8256 /* Need to keep this information around for | |
8257 * seek and rewind abilities. | |
8258 */ | |
8259 ret_data->total_bytes = bytes_decoded; | |
8260 /* For now, the loaded bytes is the same as total bytes, but | |
8261 * this could change during a seek operation | |
8262 */ | |
8263 ret_data->loaded_bytes = bytes_decoded; | |
8264 | |
8265 /* Let's compute the total playing time | |
8266 * SDL_sound does not yet provide this (we're working on | |
8267 * that at the moment...) | |
8268 */ | |
8269 ret_data->total_time = Compute_Total_Time(&sample->desired, bytes_decoded); | |
8270 | |
8271 /* Create one element in the buffer array for data for OpanAL */ | |
8272 ret_data->buffer = (ALuint*)malloc( sizeof(ALuint) ); | |
8273 if(NULL == ret_data->buffer) | |
8274 { | |
8275 ALmixer_SetError("Out of Memory"); | |
8276 Sound_FreeSample(sample); | |
8277 free(ret_data); | |
8278 return NULL; | |
8279 } | |
8280 /* Clear the error code */ | |
8281 alGetError(); | |
8282 /* Now generate an OpenAL buffer using that first element */ | |
8283 alGenBuffers(1, ret_data->buffer); | |
8284 if( (error = alGetError()) != AL_NO_ERROR) | |
8285 { | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8286 ALmixer_SetError("alGenBuffers failed: %s\n", alGetString(error)); |
0 | 8287 Sound_FreeSample(sample); |
8288 free(ret_data->buffer); | |
8289 free(ret_data); | |
8290 return NULL; | |
8291 } | |
6
4b1048af7e55
Disabled some of the debugging printfs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
3
diff
changeset
|
8292 /* |
0 | 8293 fprintf(stderr, "Actual rate=%d, desired=%d\n", sample->actual.rate, sample->desired.rate); |
6
4b1048af7e55
Disabled some of the debugging printfs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
3
diff
changeset
|
8294 */ |
0 | 8295 /* Now copy the data to the OpenAL buffer */ |
8296 /* We can't just set a pointer because the API needs | |
8297 * its own copy to assist hardware acceleration */ | |
8298 alBufferData(ret_data->buffer[0], | |
8299 TranslateFormat(&sample->desired), | |
8300 sample->buffer, | |
8301 bytes_decoded, | |
8302 sample->desired.rate | |
8303 ); | |
8304 if( (error = alGetError()) != AL_NO_ERROR) | |
8305 { | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8306 ALmixer_SetError("alBufferData failed: %s\n", alGetString(error)); |
0 | 8307 Sound_FreeSample(sample); |
8308 alDeleteBuffers(1, ret_data->buffer); | |
8309 free(ret_data->buffer); | |
8310 free(ret_data); | |
8311 return NULL; | |
8312 } | |
8313 | |
8314 /* We should be done with the sample since it's all | |
8315 * predecoded. So we can free the memory */ | |
8316 /* Need to keep around because Seek() needs it */ | |
8317 | |
8318 /* Additional notes: | |
8319 * We need to keep data around in case Seek() is needed | |
8320 * or other Sound_AudioInfo is needed. | |
8321 * This can either be done by not deleting the sample, | |
8322 * or it can be done by dynamically recreating it | |
8323 * when we need it. | |
8324 * Update: I think now it's up to the user by passing the | |
8325 * access_data flag. If they set the flag, then they get | |
8326 * data callbacks and seek support. If not, then they can | |
8327 * get all that stuff at the expense of keeping extra memory | |
8328 * around. | |
8329 */ | |
8330 if(0 == access_data) | |
8331 { | |
8332 Sound_FreeSample(sample); | |
8333 ret_data->sample = NULL; | |
8334 } | |
8335 | |
8336 /* Else, We keep a copy of the sample around. | |
8337 * so don't do anything. | |
8338 */ | |
8339 #if 0 | |
8340 #if defined(DISABLE_PREDECODED_SEEK) | |
8341 Sound_FreeSample(sample); | |
8342 ret_data->sample = NULL; | |
8343 #elif !defined(DISABLE_SEEK_MEMORY_OPTIMIZATION) | |
8344 Sound_FreeSample(sample); | |
8345 ret_data->sample = NULL; | |
8346 #else | |
8347 /* We keep a copy of the sample around. | |
8348 * so don't do anything. | |
8349 */ | |
8350 #endif | |
8351 #endif | |
8352 | |
8353 /* okay we're done here */ | |
8354 } | |
8355 else | |
8356 { | |
8357 /* Shouldn't get here */ | |
8358 ALmixer_SetError("Unknown decode mode"); | |
8359 Sound_FreeSample(sample); | |
8360 free(ret_data); | |
8361 return NULL; | |
8362 } | |
8363 | |
13
54aa96ae8912
Added LinkedList class to project.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
12
diff
changeset
|
8364 /* Add the ALmixerData to an internal linked list so we can delete it on |
54aa96ae8912
Added LinkedList class to project.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
12
diff
changeset
|
8365 * quit and avoid messy dangling issues with Sound_Quit |
54aa96ae8912
Added LinkedList class to project.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
12
diff
changeset
|
8366 */ |
54aa96ae8912
Added LinkedList class to project.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
12
diff
changeset
|
8367 LinkedList_PushBack(s_listOfALmixerData, ret_data); |
0 | 8368 return ret_data; |
8369 } | |
8370 | |
8371 | |
8372 /* This will load a sample for us. Most of the uglyness is | |
8373 * error checking and the fact that streamed/predecoded files | |
8374 * must be treated differently. | |
8375 * I don't like the AudioInfo parameter. I removed it once, | |
8376 * but the system will fail on RAW samples because the user | |
8377 * must specify it, so I had to bring it back. | |
8378 * Remember I must close the rwops if there is an error before NewSample() | |
8379 */ | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8380 ALmixer_Data* ALmixer_LoadSample_RW(ALmixer_RWops* rwops, const char* fileext, ALuint buffersize, ALboolean decode_mode_is_predecoded, ALuint max_queue_buffers, ALuint num_startup_buffers, ALboolean access_data) |
0 | 8381 { |
8382 Sound_Sample* sample = NULL; | |
8383 Sound_AudioInfo target; | |
8384 | |
40
2b0b55b7f8cf
Resync to get interruption changes.
Eric Wing <ewing@anscamobile.com>
parents:
37
diff
changeset
|
8385 if( (AL_FALSE == ALmixer_Initialized) || (AL_TRUE == g_inInterruption) ) |
27
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
8386 { |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
8387 return NULL; |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
8388 } |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
8389 |
0 | 8390 /* Initialize target values to defaults |
8391 * 0 tells SDL_sound to use the "actual" values | |
8392 */ | |
8393 target.channels = 0; | |
8394 target.rate = 0; | |
8395 #if 0 | |
8396 /* This requires my new additions to SDL_sound. It will | |
8397 * convert the sample to the proper endian order. | |
8398 * If the actual is 8-bit, it will do unsigned, if | |
8399 * the actual is 16-bit, it will do signed. | |
8400 * I'm told by Ryan Gordon that OpenAL prefers the signedness | |
8401 * in this way. | |
8402 */ | |
8403 target.format = AUDIO_U8S16SYS; | |
8404 #else | |
8405 target.format = AUDIO_S16SYS; | |
8406 #endif | |
8407 | |
8408 /* Set a default buffersize if needed */ | |
8409 if(0 == buffersize) | |
8410 { | |
8411 buffersize = ALMIXER_DEFAULT_BUFFERSIZE; | |
8412 } | |
8413 | |
8414 sample = Sound_NewSample(rwops, fileext, &target, buffersize); | |
8415 if(NULL == sample) | |
8416 { | |
8417 ALmixer_SetError(Sound_GetError()); | |
8418 return NULL; | |
8419 } | |
8420 | |
1 | 8421 return( DoLoad(sample, buffersize, decode_mode_is_predecoded, max_queue_buffers, num_startup_buffers, access_data)); |
0 | 8422 } |
8423 | |
8424 | |
8425 | |
8426 /* This will load a sample for us from | |
8427 * a file (instead of RWops). Most of the uglyness is | |
8428 * error checking and the fact that streamed/predecoded files | |
8429 * must be treated differently. | |
8430 */ | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8431 ALmixer_Data* ALmixer_LoadSample(const char* filename, ALuint buffersize, ALboolean decode_mode_is_predecoded, ALuint max_queue_buffers, ALuint num_startup_buffers, ALboolean access_data) |
0 | 8432 { |
8433 Sound_Sample* sample = NULL; | |
8434 Sound_AudioInfo target; | |
8435 | |
40
2b0b55b7f8cf
Resync to get interruption changes.
Eric Wing <ewing@anscamobile.com>
parents:
37
diff
changeset
|
8436 if( (AL_FALSE == ALmixer_Initialized) || (AL_TRUE == g_inInterruption) ) |
27
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
8437 { |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
8438 return NULL; |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
8439 } |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
8440 |
0 | 8441 /* Initialize target values to defaults |
8442 * 0 tells SDL_sound to use the "actual" values | |
8443 */ | |
8444 target.channels = 0; | |
8445 target.rate = 0; | |
8446 | |
8447 #if 0 | |
8448 /* This requires my new additions to SDL_sound. It will | |
8449 * convert the sample to the proper endian order. | |
8450 * If the actual is 8-bit, it will do unsigned, if | |
8451 * the actual is 16-bit, it will do signed. | |
8452 * I'm told by Ryan Gordon that OpenAL prefers the signedness | |
8453 * in this way. | |
8454 */ | |
8455 target.format = AUDIO_U8S16SYS; | |
8456 #else | |
8457 target.format = AUDIO_S16SYS; | |
8458 #endif | |
8459 | |
8460 #if 0 | |
8461 /* Okay, here's a messy hack. The problem is that we need | |
8462 * to convert the sample to have the correct bitdepth, | |
8463 * endian order, and signedness values. | |
8464 * The bit depth is 8 or 16. | |
8465 * The endian order is the native order of the system. | |
8466 * The signedness depends on what the original value | |
8467 * of the sample. Unfortunately, we can't specify these | |
8468 * values until we after we already know what the original | |
8469 * values were for bitdepth and signedness. | |
8470 * So we must open the file once to get the values, | |
8471 * then close it, and then reopen it with the | |
8472 * correct desired target values. | |
8473 * I tried changing the sample->desired field after | |
8474 * the NewSample call, but it had no effect, so | |
8475 * it looks like it must be set on open. | |
8476 */ | |
8477 /* Pick a small buffersize for the first open to not | |
8478 * waste much time allocating memory */ | |
8479 sample = Sound_NewSampleFromFile(filename, NULL, 512); | |
8480 if(NULL == sample) | |
8481 { | |
8482 ALmixer_SetError(Sound_GetError()); | |
8483 return NULL; | |
8484 } | |
8485 | |
8486 bit_depth = GetBitDepth(sample->actual.format); | |
8487 signedness_value = GetSignednessValue(sample->actual.format); | |
8488 if(8 == bit_depth) | |
8489 { | |
8490 /* If 8 bit, then we don't have to worry about | |
8491 * endian issues. We can just use the actual format | |
8492 * value and it should do the right thing | |
8493 */ | |
8494 target.format = sample->actual.format; | |
8495 } | |
8496 else | |
8497 { | |
8498 /* We'll assume it's 16-bit, and if it's not | |
8499 * hopefully SDL_sound will return an error, | |
8500 * or let us convert to 16-bit | |
8501 */ | |
8502 /* Now we need to get the correct signedness */ | |
8503 if(ALMIXER_UNSIGNED_VALUE == signedness_value) | |
8504 { | |
8505 /* Set to Unsigned 16-bit, system endian order */ | |
8506 target.format = AUDIO_U16SYS; | |
8507 } | |
8508 else | |
8509 { | |
8510 /* Again, we'll assume it's Signed 16-bit system order | |
8511 * or force the conversion and hope it works out | |
8512 */ | |
8513 target.format = AUDIO_S16SYS; | |
8514 } | |
8515 } | |
8516 | |
8517 /* Now we have the correct info. We need to close and reopen */ | |
8518 Sound_FreeSample(sample); | |
8519 #endif | |
8520 | |
8521 sample = Sound_NewSampleFromFile(filename, &target, buffersize); | |
8522 if(NULL == sample) | |
8523 { | |
8524 ALmixer_SetError(Sound_GetError()); | |
8525 return NULL; | |
8526 } | |
8527 | |
6
4b1048af7e55
Disabled some of the debugging printfs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
3
diff
changeset
|
8528 /* |
0 | 8529 fprintf(stderr, "Correction test: Actual rate=%d, desired=%d, actual format=%d, desired format=%d\n", sample->actual.rate, sample->desired.rate, sample->actual.format, sample->desired.format); |
6
4b1048af7e55
Disabled some of the debugging printfs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
3
diff
changeset
|
8530 */ |
1 | 8531 return( DoLoad(sample, buffersize, decode_mode_is_predecoded, max_queue_buffers, num_startup_buffers, access_data)); |
0 | 8532 } |
8533 | |
8534 | |
8535 /* This is a back door for RAW samples or if you need the | |
8536 * AudioInfo field. Use at your own risk. | |
8537 */ | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8538 ALmixer_Data* ALmixer_LoadSample_RAW_RW(ALmixer_RWops* rwops, const char* fileext, ALmixer_AudioInfo* desired, ALuint buffersize, ALboolean decode_mode_is_predecoded, ALuint max_queue_buffers, ALuint num_startup_buffers, ALboolean access_data) |
0 | 8539 { |
8540 Sound_Sample* sample = NULL; | |
1 | 8541 Sound_AudioInfo sound_desired; |
27
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
8542 |
40
2b0b55b7f8cf
Resync to get interruption changes.
Eric Wing <ewing@anscamobile.com>
parents:
37
diff
changeset
|
8543 if( (AL_FALSE == ALmixer_Initialized) || (AL_TRUE == g_inInterruption) ) |
27
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
8544 { |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
8545 return NULL; |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
8546 } |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
8547 |
1 | 8548 /* Rather than copying the data from struct to struct, I could just |
8549 * cast the thing since the structs are meant to be identical. | |
8550 * But if SDL_sound changes it's implementation, bad things | |
8551 * will probably happen. (Or if I change my implementation and | |
8552 * forget about the cast, same bad scenario.) Since this is a load | |
8553 * function, performance of this is negligible. | |
8554 */ | |
8555 if(NULL == desired) | |
8556 { | |
8557 sample = Sound_NewSample(rwops, fileext, NULL, buffersize); | |
8558 } | |
8559 else | |
8560 { | |
8561 sound_desired.format = desired->format; | |
8562 sound_desired.channels = desired->channels; | |
8563 sound_desired.rate = desired->rate; | |
8564 sample = Sound_NewSample(rwops, fileext, &sound_desired, buffersize); | |
8565 } | |
0 | 8566 if(NULL == sample) |
8567 { | |
8568 ALmixer_SetError(Sound_GetError()); | |
8569 return NULL; | |
8570 } | |
1 | 8571 return( DoLoad(sample, buffersize, decode_mode_is_predecoded, max_queue_buffers, num_startup_buffers, access_data)); |
0 | 8572 } |
8573 | |
8574 | |
8575 | |
8576 | |
8577 /* This is a back door for RAW samples or if you need the | |
8578 * AudioInfo field. Use at your own risk. | |
8579 */ | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8580 ALmixer_Data* ALmixer_LoadSample_RAW(const char* filename, ALmixer_AudioInfo* desired, ALuint buffersize, ALboolean decode_mode_is_predecoded, ALuint max_queue_buffers, ALuint num_startup_buffers, ALboolean access_data) |
0 | 8581 { |
8582 Sound_Sample* sample = NULL; | |
1 | 8583 Sound_AudioInfo sound_desired; |
27
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
8584 |
40
2b0b55b7f8cf
Resync to get interruption changes.
Eric Wing <ewing@anscamobile.com>
parents:
37
diff
changeset
|
8585 if( (AL_FALSE == ALmixer_Initialized) || (AL_TRUE == g_inInterruption) ) |
27
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
8586 { |
34
7709c2145435
Fixed for omitted return value.
Eric Wing <ewing@anscamobile.com>
parents:
33
diff
changeset
|
8587 return NULL; |
27
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
8588 } |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
8589 |
1 | 8590 /* Rather than copying the data from struct to struct, I could just |
8591 * cast the thing since the structs are meant to be identical. | |
8592 * But if SDL_sound changes it's implementation, bad things | |
8593 * will probably happen. (Or if I change my implementation and | |
8594 * forget about the cast, same bad scenario.) Since this is a load | |
8595 * function, performance of this is negligible. | |
8596 */ | |
8597 if(NULL == desired) | |
8598 { | |
8599 sample = Sound_NewSampleFromFile(filename, NULL, buffersize); | |
8600 } | |
8601 else | |
8602 { | |
8603 sound_desired.format = desired->format; | |
8604 sound_desired.channels = desired->channels; | |
8605 sound_desired.rate = desired->rate; | |
8606 sample = Sound_NewSampleFromFile(filename, &sound_desired, buffersize); | |
8607 } | |
8608 | |
0 | 8609 if(NULL == sample) |
8610 { | |
8611 ALmixer_SetError(Sound_GetError()); | |
8612 return NULL; | |
8613 } | |
1 | 8614 return( DoLoad(sample, buffersize, decode_mode_is_predecoded, max_queue_buffers, num_startup_buffers, access_data)); |
0 | 8615 } |
8616 | |
8617 | |
8618 void ALmixer_FreeData(ALmixer_Data* data) | |
8619 { | |
40
2b0b55b7f8cf
Resync to get interruption changes.
Eric Wing <ewing@anscamobile.com>
parents:
37
diff
changeset
|
8620 if( (AL_FALSE == ALmixer_Initialized) || (AL_TRUE == g_inInterruption) ) |
27
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
8621 { |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
8622 return; |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
8623 } |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
8624 |
22
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
8625 /* Bypass if in interruption event */ |
37
b346b6608eab
Fixed memory leak in Quit due to changes related to background thread removal. FreeData was quick escaping because it checked for ALmixer_Initialized which is now false by the time the code is reached.
Eric Wing <ewing@anscamobile.com>
parents:
36
diff
changeset
|
8626 /* FIXME: Buffers are connected to devices, sources are connected to contexts. I should still be able to delete the buffers even if there is no context. */ |
22
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
8627 if(NULL == alcGetCurrentContext()) |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
8628 { |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
8629 fprintf(stderr, "ALmixer_FreeData: Programmer Error. You cannot delete data when the OpenAL content is currently NULL. You may have already called ALmixer_Quit() or are in an interruption event\n"); |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
8630 return; |
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
8631 } |
0 | 8632 |
37
b346b6608eab
Fixed memory leak in Quit due to changes related to background thread removal. FreeData was quick escaping because it checked for ALmixer_Initialized which is now false by the time the code is reached.
Eric Wing <ewing@anscamobile.com>
parents:
36
diff
changeset
|
8633 Internal_FreeData(data); |
0 | 8634 } |
8635 | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8636 ALint ALmixer_GetTotalTime(ALmixer_Data* data) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8637 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8638 if(NULL == data) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8639 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8640 return -1; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8641 } |
22
58f03008ea05
- Added Seek APIs
Eric Wing <ewing . public |-at-| gmail . com>
parents:
16
diff
changeset
|
8642 |
0 | 8643 return data->total_time; |
8644 } | |
8645 | |
8646 /* This function will look up the source for the corresponding channel */ | |
8647 /* Must return 0 on error instead of -1 because of unsigned int */ | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8648 ALuint ALmixer_GetSource(ALint channel) |
0 | 8649 { |
8650 ALuint retval; | |
40
2b0b55b7f8cf
Resync to get interruption changes.
Eric Wing <ewing@anscamobile.com>
parents:
37
diff
changeset
|
8651 if( (AL_FALSE == ALmixer_Initialized) || (AL_TRUE == g_inInterruption) ) |
27
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
8652 { |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
8653 return 0; |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
8654 } |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8655 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8656 SDL_LockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8657 #endif |
0 | 8658 retval = Internal_GetSource(channel); |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8659 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8660 SDL_UnlockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8661 #endif |
0 | 8662 return retval; |
8663 } | |
8664 | |
8665 /* This function will look up the channel for the corresponding source */ | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8666 ALint ALmixer_GetChannel(ALuint source) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8667 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8668 ALint retval; |
40
2b0b55b7f8cf
Resync to get interruption changes.
Eric Wing <ewing@anscamobile.com>
parents:
37
diff
changeset
|
8669 if( (AL_FALSE == ALmixer_Initialized) || (AL_TRUE == g_inInterruption) ) |
27
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
8670 { |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
8671 return -1; |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
8672 } |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8673 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8674 SDL_LockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8675 #endif |
0 | 8676 retval = Internal_GetChannel(source); |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8677 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8678 SDL_UnlockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8679 #endif |
0 | 8680 return retval; |
8681 } | |
8682 | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8683 ALint ALmixer_FindFreeChannel(ALint start_channel) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8684 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8685 ALint retval; |
40
2b0b55b7f8cf
Resync to get interruption changes.
Eric Wing <ewing@anscamobile.com>
parents:
37
diff
changeset
|
8686 if( (AL_FALSE == ALmixer_Initialized) || (AL_TRUE == g_inInterruption) ) |
27
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
8687 { |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
8688 return -1; |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
8689 } |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8690 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8691 SDL_LockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8692 #endif |
0 | 8693 retval = Internal_FindFreeChannel(start_channel); |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8694 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8695 SDL_UnlockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8696 #endif |
0 | 8697 return retval; |
8698 } | |
8699 | |
8700 | |
8701 | |
8702 /* API update function. | |
8703 * It should return the number of buffers that were | |
8704 * queued during the call. The value might be | |
8705 * used to guage how long you might wait to | |
8706 * call the next update loop in case you are worried | |
8707 * about preserving CPU cycles. The idea is that | |
8708 * when a buffer is queued, there was probably some | |
8709 * CPU intensive looping which took awhile. | |
8710 * It's mainly provided as a convenience. | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8711 * Timing the call with ALmixer_GetTicks() would produce |
0 | 8712 * more accurate information. |
8713 * Returns a negative value if there was an error, | |
8714 * the value being the number of errors. | |
8715 */ | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8716 ALint ALmixer_Update() |
0 | 8717 { |
8718 #ifdef ENABLE_ALMIXER_THREADS | |
8719 /* The thread will handle all updates by itself. | |
8720 * Don't allow the user to explicitly call update. | |
8721 */ | |
8722 return 0; | |
8723 #else | |
8724 return( Update_ALmixer(NULL) ); | |
8725 #endif | |
8726 } | |
8727 | |
8728 | |
8729 | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8730 void ALmixer_SetPlaybackFinishedCallback(void (*playback_finished_callback)(ALint which_channel, ALuint al_source, ALmixer_Data* almixer_data, ALboolean finished_naturally, void* user_data), void* user_data) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8731 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8732 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8733 SDL_LockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8734 #endif |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8735 Channel_Done_Callback = playback_finished_callback; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8736 Channel_Done_Callback_Userdata = user_data; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8737 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8738 SDL_UnlockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8739 #endif |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8740 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8741 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8742 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8743 void ALmixer_SetPlaybackDataCallback(void (*playback_data_callback)(ALint which_chan, ALuint al_source, ALbyte* data, ALuint num_bytes, ALuint frequency, ALubyte channels, ALubyte bit_depth, ALboolean is_unsigned, ALboolean decode_mode_is_predecoded, ALuint length_in_msec, void* user_data), void* user_data) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8744 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8745 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8746 SDL_LockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8747 #endif |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8748 Channel_Data_Callback = playback_data_callback; |
1 | 8749 Channel_Data_Callback_Userdata = user_data; |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8750 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8751 SDL_UnlockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8752 #endif |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8753 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8754 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8755 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8756 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8757 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8758 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8759 ALint ALmixer_PlayChannelTimed(ALint channel, ALmixer_Data* data, ALint loops, ALint ticks) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8760 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8761 ALint retval; |
40
2b0b55b7f8cf
Resync to get interruption changes.
Eric Wing <ewing@anscamobile.com>
parents:
37
diff
changeset
|
8762 if( (AL_FALSE == ALmixer_Initialized) || (AL_TRUE == g_inInterruption) ) |
27
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
8763 { |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
8764 return -1; |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
8765 } |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8766 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8767 SDL_LockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8768 #endif |
0 | 8769 retval = Internal_PlayChannelTimed(channel, data, loops, ticks); |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8770 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8771 SDL_UnlockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8772 #endif |
0 | 8773 return retval; |
8774 } | |
8775 | |
8776 | |
8777 /* In case the user wants to specify a source instead of a channel, | |
8778 * they may use this function. This function will look up the | |
8779 * source-to-channel map, and convert the call into a | |
8780 * PlayChannelTimed() function call. | |
8781 * Returns the channel it's being played on. | |
8782 * Note: If you are prefer this method, then you need to be careful | |
8783 * about using PlayChannel, particularly if you request the | |
8784 * first available channels because source and channels have | |
8785 * a one-to-one mapping in this API. It is quite easy for | |
8786 * a channel/source to already be in use because of this. | |
8787 * In this event, an error message will be returned to you. | |
8788 */ | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8789 ALuint ALmixer_PlaySourceTimed(ALuint source, ALmixer_Data* data, ALint loops, ALint ticks) |
0 | 8790 { |
8791 ALuint retval; | |
40
2b0b55b7f8cf
Resync to get interruption changes.
Eric Wing <ewing@anscamobile.com>
parents:
37
diff
changeset
|
8792 if( (AL_FALSE == ALmixer_Initialized) || (AL_TRUE == g_inInterruption) ) |
27
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
8793 { |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
8794 return 0; |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
8795 } |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8796 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8797 SDL_LockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8798 #endif |
0 | 8799 retval = Internal_PlaySourceTimed(source, data, loops, ticks); |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8800 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8801 SDL_UnlockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8802 #endif |
0 | 8803 return retval; |
8804 } | |
8805 | |
8806 | |
8807 /* Will return the number of channels halted | |
27
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
8808 * or -1 for error |
0 | 8809 */ |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8810 ALint ALmixer_HaltChannel(ALint channel) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8811 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8812 ALint retval; |
40
2b0b55b7f8cf
Resync to get interruption changes.
Eric Wing <ewing@anscamobile.com>
parents:
37
diff
changeset
|
8813 if( (AL_FALSE == ALmixer_Initialized) || (AL_TRUE == g_inInterruption) ) |
27
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
8814 { |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
8815 return -1; |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
8816 } |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8817 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8818 SDL_LockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8819 #endif |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8820 retval = Internal_HaltChannel(channel, AL_FALSE); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8821 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8822 SDL_UnlockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8823 #endif |
0 | 8824 return retval; |
8825 } | |
8826 | |
8827 /* Will return the number of channels halted | |
8828 * or 0 for error | |
8829 */ | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8830 ALint ALmixer_HaltSource(ALuint source) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8831 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8832 ALint retval; |
40
2b0b55b7f8cf
Resync to get interruption changes.
Eric Wing <ewing@anscamobile.com>
parents:
37
diff
changeset
|
8833 if( (AL_FALSE == ALmixer_Initialized) || (AL_TRUE == g_inInterruption) ) |
27
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
8834 { |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
8835 return -1; |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
8836 } |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8837 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8838 SDL_LockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8839 #endif |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8840 retval = Internal_HaltSource(source, AL_FALSE); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8841 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8842 SDL_UnlockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8843 #endif |
0 | 8844 return retval; |
8845 } | |
8846 | |
8847 | |
8848 /* This will rewind the SDL_Sound sample for streamed | |
8849 * samples and start buffering up the data for the next | |
8850 * playback. This may require samples to be halted | |
8851 */ | |
12
bfe90b4f3d87
Bug fixes to FadeIn.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
10
diff
changeset
|
8852 ALboolean ALmixer_RewindData(ALmixer_Data* data) |
bfe90b4f3d87
Bug fixes to FadeIn.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
10
diff
changeset
|
8853 { |
bfe90b4f3d87
Bug fixes to FadeIn.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
10
diff
changeset
|
8854 ALboolean retval; |
40
2b0b55b7f8cf
Resync to get interruption changes.
Eric Wing <ewing@anscamobile.com>
parents:
37
diff
changeset
|
8855 if( (AL_FALSE == ALmixer_Initialized) || (AL_TRUE == g_inInterruption) ) |
27
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
8856 { |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
8857 return AL_FALSE; |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
8858 } |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8859 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8860 SDL_LockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8861 #endif |
0 | 8862 retval = Internal_RewindData(data); |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8863 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8864 SDL_UnlockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8865 #endif |
0 | 8866 return retval; |
8867 } | |
8868 | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8869 ALint ALmixer_RewindChannel(ALint channel) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8870 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8871 ALint retval; |
40
2b0b55b7f8cf
Resync to get interruption changes.
Eric Wing <ewing@anscamobile.com>
parents:
37
diff
changeset
|
8872 if( (AL_FALSE == ALmixer_Initialized) || (AL_TRUE == g_inInterruption) ) |
27
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
8873 { |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
8874 return -1; |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
8875 } |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8876 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8877 SDL_LockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8878 #endif |
0 | 8879 retval = Internal_RewindChannel(channel); |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8880 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8881 SDL_UnlockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8882 #endif |
0 | 8883 return retval; |
8884 } | |
8885 | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8886 ALint ALmixer_RewindSource(ALuint source) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8887 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8888 ALint retval; |
40
2b0b55b7f8cf
Resync to get interruption changes.
Eric Wing <ewing@anscamobile.com>
parents:
37
diff
changeset
|
8889 if( (AL_FALSE == ALmixer_Initialized) || (AL_TRUE == g_inInterruption) ) |
27
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
8890 { |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
8891 return -1; |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
8892 } |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8893 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8894 SDL_LockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8895 #endif |
0 | 8896 retval = Internal_RewindSource(source); |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8897 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8898 SDL_UnlockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8899 #endif |
0 | 8900 return retval; |
8901 } | |
8902 | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8903 ALint ALmixer_PauseChannel(ALint channel) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8904 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8905 ALint retval; |
40
2b0b55b7f8cf
Resync to get interruption changes.
Eric Wing <ewing@anscamobile.com>
parents:
37
diff
changeset
|
8906 if( (AL_FALSE == ALmixer_Initialized) || (AL_TRUE == g_inInterruption) ) |
27
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
8907 { |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
8908 return -1; |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
8909 } |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8910 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8911 SDL_LockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8912 #endif |
0 | 8913 retval = Internal_PauseChannel(channel); |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8914 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8915 SDL_UnlockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8916 #endif |
0 | 8917 return retval; |
8918 } | |
8919 | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8920 ALint ALmixer_PauseSource(ALuint source) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8921 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8922 ALint retval; |
40
2b0b55b7f8cf
Resync to get interruption changes.
Eric Wing <ewing@anscamobile.com>
parents:
37
diff
changeset
|
8923 if( (AL_FALSE == ALmixer_Initialized) || (AL_TRUE == g_inInterruption) ) |
27
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
8924 { |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
8925 return -1; |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
8926 } |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8927 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8928 SDL_LockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8929 #endif |
0 | 8930 retval = Internal_PauseSource(source); |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8931 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8932 SDL_UnlockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8933 #endif |
0 | 8934 return retval; |
8935 } | |
8936 | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8937 ALint ALmixer_ResumeChannel(ALint channel) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8938 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8939 ALint retval; |
40
2b0b55b7f8cf
Resync to get interruption changes.
Eric Wing <ewing@anscamobile.com>
parents:
37
diff
changeset
|
8940 if( (AL_FALSE == ALmixer_Initialized) || (AL_TRUE == g_inInterruption) ) |
27
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
8941 { |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
8942 return -1; |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
8943 } |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8944 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8945 SDL_LockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8946 #endif |
0 | 8947 retval = Internal_ResumeChannel(channel); |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8948 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8949 SDL_UnlockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8950 #endif |
0 | 8951 return retval; |
8952 } | |
8953 | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8954 ALint ALmixer_ResumeSource(ALuint source) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8955 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8956 ALint retval; |
40
2b0b55b7f8cf
Resync to get interruption changes.
Eric Wing <ewing@anscamobile.com>
parents:
37
diff
changeset
|
8957 if( (AL_FALSE == ALmixer_Initialized) || (AL_TRUE == g_inInterruption) ) |
27
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
8958 { |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
8959 return -1; |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
8960 } |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8961 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8962 SDL_LockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8963 #endif |
0 | 8964 retval = Internal_ResumeSource(source); |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8965 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8966 SDL_UnlockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8967 #endif |
0 | 8968 return retval; |
8969 } | |
8970 | |
8971 /* Might consider setting eof to 0 as a "feature" | |
8972 * This will allow seek to end to stay there because | |
8973 * Play automatically rewinds if at the end */ | |
12
bfe90b4f3d87
Bug fixes to FadeIn.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
10
diff
changeset
|
8974 ALboolean ALmixer_SeekData(ALmixer_Data* data, ALuint msec) |
bfe90b4f3d87
Bug fixes to FadeIn.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
10
diff
changeset
|
8975 { |
bfe90b4f3d87
Bug fixes to FadeIn.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
10
diff
changeset
|
8976 ALboolean retval; |
40
2b0b55b7f8cf
Resync to get interruption changes.
Eric Wing <ewing@anscamobile.com>
parents:
37
diff
changeset
|
8977 if( (AL_FALSE == ALmixer_Initialized) || (AL_TRUE == g_inInterruption) ) |
27
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
8978 { |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
8979 return -1; |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
8980 } |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8981 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8982 SDL_LockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8983 #endif |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8984 retval = Internal_SeekData(data, msec); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8985 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8986 SDL_UnlockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
8987 #endif |
0 | 8988 return retval; |
8989 } | |
8990 | |
20
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
8991 ALint ALmixer_SeekChannel(ALint channel, ALuint msec) |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
8992 { |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
8993 ALint retval; |
40
2b0b55b7f8cf
Resync to get interruption changes.
Eric Wing <ewing@anscamobile.com>
parents:
37
diff
changeset
|
8994 if( (AL_FALSE == ALmixer_Initialized) || (AL_TRUE == g_inInterruption) ) |
27
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
8995 { |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
8996 return -1; |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
8997 } |
20
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
8998 #ifdef ENABLE_ALMIXER_THREADS |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
8999 SDL_LockMutex(s_simpleLock); |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
9000 #endif |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
9001 retval = Internal_SeekChannel(channel, msec); |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
9002 #ifdef ENABLE_ALMIXER_THREADS |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
9003 SDL_UnlockMutex(s_simpleLock); |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
9004 #endif |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
9005 return retval; |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
9006 } |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
9007 |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
9008 ALint ALmixer_SeekSource(ALuint source, ALuint msec) |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
9009 { |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
9010 ALint retval; |
40
2b0b55b7f8cf
Resync to get interruption changes.
Eric Wing <ewing@anscamobile.com>
parents:
37
diff
changeset
|
9011 if( (AL_FALSE == ALmixer_Initialized) || (AL_TRUE == g_inInterruption) ) |
27
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9012 { |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9013 return -1; |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9014 } |
20
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
9015 #ifdef ENABLE_ALMIXER_THREADS |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
9016 SDL_LockMutex(s_simpleLock); |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
9017 #endif |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
9018 retval = Internal_SeekSource(source, msec); |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
9019 #ifdef ENABLE_ALMIXER_THREADS |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
9020 SDL_UnlockMutex(s_simpleLock); |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
9021 #endif |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
9022 return retval; |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
9023 } |
9365e714fc4b
Added SeekChannel, SeekSource.
Eric Wing <ewing@anscamobile.com>
parents:
16
diff
changeset
|
9024 |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9025 ALint ALmixer_FadeInChannelTimed(ALint channel, ALmixer_Data* data, ALint loops, ALuint fade_ticks, ALint expire_ticks) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9026 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9027 ALint retval; |
40
2b0b55b7f8cf
Resync to get interruption changes.
Eric Wing <ewing@anscamobile.com>
parents:
37
diff
changeset
|
9028 if( (AL_FALSE == ALmixer_Initialized) || (AL_TRUE == g_inInterruption) ) |
27
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9029 { |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9030 return -1; |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9031 } |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9032 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9033 SDL_LockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9034 #endif |
0 | 9035 retval = Internal_FadeInChannelTimed(channel, data, loops, fade_ticks, expire_ticks); |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9036 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9037 SDL_UnlockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9038 #endif |
0 | 9039 return retval; |
9040 } | |
9041 | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9042 ALuint ALmixer_FadeInSourceTimed(ALuint source, ALmixer_Data* data, ALint loops, ALuint fade_ticks, ALint expire_ticks) |
0 | 9043 { |
9044 ALuint retval; | |
40
2b0b55b7f8cf
Resync to get interruption changes.
Eric Wing <ewing@anscamobile.com>
parents:
37
diff
changeset
|
9045 if( (AL_FALSE == ALmixer_Initialized) || (AL_TRUE == g_inInterruption) ) |
27
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9046 { |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9047 return 0; |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9048 } |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9049 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9050 SDL_LockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9051 #endif |
0 | 9052 retval = Internal_FadeInSourceTimed(source, data, loops, fade_ticks, expire_ticks); |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9053 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9054 SDL_UnlockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9055 #endif |
0 | 9056 return retval; |
9057 } | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9058 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9059 ALint ALmixer_FadeOutChannel(ALint channel, ALuint ticks) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9060 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9061 ALint retval; |
40
2b0b55b7f8cf
Resync to get interruption changes.
Eric Wing <ewing@anscamobile.com>
parents:
37
diff
changeset
|
9062 if( (AL_FALSE == ALmixer_Initialized) || (AL_TRUE == g_inInterruption) ) |
27
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9063 { |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9064 return -1; |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9065 } |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9066 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9067 SDL_LockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9068 #endif |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9069 retval = Internal_FadeOutChannel(channel, ticks); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9070 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9071 SDL_UnlockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9072 #endif |
0 | 9073 return retval; |
9074 } | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9075 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9076 ALint ALmixer_FadeOutSource(ALuint source, ALuint ticks) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9077 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9078 ALint retval; |
40
2b0b55b7f8cf
Resync to get interruption changes.
Eric Wing <ewing@anscamobile.com>
parents:
37
diff
changeset
|
9079 if( (AL_FALSE == ALmixer_Initialized) || (AL_TRUE == g_inInterruption) ) |
27
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9080 { |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9081 return 0; |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9082 } |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9083 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9084 SDL_LockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9085 #endif |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9086 retval = Internal_FadeOutSource(source, ticks); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9087 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9088 SDL_UnlockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9089 #endif |
0 | 9090 return retval; |
9091 } | |
9092 | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9093 ALint ALmixer_FadeChannel(ALint channel, ALuint ticks, ALfloat volume) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9094 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9095 ALint retval; |
40
2b0b55b7f8cf
Resync to get interruption changes.
Eric Wing <ewing@anscamobile.com>
parents:
37
diff
changeset
|
9096 if( (AL_FALSE == ALmixer_Initialized) || (AL_TRUE == g_inInterruption) ) |
27
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9097 { |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9098 return 0; |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9099 } |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9100 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9101 SDL_LockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9102 #endif |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9103 retval = Internal_FadeChannel(channel, ticks, volume); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9104 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9105 SDL_UnlockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9106 #endif |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9107 return retval; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9108 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9109 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9110 ALint ALmixer_FadeSource(ALuint source, ALuint ticks, ALfloat volume) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9111 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9112 ALint retval; |
40
2b0b55b7f8cf
Resync to get interruption changes.
Eric Wing <ewing@anscamobile.com>
parents:
37
diff
changeset
|
9113 if( (AL_FALSE == ALmixer_Initialized) || (AL_TRUE == g_inInterruption) ) |
27
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9114 { |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9115 return -1; |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9116 } |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9117 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9118 SDL_LockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9119 #endif |
0 | 9120 retval = Internal_FadeSource(source, ticks, volume); |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9121 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9122 SDL_UnlockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9123 #endif |
0 | 9124 return retval; |
9125 } | |
9126 | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9127 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9128 ALboolean ALmixer_SetVolumeChannel(ALint channel, ALfloat volume) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9129 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9130 ALboolean retval; |
40
2b0b55b7f8cf
Resync to get interruption changes.
Eric Wing <ewing@anscamobile.com>
parents:
37
diff
changeset
|
9131 if( (AL_FALSE == ALmixer_Initialized) || (AL_TRUE == g_inInterruption) ) |
27
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9132 { |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9133 return AL_FALSE; |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9134 } |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9135 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9136 SDL_LockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9137 #endif |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9138 retval = Internal_SetVolumeChannel(channel, volume); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9139 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9140 SDL_UnlockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9141 #endif |
0 | 9142 return retval; |
9143 } | |
9144 | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9145 ALboolean ALmixer_SetVolumeSource(ALuint source, ALfloat volume) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9146 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9147 ALboolean retval; |
40
2b0b55b7f8cf
Resync to get interruption changes.
Eric Wing <ewing@anscamobile.com>
parents:
37
diff
changeset
|
9148 if( (AL_FALSE == ALmixer_Initialized) || (AL_TRUE == g_inInterruption) ) |
27
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9149 { |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9150 return AL_FALSE; |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9151 } |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9152 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9153 SDL_LockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9154 #endif |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9155 retval = Internal_SetVolumeSource(source, volume); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9156 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9157 SDL_UnlockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9158 #endif |
0 | 9159 return retval; |
9160 } | |
9161 | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9162 ALfloat ALmixer_GetVolumeChannel(ALint channel) |
0 | 9163 { |
9164 ALfloat retval; | |
40
2b0b55b7f8cf
Resync to get interruption changes.
Eric Wing <ewing@anscamobile.com>
parents:
37
diff
changeset
|
9165 if( (AL_FALSE == ALmixer_Initialized) || (AL_TRUE == g_inInterruption) ) |
27
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9166 { |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9167 return -1.0f; |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9168 } |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9169 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9170 SDL_LockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9171 #endif |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9172 retval = Internal_GetVolumeChannel(channel); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9173 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9174 SDL_UnlockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9175 #endif |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9176 return retval; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9177 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9178 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9179 ALfloat ALmixer_GetVolumeSource(ALuint source) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9180 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9181 ALfloat retval; |
40
2b0b55b7f8cf
Resync to get interruption changes.
Eric Wing <ewing@anscamobile.com>
parents:
37
diff
changeset
|
9182 if( (AL_FALSE == ALmixer_Initialized) || (AL_TRUE == g_inInterruption) ) |
27
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9183 { |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9184 return -1.0f; |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9185 } |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9186 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9187 SDL_LockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9188 #endif |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9189 retval = Internal_GetVolumeSource(source); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9190 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9191 SDL_UnlockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9192 #endif |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9193 return retval; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9194 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9195 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9196 ALboolean ALmixer_SetMaxVolumeChannel(ALint channel, ALfloat volume) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9197 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9198 ALboolean retval; |
40
2b0b55b7f8cf
Resync to get interruption changes.
Eric Wing <ewing@anscamobile.com>
parents:
37
diff
changeset
|
9199 if( (AL_FALSE == ALmixer_Initialized) || (AL_TRUE == g_inInterruption) ) |
27
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9200 { |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9201 return AL_FALSE; |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9202 } |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9203 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9204 SDL_LockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9205 #endif |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9206 retval = Internal_SetMaxVolumeChannel(channel, volume); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9207 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9208 SDL_UnlockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9209 #endif |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9210 return retval; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9211 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9212 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9213 ALboolean ALmixer_SetMaxVolumeSource(ALuint source, ALfloat volume) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9214 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9215 ALboolean retval; |
40
2b0b55b7f8cf
Resync to get interruption changes.
Eric Wing <ewing@anscamobile.com>
parents:
37
diff
changeset
|
9216 if( (AL_FALSE == ALmixer_Initialized) || (AL_TRUE == g_inInterruption) ) |
27
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9217 { |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9218 return AL_FALSE; |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9219 } |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9220 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9221 SDL_LockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9222 #endif |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9223 retval = Internal_SetMaxVolumeSource(source, volume); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9224 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9225 SDL_UnlockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9226 #endif |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9227 return retval; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9228 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9229 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9230 ALfloat ALmixer_GetMaxVolumeChannel(ALint channel) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9231 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9232 ALfloat retval; |
40
2b0b55b7f8cf
Resync to get interruption changes.
Eric Wing <ewing@anscamobile.com>
parents:
37
diff
changeset
|
9233 if( (AL_FALSE == ALmixer_Initialized) || (AL_TRUE == g_inInterruption) ) |
27
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9234 { |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9235 return -1.0f; |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9236 } |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9237 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9238 SDL_LockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9239 #endif |
0 | 9240 retval = Internal_GetMaxVolumeChannel(channel); |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9241 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9242 SDL_UnlockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9243 #endif |
0 | 9244 return retval; |
9245 } | |
9246 | |
9247 ALfloat ALmixer_GetMaxVolumeSource(ALuint source) | |
9248 { | |
9249 ALfloat retval; | |
40
2b0b55b7f8cf
Resync to get interruption changes.
Eric Wing <ewing@anscamobile.com>
parents:
37
diff
changeset
|
9250 if( (AL_FALSE == ALmixer_Initialized) || (AL_TRUE == g_inInterruption) ) |
27
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9251 { |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9252 return -1.0f; |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9253 } |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9254 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9255 SDL_LockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9256 #endif |
0 | 9257 retval = Internal_GetMaxVolumeSource(source); |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9258 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9259 SDL_UnlockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9260 #endif |
0 | 9261 return retval; |
9262 } | |
9263 | |
9264 | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9265 ALboolean ALmixer_SetMinVolumeChannel(ALint channel, ALfloat volume) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9266 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9267 ALboolean retval; |
40
2b0b55b7f8cf
Resync to get interruption changes.
Eric Wing <ewing@anscamobile.com>
parents:
37
diff
changeset
|
9268 if( (AL_FALSE == ALmixer_Initialized) || (AL_TRUE == g_inInterruption) ) |
27
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9269 { |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9270 return AL_FALSE; |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9271 } |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9272 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9273 SDL_LockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9274 #endif |
0 | 9275 retval = Internal_SetMinVolumeChannel(channel, volume); |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9276 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9277 SDL_UnlockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9278 #endif |
0 | 9279 return retval; |
9280 } | |
9281 | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9282 ALboolean ALmixer_SetMinVolumeSource(ALuint source, ALfloat volume) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9283 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9284 ALboolean retval; |
40
2b0b55b7f8cf
Resync to get interruption changes.
Eric Wing <ewing@anscamobile.com>
parents:
37
diff
changeset
|
9285 if( (AL_FALSE == ALmixer_Initialized) || (AL_TRUE == g_inInterruption) ) |
27
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9286 { |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9287 return AL_FALSE; |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9288 } |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9289 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9290 SDL_LockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9291 #endif |
0 | 9292 retval = Internal_SetMinVolumeSource(source, volume); |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9293 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9294 SDL_UnlockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9295 #endif |
0 | 9296 return retval; |
9297 } | |
9298 | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9299 ALfloat ALmixer_GetMinVolumeChannel(ALint channel) |
0 | 9300 { |
9301 ALfloat retval; | |
40
2b0b55b7f8cf
Resync to get interruption changes.
Eric Wing <ewing@anscamobile.com>
parents:
37
diff
changeset
|
9302 if( (AL_FALSE == ALmixer_Initialized) || (AL_TRUE == g_inInterruption) ) |
27
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9303 { |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9304 return -1.0f; |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9305 } |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9306 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9307 SDL_LockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9308 #endif |
0 | 9309 retval = Internal_GetMinVolumeChannel(channel); |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9310 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9311 SDL_UnlockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9312 #endif |
0 | 9313 return retval; |
9314 } | |
9315 | |
9316 ALfloat ALmixer_GetMinVolumeSource(ALuint source) | |
9317 { | |
9318 ALfloat retval; | |
40
2b0b55b7f8cf
Resync to get interruption changes.
Eric Wing <ewing@anscamobile.com>
parents:
37
diff
changeset
|
9319 if( (AL_FALSE == ALmixer_Initialized) || (AL_TRUE == g_inInterruption) ) |
27
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9320 { |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9321 return -1.0f; |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9322 } |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9323 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9324 SDL_LockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9325 #endif |
0 | 9326 retval = Internal_GetMinVolumeSource(source); |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9327 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9328 SDL_UnlockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9329 #endif |
0 | 9330 return retval; |
9331 } | |
9332 | |
9333 | |
9334 | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9335 ALboolean ALmixer_SetMasterVolume(ALfloat volume) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9336 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9337 ALboolean retval; |
40
2b0b55b7f8cf
Resync to get interruption changes.
Eric Wing <ewing@anscamobile.com>
parents:
37
diff
changeset
|
9338 if( (AL_FALSE == ALmixer_Initialized) || (AL_TRUE == g_inInterruption) ) |
27
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9339 { |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9340 return AL_FALSE; |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9341 } |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9342 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9343 SDL_LockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9344 #endif |
0 | 9345 retval = Internal_SetMasterVolume(volume); |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9346 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9347 SDL_UnlockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9348 #endif |
0 | 9349 return retval; |
9350 } | |
9351 | |
9352 ALfloat ALmixer_GetMasterVolume() | |
9353 { | |
9354 ALfloat retval; | |
40
2b0b55b7f8cf
Resync to get interruption changes.
Eric Wing <ewing@anscamobile.com>
parents:
37
diff
changeset
|
9355 if( (AL_FALSE == ALmixer_Initialized) || (AL_TRUE == g_inInterruption) ) |
27
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9356 { |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9357 return -1.0f; |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9358 } |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9359 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9360 SDL_LockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9361 #endif |
0 | 9362 retval = Internal_GetMasterVolume(); |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9363 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9364 SDL_UnlockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9365 #endif |
0 | 9366 return retval; |
9367 } | |
9368 | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9369 ALint ALmixer_ExpireChannel(ALint channel, ALint ticks) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9370 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9371 ALint retval; |
40
2b0b55b7f8cf
Resync to get interruption changes.
Eric Wing <ewing@anscamobile.com>
parents:
37
diff
changeset
|
9372 if( (AL_FALSE == ALmixer_Initialized) || (AL_TRUE == g_inInterruption) ) |
27
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9373 { |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9374 return -1; |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9375 } |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9376 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9377 SDL_LockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9378 #endif |
0 | 9379 retval = Internal_ExpireChannel(channel, ticks); |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9380 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9381 SDL_UnlockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9382 #endif |
0 | 9383 return retval; |
9384 } | |
9385 | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9386 ALint ALmixer_ExpireSource(ALuint source, ALint ticks) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9387 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9388 ALint retval; |
40
2b0b55b7f8cf
Resync to get interruption changes.
Eric Wing <ewing@anscamobile.com>
parents:
37
diff
changeset
|
9389 if( (AL_FALSE == ALmixer_Initialized) || (AL_TRUE == g_inInterruption) ) |
27
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9390 { |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9391 return -1; |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9392 } |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9393 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9394 SDL_LockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9395 #endif |
0 | 9396 retval = Internal_ExpireSource(source, ticks); |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9397 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9398 SDL_UnlockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9399 #endif |
0 | 9400 return retval; |
9401 } | |
9402 | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9403 ALint ALmixer_IsActiveChannel(ALint channel) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9404 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9405 ALint retval; |
40
2b0b55b7f8cf
Resync to get interruption changes.
Eric Wing <ewing@anscamobile.com>
parents:
37
diff
changeset
|
9406 if( (AL_FALSE == ALmixer_Initialized) || (AL_TRUE == g_inInterruption) ) |
27
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9407 { |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9408 return -1; |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9409 } |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9410 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9411 SDL_LockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9412 #endif |
0 | 9413 retval = Internal_QueryChannel(channel); |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9414 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9415 SDL_UnlockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9416 #endif |
0 | 9417 return retval; |
9418 } | |
9419 | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9420 ALint ALmixer_IsActiveSource(ALuint source) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9421 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9422 ALint retval; |
40
2b0b55b7f8cf
Resync to get interruption changes.
Eric Wing <ewing@anscamobile.com>
parents:
37
diff
changeset
|
9423 if( (AL_FALSE == ALmixer_Initialized) || (AL_TRUE == g_inInterruption) ) |
27
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9424 { |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9425 return -1; |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9426 } |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9427 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9428 SDL_LockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9429 #endif |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9430 retval = Internal_QuerySource(source); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9431 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9432 SDL_UnlockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9433 #endif |
0 | 9434 return retval; |
9435 } | |
9436 | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9437 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9438 ALint ALmixer_IsPlayingChannel(ALint channel) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9439 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9440 ALint retval; |
40
2b0b55b7f8cf
Resync to get interruption changes.
Eric Wing <ewing@anscamobile.com>
parents:
37
diff
changeset
|
9441 if( (AL_FALSE == ALmixer_Initialized) || (AL_TRUE == g_inInterruption) ) |
27
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9442 { |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9443 return -1; |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9444 } |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9445 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9446 SDL_LockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9447 #endif |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9448 retval = Internal_PlayingChannel(channel); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9449 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9450 SDL_UnlockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9451 #endif |
0 | 9452 return retval; |
9453 } | |
9454 | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9455 ALint ALmixer_IsPlayingSource(ALuint source) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9456 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9457 ALint retval; |
40
2b0b55b7f8cf
Resync to get interruption changes.
Eric Wing <ewing@anscamobile.com>
parents:
37
diff
changeset
|
9458 if( (AL_FALSE == ALmixer_Initialized) || (AL_TRUE == g_inInterruption) ) |
27
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9459 { |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9460 return -1; |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9461 } |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9462 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9463 SDL_LockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9464 #endif |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9465 retval = Internal_PlayingSource(source); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9466 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9467 SDL_UnlockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9468 #endif |
0 | 9469 return retval; |
9470 } | |
9471 | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9472 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9473 ALint ALmixer_IsPausedChannel(ALint channel) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9474 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9475 ALint retval; |
40
2b0b55b7f8cf
Resync to get interruption changes.
Eric Wing <ewing@anscamobile.com>
parents:
37
diff
changeset
|
9476 if( (AL_FALSE == ALmixer_Initialized) || (AL_TRUE == g_inInterruption) ) |
27
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9477 { |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9478 return -1; |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9479 } |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9480 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9481 SDL_LockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9482 #endif |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9483 retval = Internal_PausedChannel(channel); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9484 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9485 SDL_UnlockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9486 #endif |
0 | 9487 return retval; |
9488 } | |
9489 | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9490 ALint ALmixer_IsPausedSource(ALuint source) |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9491 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9492 ALint retval; |
40
2b0b55b7f8cf
Resync to get interruption changes.
Eric Wing <ewing@anscamobile.com>
parents:
37
diff
changeset
|
9493 if( (AL_FALSE == ALmixer_Initialized) || (AL_TRUE == g_inInterruption) ) |
27
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9494 { |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9495 return -1; |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9496 } |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9497 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9498 SDL_LockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9499 #endif |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9500 retval = Internal_PausedSource(source); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9501 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9502 SDL_UnlockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9503 #endif |
0 | 9504 return retval; |
9505 } | |
9506 | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9507 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9508 ALuint ALmixer_CountAllFreeChannels() |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9509 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9510 ALuint retval; |
40
2b0b55b7f8cf
Resync to get interruption changes.
Eric Wing <ewing@anscamobile.com>
parents:
37
diff
changeset
|
9511 if( (AL_FALSE == ALmixer_Initialized) || (AL_TRUE == g_inInterruption) ) |
27
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9512 { |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9513 return 0; |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9514 } |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9515 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9516 SDL_LockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9517 #endif |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9518 retval = Internal_CountAllFreeChannels(); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9519 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9520 SDL_UnlockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9521 #endif |
0 | 9522 return retval; |
9523 } | |
9524 | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9525 ALuint ALmixer_CountUnreservedFreeChannels() |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9526 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9527 ALuint retval; |
40
2b0b55b7f8cf
Resync to get interruption changes.
Eric Wing <ewing@anscamobile.com>
parents:
37
diff
changeset
|
9528 if( (AL_FALSE == ALmixer_Initialized) || (AL_TRUE == g_inInterruption) ) |
27
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9529 { |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9530 return 0; |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9531 } |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9532 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9533 SDL_LockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9534 #endif |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9535 retval = Internal_CountUnreservedFreeChannels(); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9536 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9537 SDL_UnlockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9538 #endif |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9539 return retval; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9540 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9541 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9542 ALuint ALmixer_CountAllUsedChannels() |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9543 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9544 ALuint retval; |
40
2b0b55b7f8cf
Resync to get interruption changes.
Eric Wing <ewing@anscamobile.com>
parents:
37
diff
changeset
|
9545 if( (AL_FALSE == ALmixer_Initialized) || (AL_TRUE == g_inInterruption) ) |
27
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9546 { |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9547 return 0; |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9548 } |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9549 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9550 SDL_LockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9551 #endif |
0 | 9552 retval = Internal_CountAllUsedChannels(); |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9553 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9554 SDL_UnlockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9555 #endif |
0 | 9556 return retval; |
9557 } | |
9558 | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9559 ALuint ALmixer_CountUnreservedUsedChannels() |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9560 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9561 ALuint retval; |
40
2b0b55b7f8cf
Resync to get interruption changes.
Eric Wing <ewing@anscamobile.com>
parents:
37
diff
changeset
|
9562 if( (AL_FALSE == ALmixer_Initialized) || (AL_TRUE == g_inInterruption) ) |
27
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9563 { |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9564 return 0; |
9cf93a099f75
Added initialization checks to all API functions.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
26
diff
changeset
|
9565 } |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9566 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9567 SDL_LockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9568 #endif |
0 | 9569 retval = Internal_CountUnreservedUsedChannels(); |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9570 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9571 SDL_UnlockMutex(s_simpleLock); |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9572 #endif |
0 | 9573 return retval; |
9574 } | |
9575 | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9576 ALboolean ALmixer_IsPredecoded(ALmixer_Data* data) |
1 | 9577 { |
9578 if(NULL == data) | |
9579 { | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9580 return AL_FALSE; |
1 | 9581 } |
9582 return data->decoded_all; | |
9583 } | |
9584 | |
2
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9585 ALboolean ALmixer_CompiledWithThreadBackend() |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9586 { |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9587 #ifdef ENABLE_ALMIXER_THREADS |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9588 return AL_TRUE; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9589 #else |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9590 return AL_FALSE; |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9591 #endif |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9592 } |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9593 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9594 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9595 |
279d0427ef26
Overhaul prep for first public release.
Eric Wing <ewing . public |-at-| gmail . com>
parents:
1
diff
changeset
|
9596 |