Mercurial > sdl-ios-xcode
annotate src/audio/SDL_audio.c @ 885:9f6ad2286011
Date: Wed, 28 Apr 2004 16:52:41 -0400
From: "Damien A"
Subject: testdyngl fix
The test program you included in the latest version of SDL crashes on startup in Window (XP). The reason for this is that OpenGL functions on Windows use the __stdcall calling convention, not the C convention. Placing APIENTRY infront of the * operator solves this problem.
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Fri, 30 Apr 2004 18:33:30 +0000 |
parents | 0defd90ef27c |
children | f8d5ddc7aef1 |
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 | |
41 /* Available audio drivers */ | |
42 static AudioBootStrap *bootstrap[] = { | |
121
43febd46d49d
Name changed from OBSD to OPENBSD_AUDIO
Sam Lantinga <slouken@libsdl.org>
parents:
94
diff
changeset
|
43 #ifdef OPENBSD_AUDIO_SUPPORT |
43febd46d49d
Name changed from OBSD to OPENBSD_AUDIO
Sam Lantinga <slouken@libsdl.org>
parents:
94
diff
changeset
|
44 &OPENBSD_AUDIO_bootstrap, |
94
ae6e6b73333f
Cleaned up the OpenBSD port, thanks to Peter Valchev
Sam Lantinga <slouken@lokigames.com>
parents:
68
diff
changeset
|
45 #endif |
0 | 46 #ifdef OSS_SUPPORT |
47 &DSP_bootstrap, | |
48 &DMA_bootstrap, | |
49 #endif | |
50 #ifdef ALSA_SUPPORT | |
51 &ALSA_bootstrap, | |
52 #endif | |
663
8bedd6d61642
Date: Sat, 2 Aug 2003 16:22:51 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
654
diff
changeset
|
53 #ifdef QNXNTOAUDIO_SUPPORT |
8bedd6d61642
Date: Sat, 2 Aug 2003 16:22:51 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
654
diff
changeset
|
54 &QNXNTOAUDIO_bootstrap, |
8bedd6d61642
Date: Sat, 2 Aug 2003 16:22:51 +0300
Sam Lantinga <slouken@libsdl.org>
parents:
654
diff
changeset
|
55 #endif |
148
8758b8d42cd9
Audio subsystem no longer assumes sun audio API on UNIX systems
Sam Lantinga <slouken@libsdl.org>
parents:
121
diff
changeset
|
56 #ifdef SUNAUDIO_SUPPORT |
8758b8d42cd9
Audio subsystem no longer assumes sun audio API on UNIX systems
Sam Lantinga <slouken@libsdl.org>
parents:
121
diff
changeset
|
57 &SUNAUDIO_bootstrap, |
8758b8d42cd9
Audio subsystem no longer assumes sun audio API on UNIX systems
Sam Lantinga <slouken@libsdl.org>
parents:
121
diff
changeset
|
58 #endif |
8758b8d42cd9
Audio subsystem no longer assumes sun audio API on UNIX systems
Sam Lantinga <slouken@libsdl.org>
parents:
121
diff
changeset
|
59 #ifdef DMEDIA_SUPPORT |
8758b8d42cd9
Audio subsystem no longer assumes sun audio API on UNIX systems
Sam Lantinga <slouken@libsdl.org>
parents:
121
diff
changeset
|
60 &DMEDIA_bootstrap, |
35
d3bc792e136d
Added detection of Open Sound System on Solaris x86
Sam Lantinga <slouken@lokigames.com>
parents:
21
diff
changeset
|
61 #endif |
0 | 62 #ifdef ARTSC_SUPPORT |
63 &ARTSC_bootstrap, | |
64 #endif | |
65 #ifdef ESD_SUPPORT | |
66 &ESD_bootstrap, | |
67 #endif | |
68 #ifdef NAS_SUPPORT | |
69 &NAS_bootstrap, | |
70 #endif | |
71 #ifdef ENABLE_DIRECTX | |
72 &DSOUND_bootstrap, | |
73 #endif | |
74 #ifdef ENABLE_WINDIB | |
75 &WAVEOUT_bootstrap, | |
76 #endif | |
77 #ifdef __BEOS__ | |
78 &BAUDIO_bootstrap, | |
79 #endif | |
80 #if defined(macintosh) || TARGET_API_MAC_CARBON | |
81 &SNDMGR_bootstrap, | |
82 #endif | |
83 #ifdef _AIX | |
84 &Paud_bootstrap, | |
85 #endif | |
21
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
86 #ifdef ENABLE_AHI |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
87 &AHI_bootstrap, |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
88 #endif |
654
e92bcf2573cb
Added audio and CD-ROM support for OSF/Tru64 (thanks Hayashi!)
Sam Lantinga <slouken@libsdl.org>
parents:
644
diff
changeset
|
89 #ifdef MMEAUDIO_SUPPORT |
e92bcf2573cb
Added audio and CD-ROM support for OSF/Tru64 (thanks Hayashi!)
Sam Lantinga <slouken@libsdl.org>
parents:
644
diff
changeset
|
90 &MMEAUDIO_bootstrap, |
e92bcf2573cb
Added audio and CD-ROM support for OSF/Tru64 (thanks Hayashi!)
Sam Lantinga <slouken@libsdl.org>
parents:
644
diff
changeset
|
91 #endif |
398
d219b0e02f5f
Added Atari audio support (thanks Patrice!)
Sam Lantinga <slouken@libsdl.org>
parents:
322
diff
changeset
|
92 #ifdef MINTAUDIO_SUPPORT |
644
594422ab8f9f
Atari MiNT: added more audio drivers
Patrice Mandin <patmandin@gmail.com>
parents:
630
diff
changeset
|
93 &MINTAUDIO_GSXB_bootstrap, |
594422ab8f9f
Atari MiNT: added more audio drivers
Patrice Mandin <patmandin@gmail.com>
parents:
630
diff
changeset
|
94 &MINTAUDIO_MCSN_bootstrap, |
594422ab8f9f
Atari MiNT: added more audio drivers
Patrice Mandin <patmandin@gmail.com>
parents:
630
diff
changeset
|
95 &MINTAUDIO_STFA_bootstrap, |
594422ab8f9f
Atari MiNT: added more audio drivers
Patrice Mandin <patmandin@gmail.com>
parents:
630
diff
changeset
|
96 &MINTAUDIO_XBIOS_bootstrap, |
594422ab8f9f
Atari MiNT: added more audio drivers
Patrice Mandin <patmandin@gmail.com>
parents:
630
diff
changeset
|
97 &MINTAUDIO_DMA8_bootstrap, |
398
d219b0e02f5f
Added Atari audio support (thanks Patrice!)
Sam Lantinga <slouken@libsdl.org>
parents:
322
diff
changeset
|
98 #endif |
68
ac6645260d31
Added an audio driver that writes to disk (thanks Ryan!)
Sam Lantinga <slouken@lokigames.com>
parents:
38
diff
changeset
|
99 #ifdef DISKAUD_SUPPORT |
ac6645260d31
Added an audio driver that writes to disk (thanks Ryan!)
Sam Lantinga <slouken@lokigames.com>
parents:
38
diff
changeset
|
100 &DISKAUD_bootstrap, |
ac6645260d31
Added an audio driver that writes to disk (thanks Ryan!)
Sam Lantinga <slouken@lokigames.com>
parents:
38
diff
changeset
|
101 #endif |
509
dad72daf44b3
Added initial support for Dreamcast (thanks HERO!)
Sam Lantinga <slouken@libsdl.org>
parents:
398
diff
changeset
|
102 #ifdef ENABLE_DC |
dad72daf44b3
Added initial support for Dreamcast (thanks HERO!)
Sam Lantinga <slouken@libsdl.org>
parents:
398
diff
changeset
|
103 &DCAUD_bootstrap, |
dad72daf44b3
Added initial support for Dreamcast (thanks HERO!)
Sam Lantinga <slouken@libsdl.org>
parents:
398
diff
changeset
|
104 #endif |
630
550bccdf04bd
Added initial support for RISC OS (thanks Peter Naulls!)
Sam Lantinga <slouken@libsdl.org>
parents:
509
diff
changeset
|
105 #ifdef DRENDERER_SUPPORT |
550bccdf04bd
Added initial support for RISC OS (thanks Peter Naulls!)
Sam Lantinga <slouken@libsdl.org>
parents:
509
diff
changeset
|
106 &DRENDERER_bootstrap, |
550bccdf04bd
Added initial support for RISC OS (thanks Peter Naulls!)
Sam Lantinga <slouken@libsdl.org>
parents:
509
diff
changeset
|
107 #endif |
0 | 108 NULL |
109 }; | |
110 SDL_AudioDevice *current_audio = NULL; | |
111 | |
112 /* Various local functions */ | |
113 int SDL_AudioInit(const char *driver_name); | |
114 void SDL_AudioQuit(void); | |
115 | |
21
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
116 #ifdef ENABLE_AHI |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
117 static int audio_configured = 0; |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
118 #endif |
0 | 119 |
120 /* The general mixing thread function */ | |
121 int SDL_RunAudio(void *audiop) | |
122 { | |
123 SDL_AudioDevice *audio = (SDL_AudioDevice *)audiop; | |
124 Uint8 *stream; | |
125 int stream_len; | |
126 void *udata; | |
127 void (*fill)(void *userdata,Uint8 *stream, int len); | |
128 int silence; | |
21
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
129 #ifdef ENABLE_AHI |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
130 int started = 0; |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
131 |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
132 /* 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
|
133 |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
134 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
|
135 |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
136 D(bug("Before Openaudio...")); |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
137 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
|
138 { |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
139 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
|
140 return(-1); |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
141 } |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
142 D(bug("OpenAudio...OK\n")); |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
143 #endif |
0 | 144 |
145 /* Perform any thread setup */ | |
146 if ( audio->ThreadInit ) { | |
147 audio->ThreadInit(audio); | |
148 } | |
149 audio->threadid = SDL_ThreadID(); | |
150 | |
151 /* Set up the mixing function */ | |
152 fill = audio->spec.callback; | |
153 udata = audio->spec.userdata; | |
21
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
154 |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
155 #ifdef ENABLE_AHI |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
156 audio_configured = 1; |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
157 |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
158 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
|
159 SDL_mutexP(audio->mixer_lock); |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
160 D(bug("Semaphore obtained...\n")); |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
161 #endif |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
162 |
0 | 163 if ( audio->convert.needed ) { |
164 if ( audio->convert.src_format == AUDIO_U8 ) { | |
165 silence = 0x80; | |
166 } else { | |
167 silence = 0; | |
168 } | |
169 stream_len = audio->convert.len; | |
170 } else { | |
171 silence = audio->spec.silence; | |
172 stream_len = audio->spec.size; | |
173 } | |
174 stream = audio->fake_stream; | |
175 | |
21
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
176 #ifdef ENABLE_AHI |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
177 SDL_mutexV(audio->mixer_lock); |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
178 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
|
179 #endif |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
180 |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
181 |
0 | 182 /* Loop, filling the audio buffers */ |
183 while ( audio->enabled ) { | |
184 | |
185 /* Wait for new current buffer to finish playing */ | |
186 if ( stream == audio->fake_stream ) { | |
187 SDL_Delay((audio->spec.samples*1000)/audio->spec.freq); | |
188 } else { | |
21
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
189 #ifdef ENABLE_AHI |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
190 if ( started > 1 ) |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
191 #endif |
0 | 192 audio->WaitAudio(audio); |
193 } | |
194 | |
195 /* Fill the current buffer with sound */ | |
196 if ( audio->convert.needed ) { | |
197 if ( audio->convert.buf ) { | |
198 stream = audio->convert.buf; | |
199 } else { | |
200 continue; | |
201 } | |
202 } else { | |
203 stream = audio->GetAudioBuf(audio); | |
204 if ( stream == NULL ) { | |
205 stream = audio->fake_stream; | |
206 } | |
207 } | |
208 memset(stream, silence, stream_len); | |
209 | |
210 if ( ! audio->paused ) { | |
211 SDL_mutexP(audio->mixer_lock); | |
212 (*fill)(udata, stream, stream_len); | |
213 SDL_mutexV(audio->mixer_lock); | |
214 } | |
215 | |
216 /* Convert the audio if necessary */ | |
217 if ( audio->convert.needed ) { | |
218 SDL_ConvertAudio(&audio->convert); | |
219 stream = audio->GetAudioBuf(audio); | |
220 if ( stream == NULL ) { | |
221 stream = audio->fake_stream; | |
222 } | |
223 memcpy(stream, audio->convert.buf, | |
224 audio->convert.len_cvt); | |
225 } | |
226 | |
227 /* Ready current buffer for play and change current buffer */ | |
228 if ( stream != audio->fake_stream ) { | |
229 audio->PlayAudio(audio); | |
21
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
230 #ifdef ENABLE_AHI |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
231 /* 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
|
232 started++; |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
233 #endif |
0 | 234 } |
235 } | |
236 /* Wait for the audio to drain.. */ | |
237 if ( audio->WaitDone ) { | |
238 audio->WaitDone(audio); | |
239 } | |
21
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
240 |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
241 #ifdef ENABLE_AHI |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
242 D(bug("WaitAudio...Done\n")); |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
243 |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
244 audio->CloseAudio(audio); |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
245 |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
246 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
|
247 audio_configured = 0; |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
248 #endif |
0 | 249 return(0); |
250 } | |
251 | |
322
fd93a09655e3
The audio lock and unlock functions are now a part of the driver.
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
252 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
|
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 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
|
255 return; |
fd93a09655e3
The audio lock and unlock functions are now a part of the driver.
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
256 } |
fd93a09655e3
The audio lock and unlock functions are now a part of the driver.
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
257 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
|
258 } |
fd93a09655e3
The audio lock and unlock functions are now a part of the driver.
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
259 |
fd93a09655e3
The audio lock and unlock functions are now a part of the driver.
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
260 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
|
261 { |
fd93a09655e3
The audio lock and unlock functions are now a part of the driver.
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
262 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
|
263 return; |
fd93a09655e3
The audio lock and unlock functions are now a part of the driver.
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
264 } |
fd93a09655e3
The audio lock and unlock functions are now a part of the driver.
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
265 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
|
266 } |
fd93a09655e3
The audio lock and unlock functions are now a part of the driver.
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
267 |
0 | 268 int SDL_AudioInit(const char *driver_name) |
269 { | |
270 SDL_AudioDevice *audio; | |
271 int i = 0, idx; | |
272 | |
273 /* Check to make sure we don't overwrite 'current_audio' */ | |
274 if ( current_audio != NULL ) { | |
275 SDL_AudioQuit(); | |
276 } | |
277 | |
278 /* Select the proper audio driver */ | |
279 audio = NULL; | |
280 idx = 0; | |
281 #ifdef unix | |
282 if ( (driver_name == NULL) && (getenv("ESPEAKER") != NULL) ) { | |
283 /* Ahem, we know that if ESPEAKER is set, user probably wants | |
284 to use ESD, but don't start it if it's not already running. | |
285 This probably isn't the place to do this, but... Shh! :) | |
286 */ | |
287 for ( i=0; bootstrap[i]; ++i ) { | |
288 if ( strcmp(bootstrap[i]->name, "esd") == 0 ) { | |
289 const char *esd_no_spawn; | |
290 | |
291 /* Don't start ESD if it's not running */ | |
292 esd_no_spawn = getenv("ESD_NO_SPAWN"); | |
293 if ( esd_no_spawn == NULL ) { | |
294 putenv("ESD_NO_SPAWN=1"); | |
295 } | |
296 if ( bootstrap[i]->available() ) { | |
297 audio = bootstrap[i]->create(0); | |
298 break; | |
299 } | |
300 #ifdef linux /* No unsetenv() on most platforms */ | |
301 if ( esd_no_spawn == NULL ) { | |
302 unsetenv("ESD_NO_SPAWN"); | |
303 } | |
304 #endif | |
305 } | |
306 } | |
307 } | |
308 #endif /* unix */ | |
309 if ( audio == NULL ) { | |
310 if ( driver_name != NULL ) { | |
311 #if 0 /* This will be replaced with a better driver selection API */ | |
312 if ( strrchr(driver_name, ':') != NULL ) { | |
313 idx = atoi(strrchr(driver_name, ':')+1); | |
314 } | |
315 #endif | |
316 for ( i=0; bootstrap[i]; ++i ) { | |
317 if (strncmp(bootstrap[i]->name, driver_name, | |
318 strlen(bootstrap[i]->name)) == 0) { | |
319 if ( bootstrap[i]->available() ) { | |
320 audio=bootstrap[i]->create(idx); | |
321 break; | |
322 } | |
323 } | |
324 } | |
325 } else { | |
326 for ( i=0; bootstrap[i]; ++i ) { | |
327 if ( bootstrap[i]->available() ) { | |
328 audio = bootstrap[i]->create(idx); | |
329 if ( audio != NULL ) { | |
330 break; | |
331 } | |
332 } | |
333 } | |
334 } | |
335 if ( audio == NULL ) { | |
336 SDL_SetError("No available audio device"); | |
337 #if 0 /* Don't fail SDL_Init() if audio isn't available. | |
338 SDL_OpenAudio() will handle it at that point. *sigh* | |
339 */ | |
340 return(-1); | |
341 #endif | |
342 } | |
343 } | |
344 current_audio = audio; | |
345 if ( current_audio ) { | |
346 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
|
347 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
|
348 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
|
349 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
|
350 } |
0 | 351 } |
352 return(0); | |
353 } | |
354 | |
355 char *SDL_AudioDriverName(char *namebuf, int maxlen) | |
356 { | |
357 if ( current_audio != NULL ) { | |
358 strncpy(namebuf, current_audio->name, maxlen-1); | |
359 namebuf[maxlen-1] = '\0'; | |
360 return(namebuf); | |
361 } | |
362 return(NULL); | |
363 } | |
364 | |
365 int SDL_OpenAudio(SDL_AudioSpec *desired, SDL_AudioSpec *obtained) | |
366 { | |
367 SDL_AudioDevice *audio; | |
368 | |
369 /* Start up the audio driver, if necessary */ | |
370 if ( ! current_audio ) { | |
371 if ( (SDL_InitSubSystem(SDL_INIT_AUDIO) < 0) || | |
372 (current_audio == NULL) ) { | |
373 return(-1); | |
374 } | |
375 } | |
376 audio = current_audio; | |
377 | |
262
ba5363e21df8
Don't allow multiple audio opens to succeed (until SDL 1.3)
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
378 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
|
379 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
|
380 return(-1); |
ba5363e21df8
Don't allow multiple audio opens to succeed (until SDL 1.3)
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
381 } |
ba5363e21df8
Don't allow multiple audio opens to succeed (until SDL 1.3)
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
382 |
0 | 383 /* Verify some parameters */ |
384 if ( desired->callback == NULL ) { | |
385 SDL_SetError("SDL_OpenAudio() passed a NULL callback"); | |
386 return(-1); | |
387 } | |
388 switch ( desired->channels ) { | |
389 case 1: /* Mono */ | |
390 case 2: /* Stereo */ | |
391 break; | |
392 default: | |
393 SDL_SetError("1 (mono) and 2 (stereo) channels supported"); | |
394 return(-1); | |
395 } | |
396 | |
630
550bccdf04bd
Added initial support for RISC OS (thanks Peter Naulls!)
Sam Lantinga <slouken@libsdl.org>
parents:
509
diff
changeset
|
397 #if defined(macintosh) || defined(__riscos__) |
0 | 398 /* FIXME: Need to implement PPC interrupt asm for SDL_LockAudio() */ |
399 #else | |
398
d219b0e02f5f
Added Atari audio support (thanks Patrice!)
Sam Lantinga <slouken@libsdl.org>
parents:
322
diff
changeset
|
400 #if defined(__MINT__) && !defined(ENABLE_THREADS) |
d219b0e02f5f
Added Atari audio support (thanks Patrice!)
Sam Lantinga <slouken@libsdl.org>
parents:
322
diff
changeset
|
401 /* Uses interrupt driven audio, without thread */ |
d219b0e02f5f
Added Atari audio support (thanks Patrice!)
Sam Lantinga <slouken@libsdl.org>
parents:
322
diff
changeset
|
402 #else |
0 | 403 /* Create a semaphore for locking the sound buffers */ |
404 audio->mixer_lock = SDL_CreateMutex(); | |
405 if ( audio->mixer_lock == NULL ) { | |
406 SDL_SetError("Couldn't create mixer lock"); | |
407 SDL_CloseAudio(); | |
408 return(-1); | |
409 } | |
398
d219b0e02f5f
Added Atari audio support (thanks Patrice!)
Sam Lantinga <slouken@libsdl.org>
parents:
322
diff
changeset
|
410 #endif /* __MINT__ */ |
d219b0e02f5f
Added Atari audio support (thanks Patrice!)
Sam Lantinga <slouken@libsdl.org>
parents:
322
diff
changeset
|
411 #endif /* macintosh */ |
0 | 412 |
413 /* Calculate the silence and size of the audio specification */ | |
414 SDL_CalculateAudioSpec(desired); | |
415 | |
416 /* Open the audio subsystem */ | |
417 memcpy(&audio->spec, desired, sizeof(audio->spec)); | |
418 audio->convert.needed = 0; | |
419 audio->enabled = 1; | |
420 audio->paused = 1; | |
21
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
421 |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
422 #ifndef ENABLE_AHI |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
423 |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
424 /* AmigaOS opens audio inside the main loop */ |
0 | 425 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
|
426 |
0 | 427 if ( ! audio->opened ) { |
428 SDL_CloseAudio(); | |
429 return(-1); | |
430 } | |
21
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
431 #else |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
432 D(bug("Locking semaphore...")); |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
433 SDL_mutexP(audio->mixer_lock); |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
434 |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
435 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
|
436 D(bug("Created thread...\n")); |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
437 |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
438 if ( audio->thread == NULL ) { |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
439 SDL_mutexV(audio->mixer_lock); |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
440 SDL_CloseAudio(); |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
441 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
|
442 return(-1); |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
443 } |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
444 |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
445 while(!audio_configured) |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
446 SDL_Delay(100); |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
447 #endif |
0 | 448 |
449 /* If the audio driver changes the buffer size, accept it */ | |
450 if ( audio->spec.samples != desired->samples ) { | |
451 desired->samples = audio->spec.samples; | |
452 SDL_CalculateAudioSpec(desired); | |
453 } | |
454 | |
455 /* Allocate a fake audio memory buffer */ | |
456 audio->fake_stream = SDL_AllocAudioMem(audio->spec.size); | |
457 if ( audio->fake_stream == NULL ) { | |
458 SDL_CloseAudio(); | |
459 SDL_OutOfMemory(); | |
460 return(-1); | |
461 } | |
462 | |
463 /* 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
|
464 if ( obtained != NULL ) { |
0defd90ef27c
Simplify code and clean up Valgrind warning
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
465 memcpy(obtained, &audio->spec, sizeof(audio->spec)); |
0defd90ef27c
Simplify code and clean up Valgrind warning
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
466 } else if ( desired->freq != audio->spec.freq || |
0defd90ef27c
Simplify code and clean up Valgrind warning
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
467 desired->format != audio->spec.format || |
0defd90ef27c
Simplify code and clean up Valgrind warning
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
468 desired->channels != audio->spec.channels ) { |
0defd90ef27c
Simplify code and clean up Valgrind warning
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
469 /* Build an audio conversion block */ |
0defd90ef27c
Simplify code and clean up Valgrind warning
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
470 if ( SDL_BuildAudioCVT(&audio->convert, |
0defd90ef27c
Simplify code and clean up Valgrind warning
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
471 desired->format, desired->channels, |
0defd90ef27c
Simplify code and clean up Valgrind warning
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
472 desired->freq, |
0defd90ef27c
Simplify code and clean up Valgrind warning
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
473 audio->spec.format, audio->spec.channels, |
0defd90ef27c
Simplify code and clean up Valgrind warning
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
474 audio->spec.freq) < 0 ) { |
0defd90ef27c
Simplify code and clean up Valgrind warning
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
475 SDL_CloseAudio(); |
0defd90ef27c
Simplify code and clean up Valgrind warning
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
476 return(-1); |
0 | 477 } |
808
0defd90ef27c
Simplify code and clean up Valgrind warning
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
478 if ( audio->convert.needed ) { |
0defd90ef27c
Simplify code and clean up Valgrind warning
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
479 audio->convert.len = desired->size; |
0defd90ef27c
Simplify code and clean up Valgrind warning
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
480 audio->convert.buf =(Uint8 *)SDL_AllocAudioMem( |
0defd90ef27c
Simplify code and clean up Valgrind warning
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
481 audio->convert.len*audio->convert.len_mult); |
0defd90ef27c
Simplify code and clean up Valgrind warning
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
482 if ( audio->convert.buf == NULL ) { |
0 | 483 SDL_CloseAudio(); |
808
0defd90ef27c
Simplify code and clean up Valgrind warning
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
484 SDL_OutOfMemory(); |
0 | 485 return(-1); |
486 } | |
487 } | |
488 } | |
489 | |
21
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
490 #ifndef ENABLE_AHI |
0 | 491 /* Start the audio thread if necessary */ |
492 switch (audio->opened) { | |
493 case 1: | |
494 /* Start the audio thread */ | |
495 audio->thread = SDL_CreateThread(SDL_RunAudio, audio); | |
496 if ( audio->thread == NULL ) { | |
497 SDL_CloseAudio(); | |
498 SDL_SetError("Couldn't create audio thread"); | |
499 return(-1); | |
500 } | |
501 break; | |
502 | |
503 default: | |
504 /* The audio is now playing */ | |
505 break; | |
506 } | |
21
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
507 #else |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
508 SDL_mutexV(audio->mixer_lock); |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
509 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
|
510 |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
511 #endif |
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
512 |
0 | 513 return(0); |
514 } | |
515 | |
516 SDL_audiostatus SDL_GetAudioStatus(void) | |
517 { | |
518 SDL_AudioDevice *audio = current_audio; | |
519 SDL_audiostatus status; | |
520 | |
521 status = SDL_AUDIO_STOPPED; | |
522 if ( audio && audio->enabled ) { | |
523 if ( audio->paused ) { | |
524 status = SDL_AUDIO_PAUSED; | |
525 } else { | |
526 status = SDL_AUDIO_PLAYING; | |
527 } | |
528 } | |
529 return(status); | |
530 } | |
531 | |
532 void SDL_PauseAudio (int pause_on) | |
533 { | |
534 SDL_AudioDevice *audio = current_audio; | |
535 | |
536 if ( audio ) { | |
537 audio->paused = pause_on; | |
538 } | |
539 } | |
540 | |
541 void SDL_LockAudio (void) | |
542 { | |
543 SDL_AudioDevice *audio = current_audio; | |
544 | |
545 /* 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
|
546 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
|
547 audio->LockAudio(audio); |
0 | 548 } |
549 } | |
550 | |
551 void SDL_UnlockAudio (void) | |
552 { | |
553 SDL_AudioDevice *audio = current_audio; | |
554 | |
555 /* 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
|
556 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
|
557 audio->UnlockAudio(audio); |
0 | 558 } |
559 } | |
560 | |
561 void SDL_CloseAudio (void) | |
562 { | |
563 SDL_QuitSubSystem(SDL_INIT_AUDIO); | |
564 } | |
565 | |
566 void SDL_AudioQuit(void) | |
567 { | |
568 SDL_AudioDevice *audio = current_audio; | |
569 | |
570 if ( audio ) { | |
571 audio->enabled = 0; | |
572 if ( audio->thread != NULL ) { | |
573 SDL_WaitThread(audio->thread, NULL); | |
574 } | |
575 if ( audio->mixer_lock != NULL ) { | |
576 SDL_DestroyMutex(audio->mixer_lock); | |
577 } | |
578 if ( audio->fake_stream != NULL ) { | |
579 SDL_FreeAudioMem(audio->fake_stream); | |
580 } | |
581 if ( audio->convert.needed ) { | |
582 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
|
583 |
0 | 584 } |
21
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
585 #ifndef ENABLE_AHI |
0 | 586 if ( audio->opened ) { |
587 audio->CloseAudio(audio); | |
588 audio->opened = 0; | |
589 } | |
21
75a95f82bc1f
Updated the Amiga OS port of SDL (thanks Gabriele)
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
590 #endif |
0 | 591 /* Free the driver data */ |
592 audio->free(audio); | |
593 current_audio = NULL; | |
594 } | |
595 } | |
596 | |
597 #define NUM_FORMATS 6 | |
598 static int format_idx; | |
599 static int format_idx_sub; | |
600 static Uint16 format_list[NUM_FORMATS][NUM_FORMATS] = { | |
601 { AUDIO_U8, AUDIO_S8, AUDIO_S16LSB, AUDIO_S16MSB, AUDIO_U16LSB, AUDIO_U16MSB }, | |
602 { AUDIO_S8, AUDIO_U8, AUDIO_S16LSB, AUDIO_S16MSB, AUDIO_U16LSB, AUDIO_U16MSB }, | |
603 { AUDIO_S16LSB, AUDIO_S16MSB, AUDIO_U16LSB, AUDIO_U16MSB, AUDIO_U8, AUDIO_S8 }, | |
604 { AUDIO_S16MSB, AUDIO_S16LSB, AUDIO_U16MSB, AUDIO_U16LSB, AUDIO_U8, AUDIO_S8 }, | |
605 { AUDIO_U16LSB, AUDIO_U16MSB, AUDIO_S16LSB, AUDIO_S16MSB, AUDIO_U8, AUDIO_S8 }, | |
606 { AUDIO_U16MSB, AUDIO_U16LSB, AUDIO_S16MSB, AUDIO_S16LSB, AUDIO_U8, AUDIO_S8 }, | |
607 }; | |
608 | |
609 Uint16 SDL_FirstAudioFormat(Uint16 format) | |
610 { | |
611 for ( format_idx=0; format_idx < NUM_FORMATS; ++format_idx ) { | |
612 if ( format_list[format_idx][0] == format ) { | |
613 break; | |
614 } | |
615 } | |
616 format_idx_sub = 0; | |
617 return(SDL_NextAudioFormat()); | |
618 } | |
619 | |
620 Uint16 SDL_NextAudioFormat(void) | |
621 { | |
622 if ( (format_idx == NUM_FORMATS) || (format_idx_sub == NUM_FORMATS) ) { | |
623 return(0); | |
624 } | |
625 return(format_list[format_idx][format_idx_sub++]); | |
626 } | |
627 | |
628 void SDL_CalculateAudioSpec(SDL_AudioSpec *spec) | |
629 { | |
630 switch (spec->format) { | |
631 case AUDIO_U8: | |
632 spec->silence = 0x80; | |
633 break; | |
634 default: | |
635 spec->silence = 0x00; | |
636 break; | |
637 } | |
638 spec->size = (spec->format&0xFF)/8; | |
639 spec->size *= spec->channels; | |
640 spec->size *= spec->samples; | |
641 } |