Mercurial > sdl-ios-xcode
annotate src/audio/esd/SDL_esdaudio.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 | 9f836cec0521 |
children | 782fd950bd46 c121d94672cb a1b03ba2fcd0 |
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:
864
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:
864
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:
864
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:
864
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:
864
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:
864
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:
864
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:
0
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 an ESD network stream mixing buffer */ | |
25 | |
1616
9f836cec0521
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
1402
diff
changeset
|
26 #include <sys/types.h> |
9f836cec0521
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
1402
diff
changeset
|
27 #include <unistd.h> |
9f836cec0521
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
1402
diff
changeset
|
28 #include <signal.h> |
0 | 29 #include <errno.h> |
30 #include <esd.h> | |
31 | |
1358
c71e05b4dc2e
More header massaging... works great on Windows. ;-)
Sam Lantinga <slouken@libsdl.org>
parents:
1338
diff
changeset
|
32 #include "SDL_timer.h" |
0 | 33 #include "SDL_audio.h" |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
34 #include "../SDL_audiomem.h" |
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
35 #include "../SDL_audio_c.h" |
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
36 #include "../SDL_audiodev_c.h" |
0 | 37 #include "SDL_esdaudio.h" |
38 | |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
39 #ifdef SDL_AUDIO_DRIVER_ESD_DYNAMIC |
294
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
40 #include "SDL_name.h" |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
41 #include "SDL_loadso.h" |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
42 #else |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
43 #define SDL_NAME(X) X |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
44 #endif |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
45 |
0 | 46 /* The tag name used by ESD audio */ |
47 #define ESD_DRIVER_NAME "esd" | |
48 | |
49 /* Audio driver functions */ | |
50 static int ESD_OpenAudio(_THIS, SDL_AudioSpec *spec); | |
51 static void ESD_WaitAudio(_THIS); | |
52 static void ESD_PlayAudio(_THIS); | |
53 static Uint8 *ESD_GetAudioBuf(_THIS); | |
54 static void ESD_CloseAudio(_THIS); | |
55 | |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
56 #ifdef SDL_AUDIO_DRIVER_ESD_DYNAMIC |
294
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
57 |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
58 static const char *esd_library = SDL_AUDIO_DRIVER_ESD_DYNAMIC; |
294
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
59 static void *esd_handle = NULL; |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
60 static int esd_loaded = 0; |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
61 |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
62 static int (*SDL_NAME(esd_open_sound))( const char *host ); |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
63 static int (*SDL_NAME(esd_close))( int esd ); |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
64 static int (*SDL_NAME(esd_play_stream))( esd_format_t format, int rate, |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
65 const char *host, const char *name ); |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
66 static struct { |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
67 const char *name; |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
68 void **func; |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
69 } esd_functions[] = { |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
70 { "esd_open_sound", (void **)&SDL_NAME(esd_open_sound) }, |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
71 { "esd_close", (void **)&SDL_NAME(esd_close) }, |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
72 { "esd_play_stream", (void **)&SDL_NAME(esd_play_stream) }, |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
73 }; |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
74 |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
75 static void UnloadESDLibrary() |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
76 { |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
77 if ( esd_loaded ) { |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
78 SDL_UnloadObject(esd_handle); |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
79 esd_handle = NULL; |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
80 esd_loaded = 0; |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
81 } |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
82 } |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
83 |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
84 static int LoadESDLibrary(void) |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
85 { |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
86 int i, retval = -1; |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
87 |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
88 esd_handle = SDL_LoadObject(esd_library); |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
89 if ( esd_handle ) { |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
90 esd_loaded = 1; |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
91 retval = 0; |
1379
c0a74f199ecf
Use only safe string functions
Sam Lantinga <slouken@libsdl.org>
parents:
1367
diff
changeset
|
92 for ( i=0; i<SDL_arraysize(esd_functions); ++i ) { |
294
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
93 *esd_functions[i].func = SDL_LoadFunction(esd_handle, esd_functions[i].name); |
864
0c892e99b65b
Date: Sun, 29 Feb 2004 20:28:27 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
94 if ( !*esd_functions[i].func ) { |
294
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
95 retval = -1; |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
96 UnloadESDLibrary(); |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
97 break; |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
98 } |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
99 } |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
100 } |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
101 return retval; |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
102 } |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
103 |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
104 #else |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
105 |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
106 static void UnloadESDLibrary() |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
107 { |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
108 return; |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
109 } |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
110 |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
111 static int LoadESDLibrary(void) |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
112 { |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
113 return 0; |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
114 } |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
115 |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
116 #endif /* SDL_AUDIO_DRIVER_ESD_DYNAMIC */ |
294
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
117 |
0 | 118 /* Audio driver bootstrap functions */ |
119 | |
120 static int Audio_Available(void) | |
121 { | |
122 int connection; | |
123 int available; | |
124 | |
125 available = 0; | |
294
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
126 if ( LoadESDLibrary() < 0 ) { |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
127 return available; |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
128 } |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
129 connection = SDL_NAME(esd_open_sound)(NULL); |
0 | 130 if ( connection >= 0 ) { |
131 available = 1; | |
294
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
132 SDL_NAME(esd_close)(connection); |
0 | 133 } |
294
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
134 UnloadESDLibrary(); |
0 | 135 return(available); |
136 } | |
137 | |
138 static void Audio_DeleteDevice(SDL_AudioDevice *device) | |
139 { | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1312
diff
changeset
|
140 SDL_free(device->hidden); |
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1312
diff
changeset
|
141 SDL_free(device); |
294
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
142 UnloadESDLibrary(); |
0 | 143 } |
144 | |
145 static SDL_AudioDevice *Audio_CreateDevice(int devindex) | |
146 { | |
147 SDL_AudioDevice *this; | |
148 | |
149 /* Initialize all variables that we clean on shutdown */ | |
294
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
150 LoadESDLibrary(); |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1312
diff
changeset
|
151 this = (SDL_AudioDevice *)SDL_malloc(sizeof(SDL_AudioDevice)); |
0 | 152 if ( this ) { |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1312
diff
changeset
|
153 SDL_memset(this, 0, (sizeof *this)); |
0 | 154 this->hidden = (struct SDL_PrivateAudioData *) |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1312
diff
changeset
|
155 SDL_malloc((sizeof *this->hidden)); |
0 | 156 } |
157 if ( (this == NULL) || (this->hidden == NULL) ) { | |
158 SDL_OutOfMemory(); | |
159 if ( this ) { | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1312
diff
changeset
|
160 SDL_free(this); |
0 | 161 } |
162 return(0); | |
163 } | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1312
diff
changeset
|
164 SDL_memset(this->hidden, 0, (sizeof *this->hidden)); |
0 | 165 audio_fd = -1; |
166 | |
167 /* Set the function pointers */ | |
168 this->OpenAudio = ESD_OpenAudio; | |
169 this->WaitAudio = ESD_WaitAudio; | |
170 this->PlayAudio = ESD_PlayAudio; | |
171 this->GetAudioBuf = ESD_GetAudioBuf; | |
172 this->CloseAudio = ESD_CloseAudio; | |
173 | |
174 this->free = Audio_DeleteDevice; | |
175 | |
176 return this; | |
177 } | |
178 | |
179 AudioBootStrap ESD_bootstrap = { | |
180 ESD_DRIVER_NAME, "Enlightened Sound Daemon", | |
181 Audio_Available, Audio_CreateDevice | |
182 }; | |
183 | |
184 /* This function waits until it is possible to write a full sound buffer */ | |
185 static void ESD_WaitAudio(_THIS) | |
186 { | |
187 Sint32 ticks; | |
188 | |
189 /* Check to see if the thread-parent process is still alive */ | |
190 { static int cnt = 0; | |
191 /* Note that this only works with thread implementations | |
192 that use a different process id for each thread. | |
193 */ | |
194 if (parent && (((++cnt)%10) == 0)) { /* Check every 10 loops */ | |
195 if ( kill(parent, 0) < 0 ) { | |
196 this->enabled = 0; | |
197 } | |
198 } | |
199 } | |
200 | |
201 /* Use timer for general audio synchronization */ | |
202 ticks = ((Sint32)(next_frame - SDL_GetTicks()))-FUDGE_TICKS; | |
203 if ( ticks > 0 ) { | |
204 SDL_Delay(ticks); | |
205 } | |
206 } | |
207 | |
208 static void ESD_PlayAudio(_THIS) | |
209 { | |
210 int written; | |
211 | |
212 /* Write the audio data, checking for EAGAIN on broken audio drivers */ | |
213 do { | |
214 written = write(audio_fd, mixbuf, mixlen); | |
215 if ( (written < 0) && ((errno == 0) || (errno == EAGAIN)) ) { | |
216 SDL_Delay(1); /* Let a little CPU time go by */ | |
217 } | |
218 } while ( (written < 0) && | |
219 ((errno == 0) || (errno == EAGAIN) || (errno == EINTR)) ); | |
220 | |
221 /* Set the next write frame */ | |
222 next_frame += frame_ticks; | |
223 | |
224 /* If we couldn't write, assume fatal error for now */ | |
225 if ( written < 0 ) { | |
226 this->enabled = 0; | |
227 } | |
228 } | |
229 | |
230 static Uint8 *ESD_GetAudioBuf(_THIS) | |
231 { | |
232 return(mixbuf); | |
233 } | |
234 | |
235 static void ESD_CloseAudio(_THIS) | |
236 { | |
237 if ( mixbuf != NULL ) { | |
238 SDL_FreeAudioMem(mixbuf); | |
239 mixbuf = NULL; | |
240 } | |
241 if ( audio_fd >= 0 ) { | |
294
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
242 SDL_NAME(esd_close)(audio_fd); |
0 | 243 audio_fd = -1; |
244 } | |
245 } | |
246 | |
247 /* Try to get the name of the program */ | |
248 static char *get_progname(void) | |
249 { | |
250 char *progname = NULL; | |
1402
d910939febfa
Use consistent identifiers for the various platforms we support.
Sam Lantinga <slouken@libsdl.org>
parents:
1379
diff
changeset
|
251 #ifdef __LINUX__ |
0 | 252 FILE *fp; |
253 static char temp[BUFSIZ]; | |
254 | |
1338
604d73db6802
Removed uses of stdlib.h and string.h
Sam Lantinga <slouken@libsdl.org>
parents:
1336
diff
changeset
|
255 SDL_snprintf(temp, SDL_arraysize(temp), "/proc/%d/cmdline", getpid()); |
0 | 256 fp = fopen(temp, "r"); |
257 if ( fp != NULL ) { | |
258 if ( fgets(temp, sizeof(temp)-1, fp) ) { | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1312
diff
changeset
|
259 progname = SDL_strrchr(temp, '/'); |
0 | 260 if ( progname == NULL ) { |
261 progname = temp; | |
262 } else { | |
263 progname = progname+1; | |
264 } | |
265 } | |
266 fclose(fp); | |
267 } | |
268 #endif | |
269 return(progname); | |
270 } | |
271 | |
272 static int ESD_OpenAudio(_THIS, SDL_AudioSpec *spec) | |
273 { | |
274 esd_format_t format; | |
275 | |
276 /* Convert audio spec to the ESD audio format */ | |
277 format = (ESD_STREAM | ESD_PLAY); | |
278 switch ( spec->format & 0xFF ) { | |
279 case 8: | |
280 format |= ESD_BITS8; | |
281 break; | |
282 case 16: | |
283 format |= ESD_BITS16; | |
284 break; | |
285 default: | |
286 SDL_SetError("Unsupported ESD audio format"); | |
287 return(-1); | |
288 } | |
289 if ( spec->channels == 1 ) { | |
290 format |= ESD_MONO; | |
291 } else { | |
292 format |= ESD_STEREO; | |
293 } | |
294 #if 0 | |
295 spec->samples = ESD_BUF_SIZE; /* Darn, no way to change this yet */ | |
296 #endif | |
297 | |
298 /* Open a connection to the ESD audio server */ | |
294
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
299 audio_fd = SDL_NAME(esd_play_stream)(format, spec->freq, NULL, get_progname()); |
0 | 300 if ( audio_fd < 0 ) { |
301 SDL_SetError("Couldn't open ESD connection"); | |
302 return(-1); | |
303 } | |
304 | |
305 /* Calculate the final parameters for this audio specification */ | |
306 SDL_CalculateAudioSpec(spec); | |
307 frame_ticks = (float)(spec->samples*1000)/spec->freq; | |
308 next_frame = SDL_GetTicks()+frame_ticks; | |
309 | |
310 /* Allocate mixing buffer */ | |
311 mixlen = spec->size; | |
312 mixbuf = (Uint8 *)SDL_AllocAudioMem(mixlen); | |
313 if ( mixbuf == NULL ) { | |
314 return(-1); | |
315 } | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1312
diff
changeset
|
316 SDL_memset(mixbuf, spec->silence, spec->size); |
0 | 317 |
318 /* Get the parent process id (we're the parent of the audio thread) */ | |
319 parent = getpid(); | |
320 | |
321 /* We're ready to rock and roll. :-) */ | |
322 return(0); | |
323 } |