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