Mercurial > sdl-ios-xcode
annotate src/audio/SDL_audio.c @ 3957:b1d5b56aa549 SDL-1.2
Date: Mon, 4 Jun 2007 06:17:59 +0000 (UTC)
From: George Gensure <werkt0@gmail.com>
Subject: [SDL] error removal patch for SDL_x11dyn.c
I found that calling SDL_GetError when an error hasn't necessarily occurred is
still reporting problems from loadso regarding dynamic functions in X11. I've
added the following to my local copy to avoid revealing the 'many library
lookup' approach adopted by x11dyn.c:
author | Ryan C. Gordon <icculus@icculus.org> |
---|---|
date | Wed, 13 Jun 2007 07:54:10 +0000 |
parents | 42e83d81224b |
children | e85e65aec22f |
rev | line source |
---|---|
0 | 1 /* |
2 SDL - Simple DirectMedia Layer | |
1312
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
1204
diff
changeset
|
3 Copyright (C) 1997-2006 Sam Lantinga |
0 | 4 |
5 This library is free software; you can redistribute it and/or | |
1312
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
1204
diff
changeset
|
6 modify it under the terms of the GNU Lesser General Public |
0 | 7 License as published by the Free Software Foundation; either |
1312
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
1204
diff
changeset
|
8 version 2.1 of the License, or (at your option) any later version. |
0 | 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 | |
1312
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
1204
diff
changeset
|
13 Lesser General Public License for more details. |
0 | 14 |
1312
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
1204
diff
changeset
|
15 You should have received a copy of the GNU Lesser General Public |
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
1204
diff
changeset
|
16 License along with this library; if not, write to the Free Software |
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
1204
diff
changeset
|
17 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
0 | 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 */ |
1402
d910939febfa
Use consistent identifiers for the various platforms we support.
Sam Lantinga <slouken@libsdl.org>
parents:
1379
diff
changeset
|
22 #include "SDL_config.h" |
0 | 23 |
24 /* Allow access to a raw mixing buffer */ | |
25 | |
26 #include "SDL.h" | |
27 #include "SDL_audio_c.h" | |
28 #include "SDL_audiomem.h" | |
29 #include "SDL_sysaudio.h" | |
30 | |
1190 | 31 #ifdef __OS2__ |
1487
dc6b59e925a2
Cleaning up warnings on MacOS X
Sam Lantinga <slouken@libsdl.org>
parents:
1442
diff
changeset
|
32 /* We'll need the DosSetPriority() API! */ |
1190 | 33 #define INCL_DOSPROCESS |
34 #include <os2.h> | |
35 #endif | |
36 | |
0 | 37 /* Available audio drivers */ |
38 static AudioBootStrap *bootstrap[] = { | |
1567
12b6d331d82a
Good idea, renaming OpenBSD audio to BSD audio.
Sam Lantinga <slouken@libsdl.org>
parents:
1562
diff
changeset
|
39 #if SDL_AUDIO_DRIVER_BSD |
12b6d331d82a
Good idea, renaming OpenBSD audio to BSD audio.
Sam Lantinga <slouken@libsdl.org>
parents:
1562
diff
changeset
|
40 &BSD_AUDIO_bootstrap, |
94
ae6e6b73333f
Cleaned up the OpenBSD port, thanks to Peter Valchev
Sam Lantinga <slouken@lokigames.com>
parents:
68
diff
changeset
|
41 #endif |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
42 #if SDL_AUDIO_DRIVER_OSS |
0 | 43 &DSP_bootstrap, |
44 &DMA_bootstrap, | |
45 #endif | |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
46 #if SDL_AUDIO_DRIVER_ALSA |
0 | 47 &ALSA_bootstrap, |
48 #endif | |
3939
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
3888
diff
changeset
|
49 #if SDL_AUDIO_DRIVER_PULSE |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
3888
diff
changeset
|
50 &PULSE_bootstrap, |
42e83d81224b
Committed PulseAudio driver. Thanks, Stephan!
Ryan C. Gordon <icculus@icculus.org>
parents:
3888
diff
changeset
|
51 #endif |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
52 #if SDL_AUDIO_DRIVER_QNXNTO |
663
8bedd6d61642
Date: Sat, 2 Aug 2003 16:22:51 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
654
diff
changeset
|
53 &QNXNTOAUDIO_bootstrap, |
8bedd6d61642
Date: Sat, 2 Aug 2003 16:22:51 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
654
diff
changeset
|
54 #endif |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
55 #if SDL_AUDIO_DRIVER_SUNAUDIO |
148
8758b8d42cd9
Audio subsystem no longer assumes sun audio API on UNIX systems
Sam Lantinga <slouken@libsdl.org>
parents:
121
diff
changeset
|
56 &SUNAUDIO_bootstrap, |
8758b8d42cd9
Audio subsystem no longer assumes sun audio API on UNIX systems
Sam Lantinga <slouken@libsdl.org>
parents:
121
diff
changeset
|
57 #endif |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
58 #if SDL_AUDIO_DRIVER_DMEDIA |
148
8758b8d42cd9
Audio subsystem no longer assumes sun audio API on UNIX systems
Sam Lantinga <slouken@libsdl.org>
parents:
121
diff
changeset
|
59 &DMEDIA_bootstrap, |
35
d3bc792e136d
Added detection of Open Sound System on Solaris x86
Sam Lantinga <slouken@lokigames.com>
parents:
21
diff
changeset
|
60 #endif |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
61 #if SDL_AUDIO_DRIVER_ARTS |
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
62 &ARTS_bootstrap, |
0 | 63 #endif |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
64 #if SDL_AUDIO_DRIVER_ESD |
0 | 65 &ESD_bootstrap, |
66 #endif | |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
67 #if SDL_AUDIO_DRIVER_NAS |
0 | 68 &NAS_bootstrap, |
69 #endif | |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
70 #if SDL_AUDIO_DRIVER_DSOUND |
0 | 71 &DSOUND_bootstrap, |
72 #endif | |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
73 #if SDL_AUDIO_DRIVER_WAVEOUT |
0 | 74 &WAVEOUT_bootstrap, |
75 #endif | |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
76 #if SDL_AUDIO_DRIVER_PAUD |
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
77 &Paud_bootstrap, |
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
78 #endif |
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
79 #if SDL_AUDIO_DRIVER_BAUDIO |
0 | 80 &BAUDIO_bootstrap, |
81 #endif | |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
82 #if SDL_AUDIO_DRIVER_COREAUDIO |
935
f8d5ddc7aef1
Audio improvements from Max Horn, including a new CoreAudio driver for MacOSX
Sam Lantinga <slouken@libsdl.org>
parents:
808
diff
changeset
|
83 &COREAUDIO_bootstrap, |
f8d5ddc7aef1
Audio improvements from Max Horn, including a new CoreAudio driver for MacOSX
Sam Lantinga <slouken@libsdl.org>
parents:
808
diff
changeset
|
84 #endif |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
85 #if SDL_AUDIO_DRIVER_SNDMGR |
0 | 86 &SNDMGR_bootstrap, |
87 #endif | |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
88 #if SDL_AUDIO_DRIVER_MINT |
644
594422ab8f9f
Atari MiNT: added more audio drivers
Patrice Mandin <patmandin@gmail.com>
parents:
630
diff
changeset
|
89 &MINTAUDIO_GSXB_bootstrap, |
594422ab8f9f
Atari MiNT: added more audio drivers
Patrice Mandin <patmandin@gmail.com>
parents:
630
diff
changeset
|
90 &MINTAUDIO_MCSN_bootstrap, |
594422ab8f9f
Atari MiNT: added more audio drivers
Patrice Mandin <patmandin@gmail.com>
parents:
630
diff
changeset
|
91 &MINTAUDIO_STFA_bootstrap, |
594422ab8f9f
Atari MiNT: added more audio drivers
Patrice Mandin <patmandin@gmail.com>
parents:
630
diff
changeset
|
92 &MINTAUDIO_XBIOS_bootstrap, |
594422ab8f9f
Atari MiNT: added more audio drivers
Patrice Mandin <patmandin@gmail.com>
parents:
630
diff
changeset
|
93 &MINTAUDIO_DMA8_bootstrap, |
398
d219b0e02f5f
Added Atari audio support (thanks Patrice!)
Sam Lantinga <slouken@libsdl.org>
parents:
322
diff
changeset
|
94 #endif |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
95 #if SDL_AUDIO_DRIVER_DISK |
68
ac6645260d31
Added an audio driver that writes to disk (thanks Ryan!)
Sam Lantinga <slouken@lokigames.com>
parents:
38
diff
changeset
|
96 &DISKAUD_bootstrap, |
ac6645260d31
Added an audio driver that writes to disk (thanks Ryan!)
Sam Lantinga <slouken@lokigames.com>
parents:
38
diff
changeset
|
97 #endif |
1532
30f189cdd82b
Implemented dummy audio driver.
Ryan C. Gordon <icculus@icculus.org>
parents:
1487
diff
changeset
|
98 #if SDL_AUDIO_DRIVER_DUMMY |
30f189cdd82b
Implemented dummy audio driver.
Ryan C. Gordon <icculus@icculus.org>
parents:
1487
diff
changeset
|
99 &DUMMYAUD_bootstrap, |
30f189cdd82b
Implemented dummy audio driver.
Ryan C. Gordon <icculus@icculus.org>
parents:
1487
diff
changeset
|
100 #endif |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
101 #if SDL_AUDIO_DRIVER_DC |
509
dad72daf44b3
Added initial support for Dreamcast (thanks HERO!)
Sam Lantinga <slouken@libsdl.org>
parents:
398
diff
changeset
|
102 &DCAUD_bootstrap, |
dad72daf44b3
Added initial support for Dreamcast (thanks HERO!)
Sam Lantinga <slouken@libsdl.org>
parents:
398
diff
changeset
|
103 #endif |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
104 #if SDL_AUDIO_DRIVER_MMEAUDIO |
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
105 &MMEAUDIO_bootstrap, |
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
106 #endif |
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
107 #if SDL_AUDIO_DRIVER_DART |
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
108 &DART_bootstrap, |
1190 | 109 #endif |
0 | 110 NULL |
111 }; | |
112 SDL_AudioDevice *current_audio = NULL; | |
113 | |
114 /* Various local functions */ | |
115 int SDL_AudioInit(const char *driver_name); | |
116 void SDL_AudioQuit(void); | |
117 | |
118 /* The general mixing thread function */ | |
1769 | 119 int SDLCALL SDL_RunAudio(void *audiop) |
0 | 120 { |
121 SDL_AudioDevice *audio = (SDL_AudioDevice *)audiop; | |
122 Uint8 *stream; | |
123 int stream_len; | |
124 void *udata; | |
1769 | 125 void (SDLCALL *fill)(void *userdata,Uint8 *stream, int len); |
0 | 126 int silence; |
127 | |
128 /* Perform any thread setup */ | |
129 if ( audio->ThreadInit ) { | |
130 audio->ThreadInit(audio); | |
131 } | |
132 audio->threadid = SDL_ThreadID(); | |
133 | |
134 /* Set up the mixing function */ | |
135 fill = audio->spec.callback; | |
136 udata = audio->spec.userdata; | |
21
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
137 |
0 | 138 if ( audio->convert.needed ) { |
139 if ( audio->convert.src_format == AUDIO_U8 ) { | |
140 silence = 0x80; | |
141 } else { | |
142 silence = 0; | |
143 } | |
144 stream_len = audio->convert.len; | |
145 } else { | |
146 silence = audio->spec.silence; | |
147 stream_len = audio->spec.size; | |
148 } | |
1561
c724c4a99759
Try to fill the hardware audio buffer immediately.
Ryan C. Gordon <icculus@icculus.org>
parents:
1532
diff
changeset
|
149 |
1190 | 150 #ifdef __OS2__ |
1487
dc6b59e925a2
Cleaning up warnings on MacOS X
Sam Lantinga <slouken@libsdl.org>
parents:
1442
diff
changeset
|
151 /* Increase the priority of this thread to make sure that |
dc6b59e925a2
Cleaning up warnings on MacOS X
Sam Lantinga <slouken@libsdl.org>
parents:
1442
diff
changeset
|
152 the audio will be continuous all the time! */ |
1190 | 153 #ifdef USE_DOSSETPRIORITY |
1442
e3242177fe4a
Updated OS/2 build, yay!
Sam Lantinga <slouken@libsdl.org>
parents:
1408
diff
changeset
|
154 if (SDL_getenv("SDL_USE_TIMECRITICAL_AUDIO")) |
e3242177fe4a
Updated OS/2 build, yay!
Sam Lantinga <slouken@libsdl.org>
parents:
1408
diff
changeset
|
155 { |
1190 | 156 #ifdef DEBUG_BUILD |
1442
e3242177fe4a
Updated OS/2 build, yay!
Sam Lantinga <slouken@libsdl.org>
parents:
1408
diff
changeset
|
157 printf("[SDL_RunAudio] : Setting priority to TimeCritical+0! (TID%d)\n", SDL_ThreadID()); |
1190 | 158 #endif |
1442
e3242177fe4a
Updated OS/2 build, yay!
Sam Lantinga <slouken@libsdl.org>
parents:
1408
diff
changeset
|
159 DosSetPriority(PRTYS_THREAD, PRTYC_TIMECRITICAL, 0, 0); |
e3242177fe4a
Updated OS/2 build, yay!
Sam Lantinga <slouken@libsdl.org>
parents:
1408
diff
changeset
|
160 } |
e3242177fe4a
Updated OS/2 build, yay!
Sam Lantinga <slouken@libsdl.org>
parents:
1408
diff
changeset
|
161 else |
e3242177fe4a
Updated OS/2 build, yay!
Sam Lantinga <slouken@libsdl.org>
parents:
1408
diff
changeset
|
162 { |
e3242177fe4a
Updated OS/2 build, yay!
Sam Lantinga <slouken@libsdl.org>
parents:
1408
diff
changeset
|
163 #ifdef DEBUG_BUILD |
e3242177fe4a
Updated OS/2 build, yay!
Sam Lantinga <slouken@libsdl.org>
parents:
1408
diff
changeset
|
164 printf("[SDL_RunAudio] : Setting priority to ForegroundServer+0! (TID%d)\n", SDL_ThreadID()); |
e3242177fe4a
Updated OS/2 build, yay!
Sam Lantinga <slouken@libsdl.org>
parents:
1408
diff
changeset
|
165 #endif |
e3242177fe4a
Updated OS/2 build, yay!
Sam Lantinga <slouken@libsdl.org>
parents:
1408
diff
changeset
|
166 DosSetPriority(PRTYS_THREAD, PRTYC_FOREGROUNDSERVER, 0, 0); |
e3242177fe4a
Updated OS/2 build, yay!
Sam Lantinga <slouken@libsdl.org>
parents:
1408
diff
changeset
|
167 } |
1190 | 168 #endif |
169 #endif | |
21
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
170 |
0 | 171 /* Loop, filling the audio buffers */ |
172 while ( audio->enabled ) { | |
173 | |
174 /* Fill the current buffer with sound */ | |
175 if ( audio->convert.needed ) { | |
176 if ( audio->convert.buf ) { | |
177 stream = audio->convert.buf; | |
178 } else { | |
179 continue; | |
180 } | |
181 } else { | |
182 stream = audio->GetAudioBuf(audio); | |
183 if ( stream == NULL ) { | |
184 stream = audio->fake_stream; | |
185 } | |
186 } | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
187 SDL_memset(stream, silence, stream_len); |
0 | 188 |
189 if ( ! audio->paused ) { | |
190 SDL_mutexP(audio->mixer_lock); | |
191 (*fill)(udata, stream, stream_len); | |
192 SDL_mutexV(audio->mixer_lock); | |
193 } | |
194 | |
195 /* Convert the audio if necessary */ | |
196 if ( audio->convert.needed ) { | |
197 SDL_ConvertAudio(&audio->convert); | |
198 stream = audio->GetAudioBuf(audio); | |
199 if ( stream == NULL ) { | |
200 stream = audio->fake_stream; | |
201 } | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
202 SDL_memcpy(stream, audio->convert.buf, |
0 | 203 audio->convert.len_cvt); |
204 } | |
205 | |
206 /* Ready current buffer for play and change current buffer */ | |
207 if ( stream != audio->fake_stream ) { | |
208 audio->PlayAudio(audio); | |
1562 | 209 } |
210 | |
211 /* Wait for an audio buffer to become available */ | |
212 if ( stream == audio->fake_stream ) { | |
213 SDL_Delay((audio->spec.samples*1000)/audio->spec.freq); | |
214 } else { | |
215 audio->WaitAudio(audio); | |
0 | 216 } |
217 } | |
1562 | 218 |
0 | 219 /* Wait for the audio to drain.. */ |
220 if ( audio->WaitDone ) { | |
221 audio->WaitDone(audio); | |
222 } | |
21
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
223 |
1190 | 224 #ifdef __OS2__ |
225 #ifdef DEBUG_BUILD | |
226 printf("[SDL_RunAudio] : Task exiting. (TID%d)\n", SDL_ThreadID()); | |
227 #endif | |
228 #endif | |
0 | 229 return(0); |
230 } | |
231 | |
322
fd93a09655e3
The audio lock and unlock functions are now a part of the driver.
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
232 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
|
233 { |
fd93a09655e3
The audio lock and unlock functions are now a part of the driver.
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
234 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
|
235 return; |
fd93a09655e3
The audio lock and unlock functions are now a part of the driver.
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
236 } |
fd93a09655e3
The audio lock and unlock functions are now a part of the driver.
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
237 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
|
238 } |
fd93a09655e3
The audio lock and unlock functions are now a part of the driver.
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
239 |
fd93a09655e3
The audio lock and unlock functions are now a part of the driver.
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
240 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
|
241 { |
fd93a09655e3
The audio lock and unlock functions are now a part of the driver.
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
242 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
|
243 return; |
fd93a09655e3
The audio lock and unlock functions are now a part of the driver.
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
244 } |
fd93a09655e3
The audio lock and unlock functions are now a part of the driver.
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
245 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
|
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 |
1794 | 248 static Uint16 SDL_ParseAudioFormat(const char *string) |
249 { | |
250 Uint16 format = 0; | |
251 | |
252 switch (*string) { | |
253 case 'U': | |
254 ++string; | |
255 format |= 0x0000; | |
256 break; | |
257 case 'S': | |
258 ++string; | |
259 format |= 0x8000; | |
260 break; | |
261 default: | |
262 return 0; | |
263 } | |
264 switch (SDL_atoi(string)) { | |
265 case 8: | |
266 string += 1; | |
267 format |= 8; | |
268 break; | |
269 case 16: | |
270 string += 2; | |
271 format |= 16; | |
272 if ( SDL_strcmp(string, "LSB") == 0 | |
273 #if SDL_BYTEORDER == SDL_LIL_ENDIAN | |
274 || SDL_strcmp(string, "SYS") == 0 | |
275 #endif | |
276 ) { | |
277 format |= 0x0000; | |
278 } | |
279 if ( SDL_strcmp(string, "MSB") == 0 | |
280 #if SDL_BYTEORDER == SDL_BIG_ENDIAN | |
281 || SDL_strcmp(string, "SYS") == 0 | |
282 #endif | |
283 ) { | |
284 format |= 0x1000; | |
285 } | |
286 break; | |
287 default: | |
288 return 0; | |
289 } | |
290 return format; | |
291 } | |
292 | |
0 | 293 int SDL_AudioInit(const char *driver_name) |
294 { | |
295 SDL_AudioDevice *audio; | |
296 int i = 0, idx; | |
297 | |
298 /* Check to make sure we don't overwrite 'current_audio' */ | |
299 if ( current_audio != NULL ) { | |
300 SDL_AudioQuit(); | |
301 } | |
302 | |
303 /* Select the proper audio driver */ | |
304 audio = NULL; | |
305 idx = 0; | |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
306 #if SDL_AUDIO_DRIVER_ESD |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
307 if ( (driver_name == NULL) && (SDL_getenv("ESPEAKER") != NULL) ) { |
0 | 308 /* Ahem, we know that if ESPEAKER is set, user probably wants |
309 to use ESD, but don't start it if it's not already running. | |
310 This probably isn't the place to do this, but... Shh! :) | |
311 */ | |
312 for ( i=0; bootstrap[i]; ++i ) { | |
3881
c1b6bb5205f1
1.2 backport: Replaced strncmp for SDL_AUDIODRIVER test with strcasecmp.
Ryan C. Gordon <icculus@icculus.org>
parents:
1794
diff
changeset
|
313 if ( SDL_strcasecmp(bootstrap[i]->name, "esd") == 0 ) { |
1341
d02b552e5304
Configure dynamically generates SDL_config.h
Sam Lantinga <slouken@libsdl.org>
parents:
1336
diff
changeset
|
314 #ifdef HAVE_PUTENV |
0 | 315 const char *esd_no_spawn; |
316 | |
317 /* Don't start ESD if it's not running */ | |
1341
d02b552e5304
Configure dynamically generates SDL_config.h
Sam Lantinga <slouken@libsdl.org>
parents:
1336
diff
changeset
|
318 esd_no_spawn = getenv("ESD_NO_SPAWN"); |
0 | 319 if ( esd_no_spawn == NULL ) { |
320 putenv("ESD_NO_SPAWN=1"); | |
321 } | |
1341
d02b552e5304
Configure dynamically generates SDL_config.h
Sam Lantinga <slouken@libsdl.org>
parents:
1336
diff
changeset
|
322 #endif |
0 | 323 if ( bootstrap[i]->available() ) { |
324 audio = bootstrap[i]->create(0); | |
325 break; | |
326 } | |
1341
d02b552e5304
Configure dynamically generates SDL_config.h
Sam Lantinga <slouken@libsdl.org>
parents:
1336
diff
changeset
|
327 #ifdef HAVE_UNSETENV |
0 | 328 if ( esd_no_spawn == NULL ) { |
329 unsetenv("ESD_NO_SPAWN"); | |
330 } | |
331 #endif | |
332 } | |
333 } | |
334 } | |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
335 #endif /* SDL_AUDIO_DRIVER_ESD */ |
0 | 336 if ( audio == NULL ) { |
337 if ( driver_name != NULL ) { | |
338 #if 0 /* This will be replaced with a better driver selection API */ | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
339 if ( SDL_strrchr(driver_name, ':') != NULL ) { |
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
340 idx = atoi(SDL_strrchr(driver_name, ':')+1); |
0 | 341 } |
342 #endif | |
343 for ( i=0; bootstrap[i]; ++i ) { | |
3881
c1b6bb5205f1
1.2 backport: Replaced strncmp for SDL_AUDIODRIVER test with strcasecmp.
Ryan C. Gordon <icculus@icculus.org>
parents:
1794
diff
changeset
|
344 if (SDL_strcasecmp(bootstrap[i]->name, driver_name) == 0) { |
0 | 345 if ( bootstrap[i]->available() ) { |
346 audio=bootstrap[i]->create(idx); | |
347 break; | |
348 } | |
349 } | |
350 } | |
351 } else { | |
352 for ( i=0; bootstrap[i]; ++i ) { | |
353 if ( bootstrap[i]->available() ) { | |
354 audio = bootstrap[i]->create(idx); | |
355 if ( audio != NULL ) { | |
356 break; | |
357 } | |
358 } | |
359 } | |
360 } | |
361 if ( audio == NULL ) { | |
362 SDL_SetError("No available audio device"); | |
363 #if 0 /* Don't fail SDL_Init() if audio isn't available. | |
364 SDL_OpenAudio() will handle it at that point. *sigh* | |
365 */ | |
366 return(-1); | |
367 #endif | |
368 } | |
369 } | |
370 current_audio = audio; | |
371 if ( current_audio ) { | |
372 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
|
373 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
|
374 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
|
375 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
|
376 } |
0 | 377 } |
378 return(0); | |
379 } | |
380 | |
381 char *SDL_AudioDriverName(char *namebuf, int maxlen) | |
382 { | |
383 if ( current_audio != NULL ) { | |
1379
c0a74f199ecf
Use only safe string functions
Sam Lantinga <slouken@libsdl.org>
parents:
1361
diff
changeset
|
384 SDL_strlcpy(namebuf, current_audio->name, maxlen); |
0 | 385 return(namebuf); |
386 } | |
387 return(NULL); | |
388 } | |
389 | |
390 int SDL_OpenAudio(SDL_AudioSpec *desired, SDL_AudioSpec *obtained) | |
391 { | |
392 SDL_AudioDevice *audio; | |
1794 | 393 const char *env; |
0 | 394 |
395 /* Start up the audio driver, if necessary */ | |
396 if ( ! current_audio ) { | |
397 if ( (SDL_InitSubSystem(SDL_INIT_AUDIO) < 0) || | |
398 (current_audio == NULL) ) { | |
399 return(-1); | |
400 } | |
401 } | |
402 audio = current_audio; | |
403 | |
262
ba5363e21df8
Don't allow multiple audio opens to succeed (until SDL 1.3)
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
404 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
|
405 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
|
406 return(-1); |
ba5363e21df8
Don't allow multiple audio opens to succeed (until SDL 1.3)
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
407 } |
ba5363e21df8
Don't allow multiple audio opens to succeed (until SDL 1.3)
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
408 |
0 | 409 /* Verify some parameters */ |
1794 | 410 if ( desired->freq == 0 ) { |
411 env = SDL_getenv("SDL_AUDIO_FREQUENCY"); | |
412 if ( env ) { | |
413 desired->freq = SDL_atoi(env); | |
414 } | |
415 } | |
416 if ( desired->freq == 0 ) { | |
417 /* Pick some default audio frequency */ | |
418 desired->freq = 22050; | |
419 } | |
420 if ( desired->format == 0 ) { | |
421 env = SDL_getenv("SDL_AUDIO_FORMAT"); | |
422 if ( env ) { | |
423 desired->format = SDL_ParseAudioFormat(env); | |
424 } | |
425 } | |
426 if ( desired->format == 0 ) { | |
427 /* Pick some default audio format */ | |
428 desired->format = AUDIO_S16; | |
429 } | |
430 if ( desired->channels == 0 ) { | |
431 env = SDL_getenv("SDL_AUDIO_CHANNELS"); | |
432 if ( env ) { | |
433 desired->channels = SDL_atoi(env); | |
434 } | |
435 } | |
436 if ( desired->channels == 0 ) { | |
437 /* Pick a default number of channels */ | |
438 desired->channels = 2; | |
0 | 439 } |
440 switch ( desired->channels ) { | |
441 case 1: /* Mono */ | |
442 case 2: /* Stereo */ | |
942
41a59de7f2ed
Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents:
936
diff
changeset
|
443 case 4: /* surround */ |
41a59de7f2ed
Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents:
936
diff
changeset
|
444 case 6: /* surround with center and lfe */ |
0 | 445 break; |
446 default: | |
447 SDL_SetError("1 (mono) and 2 (stereo) channels supported"); | |
448 return(-1); | |
449 } | |
1794 | 450 if ( desired->samples == 0 ) { |
451 env = SDL_getenv("SDL_AUDIO_SAMPLES"); | |
452 if ( env ) { | |
453 desired->samples = SDL_atoi(env); | |
454 } | |
455 } | |
456 if ( desired->samples == 0 ) { | |
457 /* Pick a default of ~46 ms at desired frequency */ | |
458 int samples = (desired->freq / 1000) * 46; | |
459 int power2 = 1; | |
460 while ( power2 < samples ) { | |
461 power2 *= 2; | |
462 } | |
463 desired->samples = power2; | |
464 } | |
465 if ( desired->callback == NULL ) { | |
466 SDL_SetError("SDL_OpenAudio() passed a NULL callback"); | |
467 return(-1); | |
468 } | |
0 | 469 |
1402
d910939febfa
Use consistent identifiers for the various platforms we support.
Sam Lantinga <slouken@libsdl.org>
parents:
1379
diff
changeset
|
470 #if defined(__MACOS__) || (defined(__RISCOS__) && SDL_THREADS_DISABLED) |
0 | 471 /* FIXME: Need to implement PPC interrupt asm for SDL_LockAudio() */ |
472 #else | |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
473 #if defined(__MINT__) && SDL_THREADS_DISABLED |
398
d219b0e02f5f
Added Atari audio support (thanks Patrice!)
Sam Lantinga <slouken@libsdl.org>
parents:
322
diff
changeset
|
474 /* Uses interrupt driven audio, without thread */ |
d219b0e02f5f
Added Atari audio support (thanks Patrice!)
Sam Lantinga <slouken@libsdl.org>
parents:
322
diff
changeset
|
475 #else |
0 | 476 /* Create a semaphore for locking the sound buffers */ |
477 audio->mixer_lock = SDL_CreateMutex(); | |
478 if ( audio->mixer_lock == NULL ) { | |
479 SDL_SetError("Couldn't create mixer lock"); | |
480 SDL_CloseAudio(); | |
481 return(-1); | |
482 } | |
398
d219b0e02f5f
Added Atari audio support (thanks Patrice!)
Sam Lantinga <slouken@libsdl.org>
parents:
322
diff
changeset
|
483 #endif /* __MINT__ */ |
1402
d910939febfa
Use consistent identifiers for the various platforms we support.
Sam Lantinga <slouken@libsdl.org>
parents:
1379
diff
changeset
|
484 #endif /* __MACOS__ */ |
0 | 485 |
486 /* Calculate the silence and size of the audio specification */ | |
487 SDL_CalculateAudioSpec(desired); | |
488 | |
489 /* Open the audio subsystem */ | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
490 SDL_memcpy(&audio->spec, desired, sizeof(audio->spec)); |
0 | 491 audio->convert.needed = 0; |
492 audio->enabled = 1; | |
493 audio->paused = 1; | |
21
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
494 |
0 | 495 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
|
496 |
0 | 497 if ( ! audio->opened ) { |
498 SDL_CloseAudio(); | |
499 return(-1); | |
500 } | |
501 | |
502 /* If the audio driver changes the buffer size, accept it */ | |
503 if ( audio->spec.samples != desired->samples ) { | |
504 desired->samples = audio->spec.samples; | |
505 SDL_CalculateAudioSpec(desired); | |
506 } | |
507 | |
508 /* Allocate a fake audio memory buffer */ | |
509 audio->fake_stream = SDL_AllocAudioMem(audio->spec.size); | |
510 if ( audio->fake_stream == NULL ) { | |
511 SDL_CloseAudio(); | |
512 SDL_OutOfMemory(); | |
513 return(-1); | |
514 } | |
515 | |
516 /* See if we need to do any conversion */ | |
808
0defd90ef27c
Simplify code and clean up Valgrind warning
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
517 if ( obtained != NULL ) { |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
518 SDL_memcpy(obtained, &audio->spec, sizeof(audio->spec)); |
808
0defd90ef27c
Simplify code and clean up Valgrind warning
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
519 } else if ( desired->freq != audio->spec.freq || |
0defd90ef27c
Simplify code and clean up Valgrind warning
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
520 desired->format != audio->spec.format || |
0defd90ef27c
Simplify code and clean up Valgrind warning
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
521 desired->channels != audio->spec.channels ) { |
0defd90ef27c
Simplify code and clean up Valgrind warning
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
522 /* Build an audio conversion block */ |
0defd90ef27c
Simplify code and clean up Valgrind warning
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
523 if ( SDL_BuildAudioCVT(&audio->convert, |
0defd90ef27c
Simplify code and clean up Valgrind warning
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
524 desired->format, desired->channels, |
0defd90ef27c
Simplify code and clean up Valgrind warning
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
525 desired->freq, |
0defd90ef27c
Simplify code and clean up Valgrind warning
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
526 audio->spec.format, audio->spec.channels, |
0defd90ef27c
Simplify code and clean up Valgrind warning
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
527 audio->spec.freq) < 0 ) { |
0defd90ef27c
Simplify code and clean up Valgrind warning
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
528 SDL_CloseAudio(); |
0defd90ef27c
Simplify code and clean up Valgrind warning
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
529 return(-1); |
0 | 530 } |
808
0defd90ef27c
Simplify code and clean up Valgrind warning
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
531 if ( audio->convert.needed ) { |
3884
dba874934f0c
Fix for buffer overflow in audio code, when feeding a device that needs
Ryan C. Gordon <icculus@icculus.org>
parents:
3881
diff
changeset
|
532 audio->convert.len = (int) ( ((double) desired->size) / |
dba874934f0c
Fix for buffer overflow in audio code, when feeding a device that needs
Ryan C. Gordon <icculus@icculus.org>
parents:
3881
diff
changeset
|
533 audio->convert.len_ratio ); |
808
0defd90ef27c
Simplify code and clean up Valgrind warning
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
534 audio->convert.buf =(Uint8 *)SDL_AllocAudioMem( |
0defd90ef27c
Simplify code and clean up Valgrind warning
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
535 audio->convert.len*audio->convert.len_mult); |
0defd90ef27c
Simplify code and clean up Valgrind warning
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
536 if ( audio->convert.buf == NULL ) { |
0 | 537 SDL_CloseAudio(); |
808
0defd90ef27c
Simplify code and clean up Valgrind warning
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
538 SDL_OutOfMemory(); |
0 | 539 return(-1); |
540 } | |
541 } | |
542 } | |
543 | |
544 /* Start the audio thread if necessary */ | |
545 switch (audio->opened) { | |
546 case 1: | |
547 /* Start the audio thread */ | |
1402
d910939febfa
Use consistent identifiers for the various platforms we support.
Sam Lantinga <slouken@libsdl.org>
parents:
1379
diff
changeset
|
548 #if (defined(__WIN32__) && !defined(_WIN32_WCE)) && !defined(HAVE_LIBC) |
1330
450721ad5436
It's now possible to build SDL without any C runtime at all on Windows,
Sam Lantinga <slouken@libsdl.org>
parents:
1312
diff
changeset
|
549 #undef SDL_CreateThread |
450721ad5436
It's now possible to build SDL without any C runtime at all on Windows,
Sam Lantinga <slouken@libsdl.org>
parents:
1312
diff
changeset
|
550 audio->thread = SDL_CreateThread(SDL_RunAudio, audio, NULL, NULL); |
450721ad5436
It's now possible to build SDL without any C runtime at all on Windows,
Sam Lantinga <slouken@libsdl.org>
parents:
1312
diff
changeset
|
551 #else |
0 | 552 audio->thread = SDL_CreateThread(SDL_RunAudio, audio); |
1330
450721ad5436
It's now possible to build SDL without any C runtime at all on Windows,
Sam Lantinga <slouken@libsdl.org>
parents:
1312
diff
changeset
|
553 #endif |
0 | 554 if ( audio->thread == NULL ) { |
555 SDL_CloseAudio(); | |
556 SDL_SetError("Couldn't create audio thread"); | |
557 return(-1); | |
558 } | |
559 break; | |
560 | |
561 default: | |
562 /* The audio is now playing */ | |
563 break; | |
564 } | |
21
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
565 |
0 | 566 return(0); |
567 } | |
568 | |
569 SDL_audiostatus SDL_GetAudioStatus(void) | |
570 { | |
571 SDL_AudioDevice *audio = current_audio; | |
572 SDL_audiostatus status; | |
573 | |
574 status = SDL_AUDIO_STOPPED; | |
575 if ( audio && audio->enabled ) { | |
576 if ( audio->paused ) { | |
577 status = SDL_AUDIO_PAUSED; | |
578 } else { | |
579 status = SDL_AUDIO_PLAYING; | |
580 } | |
581 } | |
582 return(status); | |
583 } | |
584 | |
585 void SDL_PauseAudio (int pause_on) | |
586 { | |
587 SDL_AudioDevice *audio = current_audio; | |
588 | |
589 if ( audio ) { | |
590 audio->paused = pause_on; | |
591 } | |
592 } | |
593 | |
594 void SDL_LockAudio (void) | |
595 { | |
596 SDL_AudioDevice *audio = current_audio; | |
597 | |
598 /* 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
|
599 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
|
600 audio->LockAudio(audio); |
0 | 601 } |
602 } | |
603 | |
604 void SDL_UnlockAudio (void) | |
605 { | |
606 SDL_AudioDevice *audio = current_audio; | |
607 | |
608 /* 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
|
609 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
|
610 audio->UnlockAudio(audio); |
0 | 611 } |
612 } | |
613 | |
614 void SDL_CloseAudio (void) | |
615 { | |
616 SDL_QuitSubSystem(SDL_INIT_AUDIO); | |
617 } | |
618 | |
619 void SDL_AudioQuit(void) | |
620 { | |
621 SDL_AudioDevice *audio = current_audio; | |
622 | |
623 if ( audio ) { | |
624 audio->enabled = 0; | |
625 if ( audio->thread != NULL ) { | |
626 SDL_WaitThread(audio->thread, NULL); | |
627 } | |
628 if ( audio->mixer_lock != NULL ) { | |
629 SDL_DestroyMutex(audio->mixer_lock); | |
630 } | |
631 if ( audio->fake_stream != NULL ) { | |
632 SDL_FreeAudioMem(audio->fake_stream); | |
633 } | |
634 if ( audio->convert.needed ) { | |
635 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
|
636 |
0 | 637 } |
638 if ( audio->opened ) { | |
639 audio->CloseAudio(audio); | |
640 audio->opened = 0; | |
641 } | |
642 /* Free the driver data */ | |
643 audio->free(audio); | |
644 current_audio = NULL; | |
645 } | |
646 } | |
647 | |
648 #define NUM_FORMATS 6 | |
649 static int format_idx; | |
650 static int format_idx_sub; | |
651 static Uint16 format_list[NUM_FORMATS][NUM_FORMATS] = { | |
652 { AUDIO_U8, AUDIO_S8, AUDIO_S16LSB, AUDIO_S16MSB, AUDIO_U16LSB, AUDIO_U16MSB }, | |
653 { AUDIO_S8, AUDIO_U8, AUDIO_S16LSB, AUDIO_S16MSB, AUDIO_U16LSB, AUDIO_U16MSB }, | |
654 { AUDIO_S16LSB, AUDIO_S16MSB, AUDIO_U16LSB, AUDIO_U16MSB, AUDIO_U8, AUDIO_S8 }, | |
655 { AUDIO_S16MSB, AUDIO_S16LSB, AUDIO_U16MSB, AUDIO_U16LSB, AUDIO_U8, AUDIO_S8 }, | |
656 { AUDIO_U16LSB, AUDIO_U16MSB, AUDIO_S16LSB, AUDIO_S16MSB, AUDIO_U8, AUDIO_S8 }, | |
657 { AUDIO_U16MSB, AUDIO_U16LSB, AUDIO_S16MSB, AUDIO_S16LSB, AUDIO_U8, AUDIO_S8 }, | |
658 }; | |
659 | |
660 Uint16 SDL_FirstAudioFormat(Uint16 format) | |
661 { | |
662 for ( format_idx=0; format_idx < NUM_FORMATS; ++format_idx ) { | |
663 if ( format_list[format_idx][0] == format ) { | |
664 break; | |
665 } | |
666 } | |
667 format_idx_sub = 0; | |
668 return(SDL_NextAudioFormat()); | |
669 } | |
670 | |
671 Uint16 SDL_NextAudioFormat(void) | |
672 { | |
673 if ( (format_idx == NUM_FORMATS) || (format_idx_sub == NUM_FORMATS) ) { | |
674 return(0); | |
675 } | |
676 return(format_list[format_idx][format_idx_sub++]); | |
677 } | |
678 | |
679 void SDL_CalculateAudioSpec(SDL_AudioSpec *spec) | |
680 { | |
681 switch (spec->format) { | |
682 case AUDIO_U8: | |
683 spec->silence = 0x80; | |
684 break; | |
685 default: | |
686 spec->silence = 0x00; | |
687 break; | |
688 } | |
689 spec->size = (spec->format&0xFF)/8; | |
690 spec->size *= spec->channels; | |
691 spec->size *= spec->samples; | |
692 } |