Mercurial > sdl-ios-xcode
annotate src/audio/SDL_audio.c @ 4170:092c0bc69155 SDL-1.2
Fixed bug #618
Description From Tim Angus 2008-08-30 12:23:56 (-) [reply]
As we all know SDL 1.2 doesn't handle dead keys well since one key press
potentially equals two (or more) characters. For example, on many layouts,
keying <backquote>,<space> results in <no character>,<backquote><space>. Since
the unicode member of the SDL_keysym struct only has room for one character,
only one can be returned.
On Linux, the first character is returned. On Windows however, unless the exact
number of characters generated by the keypress is 1, nothing is returned. The
following patch addresses this inconsistency.
Updated patch which includes a further fix to the handling of the numpad when
numlock is on. This further fix is courtesy Amanieu d'Antras.
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Mon, 13 Apr 2009 08:42:09 +0000 |
parents | a1b03ba2fcd0 |
children | 12da7861173e |
rev | line source |
---|---|
0 | 1 /* |
2 SDL - Simple DirectMedia Layer | |
4159 | 3 Copyright (C) 1997-2009 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 |
3976
8582c6a5ca16
Added initial support for Nintendo DS, based on the work by Troy Davis (GPF)
Sam Lantinga <slouken@libsdl.org>
parents:
3975
diff
changeset
|
104 #if SDL_AUDIO_DRIVER_NDS |
8582c6a5ca16
Added initial support for Nintendo DS, based on the work by Troy Davis (GPF)
Sam Lantinga <slouken@libsdl.org>
parents:
3975
diff
changeset
|
105 &NDSAUD_bootstrap, |
8582c6a5ca16
Added initial support for Nintendo DS, based on the work by Troy Davis (GPF)
Sam Lantinga <slouken@libsdl.org>
parents:
3975
diff
changeset
|
106 #endif |
1361
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_MMEAUDIO |
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
108 &MMEAUDIO_bootstrap, |
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
109 #endif |
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
110 #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
|
111 &DART_bootstrap, |
1190 | 112 #endif |
3975 | 113 #if SDL_AUDIO_DRIVER_EPOCAUDIO |
114 &EPOCAudio_bootstrap, | |
115 #endif | |
0 | 116 NULL |
117 }; | |
118 SDL_AudioDevice *current_audio = NULL; | |
119 | |
120 /* Various local functions */ | |
121 int SDL_AudioInit(const char *driver_name); | |
122 void SDL_AudioQuit(void); | |
123 | |
124 /* The general mixing thread function */ | |
1769 | 125 int SDLCALL SDL_RunAudio(void *audiop) |
0 | 126 { |
127 SDL_AudioDevice *audio = (SDL_AudioDevice *)audiop; | |
128 Uint8 *stream; | |
129 int stream_len; | |
130 void *udata; | |
1769 | 131 void (SDLCALL *fill)(void *userdata,Uint8 *stream, int len); |
0 | 132 int silence; |
133 | |
134 /* Perform any thread setup */ | |
135 if ( audio->ThreadInit ) { | |
136 audio->ThreadInit(audio); | |
137 } | |
138 audio->threadid = SDL_ThreadID(); | |
139 | |
140 /* Set up the mixing function */ | |
141 fill = audio->spec.callback; | |
142 udata = audio->spec.userdata; | |
21
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
143 |
0 | 144 if ( audio->convert.needed ) { |
145 if ( audio->convert.src_format == AUDIO_U8 ) { | |
146 silence = 0x80; | |
147 } else { | |
148 silence = 0; | |
149 } | |
150 stream_len = audio->convert.len; | |
151 } else { | |
152 silence = audio->spec.silence; | |
153 stream_len = audio->spec.size; | |
154 } | |
1561
c724c4a99759
Try to fill the hardware audio buffer immediately.
Ryan C. Gordon <icculus@icculus.org>
parents:
1532
diff
changeset
|
155 |
1190 | 156 #ifdef __OS2__ |
1487
dc6b59e925a2
Cleaning up warnings on MacOS X
Sam Lantinga <slouken@libsdl.org>
parents:
1442
diff
changeset
|
157 /* 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
|
158 the audio will be continuous all the time! */ |
1190 | 159 #ifdef USE_DOSSETPRIORITY |
1442
e3242177fe4a
Updated OS/2 build, yay!
Sam Lantinga <slouken@libsdl.org>
parents:
1408
diff
changeset
|
160 if (SDL_getenv("SDL_USE_TIMECRITICAL_AUDIO")) |
e3242177fe4a
Updated OS/2 build, yay!
Sam Lantinga <slouken@libsdl.org>
parents:
1408
diff
changeset
|
161 { |
1190 | 162 #ifdef DEBUG_BUILD |
1442
e3242177fe4a
Updated OS/2 build, yay!
Sam Lantinga <slouken@libsdl.org>
parents:
1408
diff
changeset
|
163 printf("[SDL_RunAudio] : Setting priority to TimeCritical+0! (TID%d)\n", SDL_ThreadID()); |
1190 | 164 #endif |
1442
e3242177fe4a
Updated OS/2 build, yay!
Sam Lantinga <slouken@libsdl.org>
parents:
1408
diff
changeset
|
165 DosSetPriority(PRTYS_THREAD, PRTYC_TIMECRITICAL, 0, 0); |
e3242177fe4a
Updated OS/2 build, yay!
Sam Lantinga <slouken@libsdl.org>
parents:
1408
diff
changeset
|
166 } |
e3242177fe4a
Updated OS/2 build, yay!
Sam Lantinga <slouken@libsdl.org>
parents:
1408
diff
changeset
|
167 else |
e3242177fe4a
Updated OS/2 build, yay!
Sam Lantinga <slouken@libsdl.org>
parents:
1408
diff
changeset
|
168 { |
e3242177fe4a
Updated OS/2 build, yay!
Sam Lantinga <slouken@libsdl.org>
parents:
1408
diff
changeset
|
169 #ifdef DEBUG_BUILD |
e3242177fe4a
Updated OS/2 build, yay!
Sam Lantinga <slouken@libsdl.org>
parents:
1408
diff
changeset
|
170 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
|
171 #endif |
e3242177fe4a
Updated OS/2 build, yay!
Sam Lantinga <slouken@libsdl.org>
parents:
1408
diff
changeset
|
172 DosSetPriority(PRTYS_THREAD, PRTYC_FOREGROUNDSERVER, 0, 0); |
e3242177fe4a
Updated OS/2 build, yay!
Sam Lantinga <slouken@libsdl.org>
parents:
1408
diff
changeset
|
173 } |
1190 | 174 #endif |
175 #endif | |
21
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
176 |
0 | 177 /* Loop, filling the audio buffers */ |
178 while ( audio->enabled ) { | |
179 | |
180 /* Fill the current buffer with sound */ | |
181 if ( audio->convert.needed ) { | |
182 if ( audio->convert.buf ) { | |
183 stream = audio->convert.buf; | |
184 } else { | |
185 continue; | |
186 } | |
187 } else { | |
188 stream = audio->GetAudioBuf(audio); | |
189 if ( stream == NULL ) { | |
190 stream = audio->fake_stream; | |
191 } | |
192 } | |
4001
6831b8723a85
Don't initialize the audio buffer passed to the application's audio callback,
Ryan C. Gordon <icculus@icculus.org>
parents:
3976
diff
changeset
|
193 |
4024
000a99b4be87
Reverted patch in revision #3139, since it changes behaviour, which isn't good
Ryan C. Gordon <icculus@icculus.org>
parents:
4001
diff
changeset
|
194 SDL_memset(stream, silence, stream_len); |
0 | 195 |
196 if ( ! audio->paused ) { | |
197 SDL_mutexP(audio->mixer_lock); | |
198 (*fill)(udata, stream, stream_len); | |
199 SDL_mutexV(audio->mixer_lock); | |
200 } | |
201 | |
202 /* Convert the audio if necessary */ | |
203 if ( audio->convert.needed ) { | |
204 SDL_ConvertAudio(&audio->convert); | |
205 stream = audio->GetAudioBuf(audio); | |
206 if ( stream == NULL ) { | |
207 stream = audio->fake_stream; | |
208 } | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
209 SDL_memcpy(stream, audio->convert.buf, |
0 | 210 audio->convert.len_cvt); |
211 } | |
212 | |
213 /* Ready current buffer for play and change current buffer */ | |
214 if ( stream != audio->fake_stream ) { | |
215 audio->PlayAudio(audio); | |
1562 | 216 } |
217 | |
218 /* Wait for an audio buffer to become available */ | |
219 if ( stream == audio->fake_stream ) { | |
220 SDL_Delay((audio->spec.samples*1000)/audio->spec.freq); | |
221 } else { | |
222 audio->WaitAudio(audio); | |
0 | 223 } |
224 } | |
1562 | 225 |
0 | 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 |
1190 | 231 #ifdef __OS2__ |
232 #ifdef DEBUG_BUILD | |
233 printf("[SDL_RunAudio] : Task exiting. (TID%d)\n", SDL_ThreadID()); | |
234 #endif | |
235 #endif | |
0 | 236 return(0); |
237 } | |
238 | |
322
fd93a09655e3
The audio lock and unlock functions are now a part of the driver.
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
239 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
|
240 { |
fd93a09655e3
The audio lock and unlock functions are now a part of the driver.
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
241 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
|
242 return; |
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 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
|
245 } |
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 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
|
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 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
|
250 return; |
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 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
|
253 } |
fd93a09655e3
The audio lock and unlock functions are now a part of the driver.
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
254 |
1794 | 255 static Uint16 SDL_ParseAudioFormat(const char *string) |
256 { | |
257 Uint16 format = 0; | |
258 | |
259 switch (*string) { | |
260 case 'U': | |
261 ++string; | |
262 format |= 0x0000; | |
263 break; | |
264 case 'S': | |
265 ++string; | |
266 format |= 0x8000; | |
267 break; | |
268 default: | |
269 return 0; | |
270 } | |
271 switch (SDL_atoi(string)) { | |
272 case 8: | |
273 string += 1; | |
274 format |= 8; | |
275 break; | |
276 case 16: | |
277 string += 2; | |
278 format |= 16; | |
279 if ( SDL_strcmp(string, "LSB") == 0 | |
280 #if SDL_BYTEORDER == SDL_LIL_ENDIAN | |
281 || SDL_strcmp(string, "SYS") == 0 | |
282 #endif | |
283 ) { | |
284 format |= 0x0000; | |
285 } | |
286 if ( SDL_strcmp(string, "MSB") == 0 | |
287 #if SDL_BYTEORDER == SDL_BIG_ENDIAN | |
288 || SDL_strcmp(string, "SYS") == 0 | |
289 #endif | |
290 ) { | |
291 format |= 0x1000; | |
292 } | |
293 break; | |
294 default: | |
295 return 0; | |
296 } | |
297 return format; | |
298 } | |
299 | |
0 | 300 int SDL_AudioInit(const char *driver_name) |
301 { | |
302 SDL_AudioDevice *audio; | |
303 int i = 0, idx; | |
304 | |
305 /* Check to make sure we don't overwrite 'current_audio' */ | |
306 if ( current_audio != NULL ) { | |
307 SDL_AudioQuit(); | |
308 } | |
309 | |
310 /* Select the proper audio driver */ | |
311 audio = NULL; | |
312 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
|
313 #if SDL_AUDIO_DRIVER_ESD |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
314 if ( (driver_name == NULL) && (SDL_getenv("ESPEAKER") != NULL) ) { |
0 | 315 /* Ahem, we know that if ESPEAKER is set, user probably wants |
316 to use ESD, but don't start it if it's not already running. | |
317 This probably isn't the place to do this, but... Shh! :) | |
318 */ | |
319 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
|
320 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
|
321 #ifdef HAVE_PUTENV |
0 | 322 const char *esd_no_spawn; |
323 | |
324 /* 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
|
325 esd_no_spawn = getenv("ESD_NO_SPAWN"); |
0 | 326 if ( esd_no_spawn == NULL ) { |
327 putenv("ESD_NO_SPAWN=1"); | |
328 } | |
1341
d02b552e5304
Configure dynamically generates SDL_config.h
Sam Lantinga <slouken@libsdl.org>
parents:
1336
diff
changeset
|
329 #endif |
0 | 330 if ( bootstrap[i]->available() ) { |
331 audio = bootstrap[i]->create(0); | |
332 break; | |
333 } | |
1341
d02b552e5304
Configure dynamically generates SDL_config.h
Sam Lantinga <slouken@libsdl.org>
parents:
1336
diff
changeset
|
334 #ifdef HAVE_UNSETENV |
0 | 335 if ( esd_no_spawn == NULL ) { |
336 unsetenv("ESD_NO_SPAWN"); | |
337 } | |
338 #endif | |
339 } | |
340 } | |
341 } | |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
342 #endif /* SDL_AUDIO_DRIVER_ESD */ |
0 | 343 if ( audio == NULL ) { |
344 if ( driver_name != NULL ) { | |
345 #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
|
346 if ( SDL_strrchr(driver_name, ':') != NULL ) { |
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
347 idx = atoi(SDL_strrchr(driver_name, ':')+1); |
0 | 348 } |
349 #endif | |
350 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
|
351 if (SDL_strcasecmp(bootstrap[i]->name, driver_name) == 0) { |
0 | 352 if ( bootstrap[i]->available() ) { |
353 audio=bootstrap[i]->create(idx); | |
354 break; | |
355 } | |
356 } | |
357 } | |
358 } else { | |
359 for ( i=0; bootstrap[i]; ++i ) { | |
360 if ( bootstrap[i]->available() ) { | |
361 audio = bootstrap[i]->create(idx); | |
362 if ( audio != NULL ) { | |
363 break; | |
364 } | |
365 } | |
366 } | |
367 } | |
368 if ( audio == NULL ) { | |
369 SDL_SetError("No available audio device"); | |
370 #if 0 /* Don't fail SDL_Init() if audio isn't available. | |
371 SDL_OpenAudio() will handle it at that point. *sigh* | |
372 */ | |
373 return(-1); | |
374 #endif | |
375 } | |
376 } | |
377 current_audio = audio; | |
378 if ( current_audio ) { | |
379 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
|
380 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
|
381 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
|
382 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
|
383 } |
0 | 384 } |
385 return(0); | |
386 } | |
387 | |
388 char *SDL_AudioDriverName(char *namebuf, int maxlen) | |
389 { | |
390 if ( current_audio != NULL ) { | |
1379
c0a74f199ecf
Use only safe string functions
Sam Lantinga <slouken@libsdl.org>
parents:
1361
diff
changeset
|
391 SDL_strlcpy(namebuf, current_audio->name, maxlen); |
0 | 392 return(namebuf); |
393 } | |
394 return(NULL); | |
395 } | |
396 | |
397 int SDL_OpenAudio(SDL_AudioSpec *desired, SDL_AudioSpec *obtained) | |
398 { | |
399 SDL_AudioDevice *audio; | |
1794 | 400 const char *env; |
0 | 401 |
402 /* Start up the audio driver, if necessary */ | |
403 if ( ! current_audio ) { | |
404 if ( (SDL_InitSubSystem(SDL_INIT_AUDIO) < 0) || | |
405 (current_audio == NULL) ) { | |
406 return(-1); | |
407 } | |
408 } | |
409 audio = current_audio; | |
410 | |
262
ba5363e21df8
Don't allow multiple audio opens to succeed (until SDL 1.3)
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
411 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
|
412 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
|
413 return(-1); |
ba5363e21df8
Don't allow multiple audio opens to succeed (until SDL 1.3)
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
414 } |
ba5363e21df8
Don't allow multiple audio opens to succeed (until SDL 1.3)
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
415 |
0 | 416 /* Verify some parameters */ |
1794 | 417 if ( desired->freq == 0 ) { |
418 env = SDL_getenv("SDL_AUDIO_FREQUENCY"); | |
419 if ( env ) { | |
420 desired->freq = SDL_atoi(env); | |
421 } | |
422 } | |
423 if ( desired->freq == 0 ) { | |
424 /* Pick some default audio frequency */ | |
425 desired->freq = 22050; | |
426 } | |
427 if ( desired->format == 0 ) { | |
428 env = SDL_getenv("SDL_AUDIO_FORMAT"); | |
429 if ( env ) { | |
430 desired->format = SDL_ParseAudioFormat(env); | |
431 } | |
432 } | |
433 if ( desired->format == 0 ) { | |
434 /* Pick some default audio format */ | |
435 desired->format = AUDIO_S16; | |
436 } | |
437 if ( desired->channels == 0 ) { | |
438 env = SDL_getenv("SDL_AUDIO_CHANNELS"); | |
439 if ( env ) { | |
4044 | 440 desired->channels = (Uint8)SDL_atoi(env); |
1794 | 441 } |
442 } | |
443 if ( desired->channels == 0 ) { | |
444 /* Pick a default number of channels */ | |
445 desired->channels = 2; | |
0 | 446 } |
447 switch ( desired->channels ) { | |
448 case 1: /* Mono */ | |
449 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
|
450 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
|
451 case 6: /* surround with center and lfe */ |
0 | 452 break; |
453 default: | |
454 SDL_SetError("1 (mono) and 2 (stereo) channels supported"); | |
455 return(-1); | |
456 } | |
1794 | 457 if ( desired->samples == 0 ) { |
458 env = SDL_getenv("SDL_AUDIO_SAMPLES"); | |
459 if ( env ) { | |
4044 | 460 desired->samples = (Uint16)SDL_atoi(env); |
1794 | 461 } |
462 } | |
463 if ( desired->samples == 0 ) { | |
464 /* Pick a default of ~46 ms at desired frequency */ | |
465 int samples = (desired->freq / 1000) * 46; | |
466 int power2 = 1; | |
467 while ( power2 < samples ) { | |
468 power2 *= 2; | |
469 } | |
470 desired->samples = power2; | |
471 } | |
472 if ( desired->callback == NULL ) { | |
473 SDL_SetError("SDL_OpenAudio() passed a NULL callback"); | |
474 return(-1); | |
475 } | |
0 | 476 |
3976
8582c6a5ca16
Added initial support for Nintendo DS, based on the work by Troy Davis (GPF)
Sam Lantinga <slouken@libsdl.org>
parents:
3975
diff
changeset
|
477 #if SDL_THREADS_DISABLED |
398
d219b0e02f5f
Added Atari audio support (thanks Patrice!)
Sam Lantinga <slouken@libsdl.org>
parents:
322
diff
changeset
|
478 /* Uses interrupt driven audio, without thread */ |
d219b0e02f5f
Added Atari audio support (thanks Patrice!)
Sam Lantinga <slouken@libsdl.org>
parents:
322
diff
changeset
|
479 #else |
0 | 480 /* Create a semaphore for locking the sound buffers */ |
481 audio->mixer_lock = SDL_CreateMutex(); | |
482 if ( audio->mixer_lock == NULL ) { | |
483 SDL_SetError("Couldn't create mixer lock"); | |
484 SDL_CloseAudio(); | |
485 return(-1); | |
486 } | |
3976
8582c6a5ca16
Added initial support for Nintendo DS, based on the work by Troy Davis (GPF)
Sam Lantinga <slouken@libsdl.org>
parents:
3975
diff
changeset
|
487 #endif /* SDL_THREADS_DISABLED */ |
0 | 488 |
489 /* Calculate the silence and size of the audio specification */ | |
490 SDL_CalculateAudioSpec(desired); | |
491 | |
492 /* Open the audio subsystem */ | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
493 SDL_memcpy(&audio->spec, desired, sizeof(audio->spec)); |
0 | 494 audio->convert.needed = 0; |
495 audio->enabled = 1; | |
496 audio->paused = 1; | |
21
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
497 |
0 | 498 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
|
499 |
0 | 500 if ( ! audio->opened ) { |
501 SDL_CloseAudio(); | |
502 return(-1); | |
503 } | |
504 | |
505 /* If the audio driver changes the buffer size, accept it */ | |
506 if ( audio->spec.samples != desired->samples ) { | |
507 desired->samples = audio->spec.samples; | |
508 SDL_CalculateAudioSpec(desired); | |
509 } | |
510 | |
511 /* Allocate a fake audio memory buffer */ | |
512 audio->fake_stream = SDL_AllocAudioMem(audio->spec.size); | |
513 if ( audio->fake_stream == NULL ) { | |
514 SDL_CloseAudio(); | |
515 SDL_OutOfMemory(); | |
516 return(-1); | |
517 } | |
518 | |
519 /* 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
|
520 if ( obtained != NULL ) { |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
521 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
|
522 } else if ( desired->freq != audio->spec.freq || |
0defd90ef27c
Simplify code and clean up Valgrind warning
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
523 desired->format != audio->spec.format || |
0defd90ef27c
Simplify code and clean up Valgrind warning
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
524 desired->channels != audio->spec.channels ) { |
0defd90ef27c
Simplify code and clean up Valgrind warning
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
525 /* Build an audio conversion block */ |
0defd90ef27c
Simplify code and clean up Valgrind warning
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
526 if ( SDL_BuildAudioCVT(&audio->convert, |
0defd90ef27c
Simplify code and clean up Valgrind warning
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
527 desired->format, desired->channels, |
0defd90ef27c
Simplify code and clean up Valgrind warning
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
528 desired->freq, |
0defd90ef27c
Simplify code and clean up Valgrind warning
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
529 audio->spec.format, audio->spec.channels, |
0defd90ef27c
Simplify code and clean up Valgrind warning
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
530 audio->spec.freq) < 0 ) { |
0defd90ef27c
Simplify code and clean up Valgrind warning
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
531 SDL_CloseAudio(); |
0defd90ef27c
Simplify code and clean up Valgrind warning
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
532 return(-1); |
0 | 533 } |
808
0defd90ef27c
Simplify code and clean up Valgrind warning
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
534 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
|
535 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
|
536 audio->convert.len_ratio ); |
808
0defd90ef27c
Simplify code and clean up Valgrind warning
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
537 audio->convert.buf =(Uint8 *)SDL_AllocAudioMem( |
0defd90ef27c
Simplify code and clean up Valgrind warning
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
538 audio->convert.len*audio->convert.len_mult); |
0defd90ef27c
Simplify code and clean up Valgrind warning
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
539 if ( audio->convert.buf == NULL ) { |
0 | 540 SDL_CloseAudio(); |
808
0defd90ef27c
Simplify code and clean up Valgrind warning
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
541 SDL_OutOfMemory(); |
0 | 542 return(-1); |
543 } | |
544 } | |
545 } | |
546 | |
547 /* Start the audio thread if necessary */ | |
548 switch (audio->opened) { | |
549 case 1: | |
550 /* Start the audio thread */ | |
3975 | 551 #if (defined(__WIN32__) && !defined(_WIN32_WCE)) && !defined(HAVE_LIBC) && !defined(__SYMBIAN32__) |
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
|
552 #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
|
553 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
|
554 #else |
0 | 555 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
|
556 #endif |
0 | 557 if ( audio->thread == NULL ) { |
558 SDL_CloseAudio(); | |
559 SDL_SetError("Couldn't create audio thread"); | |
560 return(-1); | |
561 } | |
562 break; | |
563 | |
564 default: | |
565 /* The audio is now playing */ | |
566 break; | |
567 } | |
21
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
568 |
0 | 569 return(0); |
570 } | |
571 | |
572 SDL_audiostatus SDL_GetAudioStatus(void) | |
573 { | |
574 SDL_AudioDevice *audio = current_audio; | |
575 SDL_audiostatus status; | |
576 | |
577 status = SDL_AUDIO_STOPPED; | |
578 if ( audio && audio->enabled ) { | |
579 if ( audio->paused ) { | |
580 status = SDL_AUDIO_PAUSED; | |
581 } else { | |
582 status = SDL_AUDIO_PLAYING; | |
583 } | |
584 } | |
585 return(status); | |
586 } | |
587 | |
588 void SDL_PauseAudio (int pause_on) | |
589 { | |
590 SDL_AudioDevice *audio = current_audio; | |
591 | |
592 if ( audio ) { | |
593 audio->paused = pause_on; | |
594 } | |
595 } | |
596 | |
597 void SDL_LockAudio (void) | |
598 { | |
599 SDL_AudioDevice *audio = current_audio; | |
600 | |
601 /* 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
|
602 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
|
603 audio->LockAudio(audio); |
0 | 604 } |
605 } | |
606 | |
607 void SDL_UnlockAudio (void) | |
608 { | |
609 SDL_AudioDevice *audio = current_audio; | |
610 | |
611 /* 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
|
612 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
|
613 audio->UnlockAudio(audio); |
0 | 614 } |
615 } | |
616 | |
617 void SDL_CloseAudio (void) | |
618 { | |
619 SDL_QuitSubSystem(SDL_INIT_AUDIO); | |
620 } | |
621 | |
622 void SDL_AudioQuit(void) | |
623 { | |
624 SDL_AudioDevice *audio = current_audio; | |
625 | |
626 if ( audio ) { | |
627 audio->enabled = 0; | |
628 if ( audio->thread != NULL ) { | |
629 SDL_WaitThread(audio->thread, NULL); | |
630 } | |
631 if ( audio->mixer_lock != NULL ) { | |
632 SDL_DestroyMutex(audio->mixer_lock); | |
633 } | |
634 if ( audio->fake_stream != NULL ) { | |
635 SDL_FreeAudioMem(audio->fake_stream); | |
636 } | |
637 if ( audio->convert.needed ) { | |
638 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
|
639 |
0 | 640 } |
641 if ( audio->opened ) { | |
642 audio->CloseAudio(audio); | |
643 audio->opened = 0; | |
644 } | |
645 /* Free the driver data */ | |
646 audio->free(audio); | |
647 current_audio = NULL; | |
648 } | |
649 } | |
650 | |
651 #define NUM_FORMATS 6 | |
652 static int format_idx; | |
653 static int format_idx_sub; | |
654 static Uint16 format_list[NUM_FORMATS][NUM_FORMATS] = { | |
655 { AUDIO_U8, AUDIO_S8, AUDIO_S16LSB, AUDIO_S16MSB, AUDIO_U16LSB, AUDIO_U16MSB }, | |
656 { AUDIO_S8, AUDIO_U8, AUDIO_S16LSB, AUDIO_S16MSB, AUDIO_U16LSB, AUDIO_U16MSB }, | |
657 { AUDIO_S16LSB, AUDIO_S16MSB, AUDIO_U16LSB, AUDIO_U16MSB, AUDIO_U8, AUDIO_S8 }, | |
658 { AUDIO_S16MSB, AUDIO_S16LSB, AUDIO_U16MSB, AUDIO_U16LSB, AUDIO_U8, AUDIO_S8 }, | |
659 { AUDIO_U16LSB, AUDIO_U16MSB, AUDIO_S16LSB, AUDIO_S16MSB, AUDIO_U8, AUDIO_S8 }, | |
660 { AUDIO_U16MSB, AUDIO_U16LSB, AUDIO_S16MSB, AUDIO_S16LSB, AUDIO_U8, AUDIO_S8 }, | |
661 }; | |
662 | |
663 Uint16 SDL_FirstAudioFormat(Uint16 format) | |
664 { | |
665 for ( format_idx=0; format_idx < NUM_FORMATS; ++format_idx ) { | |
666 if ( format_list[format_idx][0] == format ) { | |
667 break; | |
668 } | |
669 } | |
670 format_idx_sub = 0; | |
671 return(SDL_NextAudioFormat()); | |
672 } | |
673 | |
674 Uint16 SDL_NextAudioFormat(void) | |
675 { | |
676 if ( (format_idx == NUM_FORMATS) || (format_idx_sub == NUM_FORMATS) ) { | |
677 return(0); | |
678 } | |
679 return(format_list[format_idx][format_idx_sub++]); | |
680 } | |
681 | |
682 void SDL_CalculateAudioSpec(SDL_AudioSpec *spec) | |
683 { | |
684 switch (spec->format) { | |
685 case AUDIO_U8: | |
686 spec->silence = 0x80; | |
687 break; | |
688 default: | |
689 spec->silence = 0x00; | |
690 break; | |
691 } | |
692 spec->size = (spec->format&0xFF)/8; | |
693 spec->size *= spec->channels; | |
694 spec->size *= spec->samples; | |
695 } |