Mercurial > sdl-ios-xcode
annotate src/audio/SDL_audio.c @ 638:b0108e9dea53
Date: Sun, 11 May 2003 19:59:06 +0300
From: Pasi K?rkk?inen
Subject: [PATCH] fix SDL OpenGL segfault with DRI/Mesa drivers and Glew
Hello!
The attached patch fixes a bug in SDL which causes SDL to crash in
X11_GL_Shutdown() if you are using DRI/Mesa drivers AND glew
(http://glew.sf.net).
The bug is caused by a namespace collision affecting dlsym() to fetch wrong
pointer for glXReleaseBuffersMESA() (uninitialized pointer from glew because
the extension is NOT supported by the driver) and then SDL calling it in
X11_GL_Shutdown().
SDL should check if the glXReleaseBuffersMESA() is really supported by the
driver (from the extensions string) before calling it.
Attached patch adds extension string parsing to check if
glXReleaseBuffersMESA() is really supported (and this way
prevents the segfault).
Availability of the extensions should be _always_ checked from the
extensions string rather than using dlsym()!
Please add it to the next version of SDL.
Thanks to gltron and author of glew to help fixing this.
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Sat, 28 Jun 2003 17:27:33 +0000 |
parents | 550bccdf04bd |
children | 594422ab8f9f |
rev | line source |
---|---|
0 | 1 /* |
2 SDL - Simple DirectMedia Layer | |
297
f6ffac90895c
Updated copyright information for 2002
Sam Lantinga <slouken@libsdl.org>
parents:
262
diff
changeset
|
3 Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga |
0 | 4 |
5 This library is free software; you can redistribute it and/or | |
6 modify it under the terms of the GNU Library General Public | |
7 License as published by the Free Software Foundation; either | |
8 version 2 of the License, or (at your option) any later version. | |
9 | |
10 This library is distributed in the hope that it will be useful, | |
11 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
13 Library General Public License for more details. | |
14 | |
15 You should have received a copy of the GNU Library General Public | |
16 License along with this library; if not, write to the Free | |
17 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
18 | |
19 Sam Lantinga | |
252
e8157fcb3114
Updated the source with the correct e-mail address
Sam Lantinga <slouken@libsdl.org>
parents:
148
diff
changeset
|
20 slouken@libsdl.org |
0 | 21 */ |
22 | |
23 #ifdef SAVE_RCSID | |
24 static char rcsid = | |
25 "@(#) $Id$"; | |
26 #endif | |
27 | |
28 /* Allow access to a raw mixing buffer */ | |
29 #include <stdlib.h> | |
30 #include <stdio.h> | |
31 #include <string.h> | |
32 | |
33 #include "SDL.h" | |
34 #include "SDL_audio.h" | |
35 #include "SDL_timer.h" | |
36 #include "SDL_error.h" | |
37 #include "SDL_audio_c.h" | |
38 #include "SDL_audiomem.h" | |
39 #include "SDL_sysaudio.h" | |
40 | |
41 /* Available audio drivers */ | |
42 static AudioBootStrap *bootstrap[] = { | |
121
43febd46d49d
Name changed from OBSD to OPENBSD_AUDIO
Sam Lantinga <slouken@libsdl.org>
parents:
94
diff
changeset
|
43 #ifdef OPENBSD_AUDIO_SUPPORT |
43febd46d49d
Name changed from OBSD to OPENBSD_AUDIO
Sam Lantinga <slouken@libsdl.org>
parents:
94
diff
changeset
|
44 &OPENBSD_AUDIO_bootstrap, |
94
ae6e6b73333f
Cleaned up the OpenBSD port, thanks to Peter Valchev
Sam Lantinga <slouken@lokigames.com>
parents:
68
diff
changeset
|
45 #endif |
0 | 46 #ifdef OSS_SUPPORT |
47 &DSP_bootstrap, | |
48 &DMA_bootstrap, | |
49 #endif | |
50 #ifdef ALSA_SUPPORT | |
51 &ALSA_bootstrap, | |
52 #endif | |
148
8758b8d42cd9
Audio subsystem no longer assumes sun audio API on UNIX systems
Sam Lantinga <slouken@libsdl.org>
parents:
121
diff
changeset
|
53 #ifdef SUNAUDIO_SUPPORT |
8758b8d42cd9
Audio subsystem no longer assumes sun audio API on UNIX systems
Sam Lantinga <slouken@libsdl.org>
parents:
121
diff
changeset
|
54 &SUNAUDIO_bootstrap, |
8758b8d42cd9
Audio subsystem no longer assumes sun audio API on UNIX systems
Sam Lantinga <slouken@libsdl.org>
parents:
121
diff
changeset
|
55 #endif |
8758b8d42cd9
Audio subsystem no longer assumes sun audio API on UNIX systems
Sam Lantinga <slouken@libsdl.org>
parents:
121
diff
changeset
|
56 #ifdef DMEDIA_SUPPORT |
8758b8d42cd9
Audio subsystem no longer assumes sun audio API on UNIX systems
Sam Lantinga <slouken@libsdl.org>
parents:
121
diff
changeset
|
57 &DMEDIA_bootstrap, |
35
d3bc792e136d
Added detection of Open Sound System on Solaris x86
Sam Lantinga <slouken@lokigames.com>
parents:
21
diff
changeset
|
58 #endif |
0 | 59 #ifdef ARTSC_SUPPORT |
60 &ARTSC_bootstrap, | |
61 #endif | |
62 #ifdef ESD_SUPPORT | |
63 &ESD_bootstrap, | |
64 #endif | |
65 #ifdef NAS_SUPPORT | |
66 &NAS_bootstrap, | |
67 #endif | |
68 #ifdef ENABLE_DIRECTX | |
69 &DSOUND_bootstrap, | |
70 #endif | |
71 #ifdef ENABLE_WINDIB | |
72 &WAVEOUT_bootstrap, | |
73 #endif | |
74 #ifdef __BEOS__ | |
75 &BAUDIO_bootstrap, | |
76 #endif | |
77 #if defined(macintosh) || TARGET_API_MAC_CARBON | |
78 &SNDMGR_bootstrap, | |
79 #endif | |
80 #ifdef _AIX | |
81 &Paud_bootstrap, | |
82 #endif | |
21
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
83 #ifdef ENABLE_AHI |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
84 &AHI_bootstrap, |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
85 #endif |
398
d219b0e02f5f
Added Atari audio support (thanks Patrice!)
Sam Lantinga <slouken@libsdl.org>
parents:
322
diff
changeset
|
86 #ifdef MINTAUDIO_SUPPORT |
d219b0e02f5f
Added Atari audio support (thanks Patrice!)
Sam Lantinga <slouken@libsdl.org>
parents:
322
diff
changeset
|
87 &MINTAUDIO_bootstrap, |
d219b0e02f5f
Added Atari audio support (thanks Patrice!)
Sam Lantinga <slouken@libsdl.org>
parents:
322
diff
changeset
|
88 #endif |
68
ac6645260d31
Added an audio driver that writes to disk (thanks Ryan!)
Sam Lantinga <slouken@lokigames.com>
parents:
38
diff
changeset
|
89 #ifdef DISKAUD_SUPPORT |
ac6645260d31
Added an audio driver that writes to disk (thanks Ryan!)
Sam Lantinga <slouken@lokigames.com>
parents:
38
diff
changeset
|
90 &DISKAUD_bootstrap, |
ac6645260d31
Added an audio driver that writes to disk (thanks Ryan!)
Sam Lantinga <slouken@lokigames.com>
parents:
38
diff
changeset
|
91 #endif |
509
dad72daf44b3
Added initial support for Dreamcast (thanks HERO!)
Sam Lantinga <slouken@libsdl.org>
parents:
398
diff
changeset
|
92 #ifdef ENABLE_DC |
dad72daf44b3
Added initial support for Dreamcast (thanks HERO!)
Sam Lantinga <slouken@libsdl.org>
parents:
398
diff
changeset
|
93 &DCAUD_bootstrap, |
dad72daf44b3
Added initial support for Dreamcast (thanks HERO!)
Sam Lantinga <slouken@libsdl.org>
parents:
398
diff
changeset
|
94 #endif |
630
550bccdf04bd
Added initial support for RISC OS (thanks Peter Naulls!)
Sam Lantinga <slouken@libsdl.org>
parents:
509
diff
changeset
|
95 #ifdef DRENDERER_SUPPORT |
550bccdf04bd
Added initial support for RISC OS (thanks Peter Naulls!)
Sam Lantinga <slouken@libsdl.org>
parents:
509
diff
changeset
|
96 &DRENDERER_bootstrap, |
550bccdf04bd
Added initial support for RISC OS (thanks Peter Naulls!)
Sam Lantinga <slouken@libsdl.org>
parents:
509
diff
changeset
|
97 #endif |
0 | 98 NULL |
99 }; | |
100 SDL_AudioDevice *current_audio = NULL; | |
101 | |
102 /* Various local functions */ | |
103 int SDL_AudioInit(const char *driver_name); | |
104 void SDL_AudioQuit(void); | |
105 | |
21
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
106 #ifdef ENABLE_AHI |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
107 static int audio_configured = 0; |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
108 #endif |
0 | 109 |
110 /* The general mixing thread function */ | |
111 int SDL_RunAudio(void *audiop) | |
112 { | |
113 SDL_AudioDevice *audio = (SDL_AudioDevice *)audiop; | |
114 Uint8 *stream; | |
115 int stream_len; | |
116 void *udata; | |
117 void (*fill)(void *userdata,Uint8 *stream, int len); | |
118 int silence; | |
21
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
119 #ifdef ENABLE_AHI |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
120 int started = 0; |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
121 |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
122 /* AmigaOS NEEDS that the audio driver is opened in the thread that uses it! */ |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
123 |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
124 D(bug("Task audio started audio struct:<%lx>...\n",audiop)); |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
125 |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
126 D(bug("Before Openaudio...")); |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
127 if(audio->OpenAudio(audio, &audio->spec)==-1) |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
128 { |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
129 D(bug("Open audio failed...\n")); |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
130 return(-1); |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
131 } |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
132 D(bug("OpenAudio...OK\n")); |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
133 #endif |
0 | 134 |
135 /* Perform any thread setup */ | |
136 if ( audio->ThreadInit ) { | |
137 audio->ThreadInit(audio); | |
138 } | |
139 audio->threadid = SDL_ThreadID(); | |
140 | |
141 /* Set up the mixing function */ | |
142 fill = audio->spec.callback; | |
143 udata = audio->spec.userdata; | |
21
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
144 |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
145 #ifdef ENABLE_AHI |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
146 audio_configured = 1; |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
147 |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
148 D(bug("Audio configured... Checking for conversion\n")); |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
149 SDL_mutexP(audio->mixer_lock); |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
150 D(bug("Semaphore obtained...\n")); |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
151 #endif |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
152 |
0 | 153 if ( audio->convert.needed ) { |
154 if ( audio->convert.src_format == AUDIO_U8 ) { | |
155 silence = 0x80; | |
156 } else { | |
157 silence = 0; | |
158 } | |
159 stream_len = audio->convert.len; | |
160 } else { | |
161 silence = audio->spec.silence; | |
162 stream_len = audio->spec.size; | |
163 } | |
164 stream = audio->fake_stream; | |
165 | |
21
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
166 #ifdef ENABLE_AHI |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
167 SDL_mutexV(audio->mixer_lock); |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
168 D(bug("Entering audio loop...\n")); |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
169 #endif |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
170 |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
171 |
0 | 172 /* Loop, filling the audio buffers */ |
173 while ( audio->enabled ) { | |
174 | |
175 /* Wait for new current buffer to finish playing */ | |
176 if ( stream == audio->fake_stream ) { | |
177 SDL_Delay((audio->spec.samples*1000)/audio->spec.freq); | |
178 } else { | |
21
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
179 #ifdef ENABLE_AHI |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
180 if ( started > 1 ) |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
181 #endif |
0 | 182 audio->WaitAudio(audio); |
183 } | |
184 | |
185 /* Fill the current buffer with sound */ | |
186 if ( audio->convert.needed ) { | |
187 if ( audio->convert.buf ) { | |
188 stream = audio->convert.buf; | |
189 } else { | |
190 continue; | |
191 } | |
192 } else { | |
193 stream = audio->GetAudioBuf(audio); | |
194 if ( stream == NULL ) { | |
195 stream = audio->fake_stream; | |
196 } | |
197 } | |
198 memset(stream, silence, stream_len); | |
199 | |
200 if ( ! audio->paused ) { | |
201 SDL_mutexP(audio->mixer_lock); | |
202 (*fill)(udata, stream, stream_len); | |
203 SDL_mutexV(audio->mixer_lock); | |
204 } | |
205 | |
206 /* Convert the audio if necessary */ | |
207 if ( audio->convert.needed ) { | |
208 SDL_ConvertAudio(&audio->convert); | |
209 stream = audio->GetAudioBuf(audio); | |
210 if ( stream == NULL ) { | |
211 stream = audio->fake_stream; | |
212 } | |
213 memcpy(stream, audio->convert.buf, | |
214 audio->convert.len_cvt); | |
215 } | |
216 | |
217 /* Ready current buffer for play and change current buffer */ | |
218 if ( stream != audio->fake_stream ) { | |
219 audio->PlayAudio(audio); | |
21
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
220 #ifdef ENABLE_AHI |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
221 /* AmigaOS don't have to wait the first time audio is played! */ |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
222 started++; |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
223 #endif |
0 | 224 } |
225 } | |
226 /* Wait for the audio to drain.. */ | |
227 if ( audio->WaitDone ) { | |
228 audio->WaitDone(audio); | |
229 } | |
21
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
230 |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
231 #ifdef ENABLE_AHI |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
232 D(bug("WaitAudio...Done\n")); |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
233 |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
234 audio->CloseAudio(audio); |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
235 |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
236 D(bug("CloseAudio..Done, subtask exiting...\n")); |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
237 audio_configured = 0; |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
238 #endif |
0 | 239 return(0); |
240 } | |
241 | |
322
fd93a09655e3
The audio lock and unlock functions are now a part of the driver.
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
242 static void SDL_LockAudio_Default(SDL_AudioDevice *audio) |
fd93a09655e3
The audio lock and unlock functions are now a part of the driver.
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
243 { |
fd93a09655e3
The audio lock and unlock functions are now a part of the driver.
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
244 if ( audio->thread && (SDL_ThreadID() == audio->threadid) ) { |
fd93a09655e3
The audio lock and unlock functions are now a part of the driver.
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
245 return; |
fd93a09655e3
The audio lock and unlock functions are now a part of the driver.
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
246 } |
fd93a09655e3
The audio lock and unlock functions are now a part of the driver.
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
247 SDL_mutexP(audio->mixer_lock); |
fd93a09655e3
The audio lock and unlock functions are now a part of the driver.
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
248 } |
fd93a09655e3
The audio lock and unlock functions are now a part of the driver.
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
249 |
fd93a09655e3
The audio lock and unlock functions are now a part of the driver.
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
250 static void SDL_UnlockAudio_Default(SDL_AudioDevice *audio) |
fd93a09655e3
The audio lock and unlock functions are now a part of the driver.
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
251 { |
fd93a09655e3
The audio lock and unlock functions are now a part of the driver.
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
252 if ( audio->thread && (SDL_ThreadID() == audio->threadid) ) { |
fd93a09655e3
The audio lock and unlock functions are now a part of the driver.
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
253 return; |
fd93a09655e3
The audio lock and unlock functions are now a part of the driver.
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
254 } |
fd93a09655e3
The audio lock and unlock functions are now a part of the driver.
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
255 SDL_mutexV(audio->mixer_lock); |
fd93a09655e3
The audio lock and unlock functions are now a part of the driver.
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
256 } |
fd93a09655e3
The audio lock and unlock functions are now a part of the driver.
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
257 |
0 | 258 int SDL_AudioInit(const char *driver_name) |
259 { | |
260 SDL_AudioDevice *audio; | |
261 int i = 0, idx; | |
262 | |
263 /* Check to make sure we don't overwrite 'current_audio' */ | |
264 if ( current_audio != NULL ) { | |
265 SDL_AudioQuit(); | |
266 } | |
267 | |
268 /* Select the proper audio driver */ | |
269 audio = NULL; | |
270 idx = 0; | |
271 #ifdef unix | |
272 if ( (driver_name == NULL) && (getenv("ESPEAKER") != NULL) ) { | |
273 /* Ahem, we know that if ESPEAKER is set, user probably wants | |
274 to use ESD, but don't start it if it's not already running. | |
275 This probably isn't the place to do this, but... Shh! :) | |
276 */ | |
277 for ( i=0; bootstrap[i]; ++i ) { | |
278 if ( strcmp(bootstrap[i]->name, "esd") == 0 ) { | |
279 const char *esd_no_spawn; | |
280 | |
281 /* Don't start ESD if it's not running */ | |
282 esd_no_spawn = getenv("ESD_NO_SPAWN"); | |
283 if ( esd_no_spawn == NULL ) { | |
284 putenv("ESD_NO_SPAWN=1"); | |
285 } | |
286 if ( bootstrap[i]->available() ) { | |
287 audio = bootstrap[i]->create(0); | |
288 break; | |
289 } | |
290 #ifdef linux /* No unsetenv() on most platforms */ | |
291 if ( esd_no_spawn == NULL ) { | |
292 unsetenv("ESD_NO_SPAWN"); | |
293 } | |
294 #endif | |
295 } | |
296 } | |
297 } | |
298 #endif /* unix */ | |
299 if ( audio == NULL ) { | |
300 if ( driver_name != NULL ) { | |
301 #if 0 /* This will be replaced with a better driver selection API */ | |
302 if ( strrchr(driver_name, ':') != NULL ) { | |
303 idx = atoi(strrchr(driver_name, ':')+1); | |
304 } | |
305 #endif | |
306 for ( i=0; bootstrap[i]; ++i ) { | |
307 if (strncmp(bootstrap[i]->name, driver_name, | |
308 strlen(bootstrap[i]->name)) == 0) { | |
309 if ( bootstrap[i]->available() ) { | |
310 audio=bootstrap[i]->create(idx); | |
311 break; | |
312 } | |
313 } | |
314 } | |
315 } else { | |
316 for ( i=0; bootstrap[i]; ++i ) { | |
317 if ( bootstrap[i]->available() ) { | |
318 audio = bootstrap[i]->create(idx); | |
319 if ( audio != NULL ) { | |
320 break; | |
321 } | |
322 } | |
323 } | |
324 } | |
325 if ( audio == NULL ) { | |
326 SDL_SetError("No available audio device"); | |
327 #if 0 /* Don't fail SDL_Init() if audio isn't available. | |
328 SDL_OpenAudio() will handle it at that point. *sigh* | |
329 */ | |
330 return(-1); | |
331 #endif | |
332 } | |
333 } | |
334 current_audio = audio; | |
335 if ( current_audio ) { | |
336 current_audio->name = bootstrap[i]->name; | |
322
fd93a09655e3
The audio lock and unlock functions are now a part of the driver.
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
337 if ( !current_audio->LockAudio && !current_audio->UnlockAudio ) { |
fd93a09655e3
The audio lock and unlock functions are now a part of the driver.
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
338 current_audio->LockAudio = SDL_LockAudio_Default; |
fd93a09655e3
The audio lock and unlock functions are now a part of the driver.
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
339 current_audio->UnlockAudio = SDL_UnlockAudio_Default; |
fd93a09655e3
The audio lock and unlock functions are now a part of the driver.
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
340 } |
0 | 341 } |
342 return(0); | |
343 } | |
344 | |
345 char *SDL_AudioDriverName(char *namebuf, int maxlen) | |
346 { | |
347 if ( current_audio != NULL ) { | |
348 strncpy(namebuf, current_audio->name, maxlen-1); | |
349 namebuf[maxlen-1] = '\0'; | |
350 return(namebuf); | |
351 } | |
352 return(NULL); | |
353 } | |
354 | |
355 int SDL_OpenAudio(SDL_AudioSpec *desired, SDL_AudioSpec *obtained) | |
356 { | |
357 SDL_AudioDevice *audio; | |
358 | |
359 /* Start up the audio driver, if necessary */ | |
360 if ( ! current_audio ) { | |
361 if ( (SDL_InitSubSystem(SDL_INIT_AUDIO) < 0) || | |
362 (current_audio == NULL) ) { | |
363 return(-1); | |
364 } | |
365 } | |
366 audio = current_audio; | |
367 | |
262
ba5363e21df8
Don't allow multiple audio opens to succeed (until SDL 1.3)
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
368 if (audio->opened) { |
ba5363e21df8
Don't allow multiple audio opens to succeed (until SDL 1.3)
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
369 SDL_SetError("Audio device is already opened"); |
ba5363e21df8
Don't allow multiple audio opens to succeed (until SDL 1.3)
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
370 return(-1); |
ba5363e21df8
Don't allow multiple audio opens to succeed (until SDL 1.3)
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
371 } |
ba5363e21df8
Don't allow multiple audio opens to succeed (until SDL 1.3)
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
372 |
0 | 373 /* Verify some parameters */ |
374 if ( desired->callback == NULL ) { | |
375 SDL_SetError("SDL_OpenAudio() passed a NULL callback"); | |
376 return(-1); | |
377 } | |
378 switch ( desired->channels ) { | |
379 case 1: /* Mono */ | |
380 case 2: /* Stereo */ | |
381 break; | |
382 default: | |
383 SDL_SetError("1 (mono) and 2 (stereo) channels supported"); | |
384 return(-1); | |
385 } | |
386 | |
630
550bccdf04bd
Added initial support for RISC OS (thanks Peter Naulls!)
Sam Lantinga <slouken@libsdl.org>
parents:
509
diff
changeset
|
387 #if defined(macintosh) || defined(__riscos__) |
0 | 388 /* FIXME: Need to implement PPC interrupt asm for SDL_LockAudio() */ |
389 #else | |
398
d219b0e02f5f
Added Atari audio support (thanks Patrice!)
Sam Lantinga <slouken@libsdl.org>
parents:
322
diff
changeset
|
390 #if defined(__MINT__) && !defined(ENABLE_THREADS) |
d219b0e02f5f
Added Atari audio support (thanks Patrice!)
Sam Lantinga <slouken@libsdl.org>
parents:
322
diff
changeset
|
391 /* Uses interrupt driven audio, without thread */ |
d219b0e02f5f
Added Atari audio support (thanks Patrice!)
Sam Lantinga <slouken@libsdl.org>
parents:
322
diff
changeset
|
392 #else |
0 | 393 /* Create a semaphore for locking the sound buffers */ |
394 audio->mixer_lock = SDL_CreateMutex(); | |
395 if ( audio->mixer_lock == NULL ) { | |
396 SDL_SetError("Couldn't create mixer lock"); | |
397 SDL_CloseAudio(); | |
398 return(-1); | |
399 } | |
398
d219b0e02f5f
Added Atari audio support (thanks Patrice!)
Sam Lantinga <slouken@libsdl.org>
parents:
322
diff
changeset
|
400 #endif /* __MINT__ */ |
d219b0e02f5f
Added Atari audio support (thanks Patrice!)
Sam Lantinga <slouken@libsdl.org>
parents:
322
diff
changeset
|
401 #endif /* macintosh */ |
0 | 402 |
403 /* Calculate the silence and size of the audio specification */ | |
404 SDL_CalculateAudioSpec(desired); | |
405 | |
406 /* Open the audio subsystem */ | |
407 memcpy(&audio->spec, desired, sizeof(audio->spec)); | |
408 audio->convert.needed = 0; | |
409 audio->enabled = 1; | |
410 audio->paused = 1; | |
21
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
411 |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
412 #ifndef ENABLE_AHI |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
413 |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
414 /* AmigaOS opens audio inside the main loop */ |
0 | 415 audio->opened = audio->OpenAudio(audio, &audio->spec)+1; |
21
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
416 |
0 | 417 if ( ! audio->opened ) { |
418 SDL_CloseAudio(); | |
419 return(-1); | |
420 } | |
21
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
421 #else |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
422 D(bug("Locking semaphore...")); |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
423 SDL_mutexP(audio->mixer_lock); |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
424 |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
425 audio->thread = SDL_CreateThread(SDL_RunAudio, audio); |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
426 D(bug("Created thread...\n")); |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
427 |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
428 if ( audio->thread == NULL ) { |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
429 SDL_mutexV(audio->mixer_lock); |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
430 SDL_CloseAudio(); |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
431 SDL_SetError("Couldn't create audio thread"); |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
432 return(-1); |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
433 } |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
434 |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
435 while(!audio_configured) |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
436 SDL_Delay(100); |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
437 #endif |
0 | 438 |
439 /* If the audio driver changes the buffer size, accept it */ | |
440 if ( audio->spec.samples != desired->samples ) { | |
441 desired->samples = audio->spec.samples; | |
442 SDL_CalculateAudioSpec(desired); | |
443 } | |
444 | |
445 /* Allocate a fake audio memory buffer */ | |
446 audio->fake_stream = SDL_AllocAudioMem(audio->spec.size); | |
447 if ( audio->fake_stream == NULL ) { | |
448 SDL_CloseAudio(); | |
449 SDL_OutOfMemory(); | |
450 return(-1); | |
451 } | |
452 | |
453 /* See if we need to do any conversion */ | |
454 if ( memcmp(desired, &audio->spec, sizeof(audio->spec)) == 0 ) { | |
455 /* Just copy over the desired audio specification */ | |
456 if ( obtained != NULL ) { | |
457 memcpy(obtained, &audio->spec, sizeof(audio->spec)); | |
458 } | |
459 } else { | |
460 /* Copy over the audio specification if possible */ | |
461 if ( obtained != NULL ) { | |
462 memcpy(obtained, &audio->spec, sizeof(audio->spec)); | |
463 } else { | |
464 /* Build an audio conversion block */ | |
465 if ( SDL_BuildAudioCVT(&audio->convert, | |
466 desired->format, desired->channels, | |
467 desired->freq, | |
468 audio->spec.format, audio->spec.channels, | |
469 audio->spec.freq) < 0 ) { | |
470 SDL_CloseAudio(); | |
471 return(-1); | |
472 } | |
473 if ( audio->convert.needed ) { | |
474 audio->convert.len = desired->size; | |
475 audio->convert.buf =(Uint8 *)SDL_AllocAudioMem( | |
476 audio->convert.len*audio->convert.len_mult); | |
477 if ( audio->convert.buf == NULL ) { | |
478 SDL_CloseAudio(); | |
479 SDL_OutOfMemory(); | |
480 return(-1); | |
481 } | |
482 } | |
483 } | |
484 } | |
485 | |
21
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
486 #ifndef ENABLE_AHI |
0 | 487 /* Start the audio thread if necessary */ |
488 switch (audio->opened) { | |
489 case 1: | |
490 /* Start the audio thread */ | |
491 audio->thread = SDL_CreateThread(SDL_RunAudio, audio); | |
492 if ( audio->thread == NULL ) { | |
493 SDL_CloseAudio(); | |
494 SDL_SetError("Couldn't create audio thread"); | |
495 return(-1); | |
496 } | |
497 break; | |
498 | |
499 default: | |
500 /* The audio is now playing */ | |
501 break; | |
502 } | |
21
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
503 #else |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
504 SDL_mutexV(audio->mixer_lock); |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
505 D(bug("SDL_OpenAudio USCITA...\n")); |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
506 |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
507 #endif |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
508 |
0 | 509 return(0); |
510 } | |
511 | |
512 SDL_audiostatus SDL_GetAudioStatus(void) | |
513 { | |
514 SDL_AudioDevice *audio = current_audio; | |
515 SDL_audiostatus status; | |
516 | |
517 status = SDL_AUDIO_STOPPED; | |
518 if ( audio && audio->enabled ) { | |
519 if ( audio->paused ) { | |
520 status = SDL_AUDIO_PAUSED; | |
521 } else { | |
522 status = SDL_AUDIO_PLAYING; | |
523 } | |
524 } | |
525 return(status); | |
526 } | |
527 | |
528 void SDL_PauseAudio (int pause_on) | |
529 { | |
530 SDL_AudioDevice *audio = current_audio; | |
531 | |
532 if ( audio ) { | |
533 audio->paused = pause_on; | |
534 } | |
535 } | |
536 | |
537 void SDL_LockAudio (void) | |
538 { | |
539 SDL_AudioDevice *audio = current_audio; | |
540 | |
541 /* Obtain a lock on the mixing buffers */ | |
322
fd93a09655e3
The audio lock and unlock functions are now a part of the driver.
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
542 if ( audio && audio->LockAudio ) { |
fd93a09655e3
The audio lock and unlock functions are now a part of the driver.
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
543 audio->LockAudio(audio); |
0 | 544 } |
545 } | |
546 | |
547 void SDL_UnlockAudio (void) | |
548 { | |
549 SDL_AudioDevice *audio = current_audio; | |
550 | |
551 /* Release lock on the mixing buffers */ | |
322
fd93a09655e3
The audio lock and unlock functions are now a part of the driver.
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
552 if ( audio && audio->UnlockAudio ) { |
fd93a09655e3
The audio lock and unlock functions are now a part of the driver.
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
553 audio->UnlockAudio(audio); |
0 | 554 } |
555 } | |
556 | |
557 void SDL_CloseAudio (void) | |
558 { | |
559 SDL_QuitSubSystem(SDL_INIT_AUDIO); | |
560 } | |
561 | |
562 void SDL_AudioQuit(void) | |
563 { | |
564 SDL_AudioDevice *audio = current_audio; | |
565 | |
566 if ( audio ) { | |
567 audio->enabled = 0; | |
568 if ( audio->thread != NULL ) { | |
569 SDL_WaitThread(audio->thread, NULL); | |
570 } | |
571 if ( audio->mixer_lock != NULL ) { | |
572 SDL_DestroyMutex(audio->mixer_lock); | |
573 } | |
574 if ( audio->fake_stream != NULL ) { | |
575 SDL_FreeAudioMem(audio->fake_stream); | |
576 } | |
577 if ( audio->convert.needed ) { | |
578 SDL_FreeAudioMem(audio->convert.buf); | |
21
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
579 |
0 | 580 } |
21
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
581 #ifndef ENABLE_AHI |
0 | 582 if ( audio->opened ) { |
583 audio->CloseAudio(audio); | |
584 audio->opened = 0; | |
585 } | |
21
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
586 #endif |
0 | 587 /* Free the driver data */ |
588 audio->free(audio); | |
589 current_audio = NULL; | |
590 } | |
591 } | |
592 | |
593 #define NUM_FORMATS 6 | |
594 static int format_idx; | |
595 static int format_idx_sub; | |
596 static Uint16 format_list[NUM_FORMATS][NUM_FORMATS] = { | |
597 { AUDIO_U8, AUDIO_S8, AUDIO_S16LSB, AUDIO_S16MSB, AUDIO_U16LSB, AUDIO_U16MSB }, | |
598 { AUDIO_S8, AUDIO_U8, AUDIO_S16LSB, AUDIO_S16MSB, AUDIO_U16LSB, AUDIO_U16MSB }, | |
599 { AUDIO_S16LSB, AUDIO_S16MSB, AUDIO_U16LSB, AUDIO_U16MSB, AUDIO_U8, AUDIO_S8 }, | |
600 { AUDIO_S16MSB, AUDIO_S16LSB, AUDIO_U16MSB, AUDIO_U16LSB, AUDIO_U8, AUDIO_S8 }, | |
601 { AUDIO_U16LSB, AUDIO_U16MSB, AUDIO_S16LSB, AUDIO_S16MSB, AUDIO_U8, AUDIO_S8 }, | |
602 { AUDIO_U16MSB, AUDIO_U16LSB, AUDIO_S16MSB, AUDIO_S16LSB, AUDIO_U8, AUDIO_S8 }, | |
603 }; | |
604 | |
605 Uint16 SDL_FirstAudioFormat(Uint16 format) | |
606 { | |
607 for ( format_idx=0; format_idx < NUM_FORMATS; ++format_idx ) { | |
608 if ( format_list[format_idx][0] == format ) { | |
609 break; | |
610 } | |
611 } | |
612 format_idx_sub = 0; | |
613 return(SDL_NextAudioFormat()); | |
614 } | |
615 | |
616 Uint16 SDL_NextAudioFormat(void) | |
617 { | |
618 if ( (format_idx == NUM_FORMATS) || (format_idx_sub == NUM_FORMATS) ) { | |
619 return(0); | |
620 } | |
621 return(format_list[format_idx][format_idx_sub++]); | |
622 } | |
623 | |
624 void SDL_CalculateAudioSpec(SDL_AudioSpec *spec) | |
625 { | |
626 switch (spec->format) { | |
627 case AUDIO_U8: | |
628 spec->silence = 0x80; | |
629 break; | |
630 default: | |
631 spec->silence = 0x00; | |
632 break; | |
633 } | |
634 spec->size = (spec->format&0xFF)/8; | |
635 spec->size *= spec->channels; | |
636 spec->size *= spec->samples; | |
637 } |