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