Mercurial > sdl-ios-xcode
annotate src/audio/arts/SDL_artsaudio.c @ 930:02759105b989
Date: Fri, 20 Aug 2004 08:31:20 +0200
From: "Markus F.X.J. Oberhumer"
Subject: [SDL-CVS][patch] add missing SDLCALL to headers
the small patch attached below (against current CVS) adds some missing SDLCALL
decorations to callback types and arguments.
Unfortunately one of these changes breaks your gen{def,exp}.pl scripts which
should be changed to use non-greedy regular expression matching...
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Fri, 20 Aug 2004 18:57:01 +0000 |
parents | 03fb90fc135e |
children | 4263beff9e38 |
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:
474
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:
0
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 | |
30 #include <sys/types.h> | |
31 #include <stdlib.h> | |
32 #include <stdio.h> | |
33 #include <string.h> | |
34 #include <errno.h> | |
35 #include <signal.h> | |
36 #include <unistd.h> | |
37 | |
38 #include "SDL_audio.h" | |
39 #include "SDL_error.h" | |
40 #include "SDL_audiomem.h" | |
41 #include "SDL_audio_c.h" | |
42 #include "SDL_timer.h" | |
43 #include "SDL_audiodev_c.h" | |
44 #include "SDL_artsaudio.h" | |
45 | |
294
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
46 #ifdef ARTSC_DYNAMIC |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
47 #include "SDL_name.h" |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
48 #include "SDL_loadso.h" |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
49 #else |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
50 #define SDL_NAME(X) X |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
51 #endif |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
52 |
0 | 53 /* The tag name used by artsc audio */ |
54 #define ARTSC_DRIVER_NAME "artsc" | |
55 | |
56 /* Audio driver functions */ | |
57 static int ARTSC_OpenAudio(_THIS, SDL_AudioSpec *spec); | |
58 static void ARTSC_WaitAudio(_THIS); | |
59 static void ARTSC_PlayAudio(_THIS); | |
60 static Uint8 *ARTSC_GetAudioBuf(_THIS); | |
61 static void ARTSC_CloseAudio(_THIS); | |
62 | |
294
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
63 #ifdef ARTSC_DYNAMIC |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
64 |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
65 static const char *arts_library = ARTSC_DYNAMIC; |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
66 static void *arts_handle = NULL; |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
67 static int arts_loaded = 0; |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
68 |
301
fb4c4c6a2773
Fixed dynamic arts support.
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
69 static int (*SDL_NAME(arts_init))(void); |
fb4c4c6a2773
Fixed dynamic arts support.
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
70 static void (*SDL_NAME(arts_free))(void); |
fb4c4c6a2773
Fixed dynamic arts support.
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
71 static arts_stream_t (*SDL_NAME(arts_play_stream))(int rate, int bits, int channels, const char *name); |
fb4c4c6a2773
Fixed dynamic arts support.
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
72 static int (*SDL_NAME(arts_stream_set))(arts_stream_t s, arts_parameter_t param, int value); |
fb4c4c6a2773
Fixed dynamic arts support.
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
73 static int (*SDL_NAME(arts_stream_get))(arts_stream_t s, arts_parameter_t param); |
fb4c4c6a2773
Fixed dynamic arts support.
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
74 static int (*SDL_NAME(arts_write))(arts_stream_t s, const void *buffer, int count); |
fb4c4c6a2773
Fixed dynamic arts support.
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
75 static void (*SDL_NAME(arts_close_stream))(arts_stream_t s); |
fb4c4c6a2773
Fixed dynamic arts support.
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
76 |
294
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
77 static struct { |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
78 const char *name; |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
79 void **func; |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
80 } arts_functions[] = { |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
81 { "arts_init", (void **)&SDL_NAME(arts_init) }, |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
82 { "arts_free", (void **)&SDL_NAME(arts_free) }, |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
83 { "arts_play_stream", (void **)&SDL_NAME(arts_play_stream) }, |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
84 { "arts_stream_set", (void **)&SDL_NAME(arts_stream_set) }, |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
85 { "arts_stream_get", (void **)&SDL_NAME(arts_stream_get) }, |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
86 { "arts_write", (void **)&SDL_NAME(arts_write) }, |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
87 { "arts_close_stream", (void **)&SDL_NAME(arts_close_stream) }, |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
88 }; |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
89 |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
90 static void UnloadARTSLibrary() |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
91 { |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
92 if ( arts_loaded ) { |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
93 SDL_UnloadObject(arts_handle); |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
94 arts_handle = NULL; |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
95 arts_loaded = 0; |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
96 } |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
97 } |
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 static int LoadARTSLibrary(void) |
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 int i, retval = -1; |
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 arts_handle = SDL_LoadObject(arts_library); |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
104 if ( arts_handle ) { |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
105 arts_loaded = 1; |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
106 retval = 0; |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
107 for ( i=0; i<SDL_TABLESIZE(arts_functions); ++i ) { |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
108 *arts_functions[i].func = SDL_LoadFunction(arts_handle, arts_functions[i].name); |
864
0c892e99b65b
Date: Sun, 29 Feb 2004 20:28:27 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
109 if ( !*arts_functions[i].func ) { |
294
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
110 retval = -1; |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
111 UnloadARTSLibrary(); |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
112 break; |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
113 } |
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 } |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
116 return retval; |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
117 } |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
118 |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
119 #else |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
120 |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
121 static void UnloadARTSLibrary() |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
122 { |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
123 return; |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
124 } |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
125 |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
126 static int LoadARTSLibrary(void) |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
127 { |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
128 return 0; |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
129 } |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
130 |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
131 #endif /* ARTSC_DYNAMIC */ |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
132 |
0 | 133 /* Audio driver bootstrap functions */ |
134 | |
135 static int Audio_Available(void) | |
136 { | |
294
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
137 int available = 0; |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
138 |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
139 if ( LoadARTSLibrary() < 0 ) { |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
140 return available; |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
141 } |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
142 if ( SDL_NAME(arts_init)() == 0 ) { |
929
03fb90fc135e
Date: Mon, 05 Jul 2004 14:37:59 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
864
diff
changeset
|
143 #define ARTS_CRASH_HACK /* Play a stream so aRts doesn't crash */ |
03fb90fc135e
Date: Mon, 05 Jul 2004 14:37:59 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
864
diff
changeset
|
144 #ifdef ARTS_CRASH_HACK |
03fb90fc135e
Date: Mon, 05 Jul 2004 14:37:59 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
864
diff
changeset
|
145 arts_stream_t stream2; |
03fb90fc135e
Date: Mon, 05 Jul 2004 14:37:59 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
864
diff
changeset
|
146 stream2=SDL_NAME(arts_play_stream)(44100, 16, 2, "SDL"); |
03fb90fc135e
Date: Mon, 05 Jul 2004 14:37:59 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
864
diff
changeset
|
147 SDL_NAME(arts_write)(stream2, "", 0); |
03fb90fc135e
Date: Mon, 05 Jul 2004 14:37:59 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
864
diff
changeset
|
148 SDL_NAME(arts_close_stream)(stream2); |
03fb90fc135e
Date: Mon, 05 Jul 2004 14:37:59 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
864
diff
changeset
|
149 #endif |
294
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
150 available = 1; |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
151 SDL_NAME(arts_free)(); |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
152 } |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
153 UnloadARTSLibrary(); |
474
583a07ab5444
Doh! Patch by Joel Ray Holveck
Sam Lantinga <slouken@libsdl.org>
parents:
301
diff
changeset
|
154 |
583a07ab5444
Doh! Patch by Joel Ray Holveck
Sam Lantinga <slouken@libsdl.org>
parents:
301
diff
changeset
|
155 return available; |
0 | 156 } |
157 | |
158 static void Audio_DeleteDevice(SDL_AudioDevice *device) | |
159 { | |
160 free(device->hidden); | |
161 free(device); | |
294
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
162 UnloadARTSLibrary(); |
0 | 163 } |
164 | |
165 static SDL_AudioDevice *Audio_CreateDevice(int devindex) | |
166 { | |
167 SDL_AudioDevice *this; | |
168 | |
169 /* 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
|
170 LoadARTSLibrary(); |
0 | 171 this = (SDL_AudioDevice *)malloc(sizeof(SDL_AudioDevice)); |
172 if ( this ) { | |
173 memset(this, 0, (sizeof *this)); | |
174 this->hidden = (struct SDL_PrivateAudioData *) | |
175 malloc((sizeof *this->hidden)); | |
176 } | |
177 if ( (this == NULL) || (this->hidden == NULL) ) { | |
178 SDL_OutOfMemory(); | |
179 if ( this ) { | |
180 free(this); | |
181 } | |
182 return(0); | |
183 } | |
184 memset(this->hidden, 0, (sizeof *this->hidden)); | |
185 stream = 0; | |
186 | |
187 /* Set the function pointers */ | |
188 this->OpenAudio = ARTSC_OpenAudio; | |
189 this->WaitAudio = ARTSC_WaitAudio; | |
190 this->PlayAudio = ARTSC_PlayAudio; | |
191 this->GetAudioBuf = ARTSC_GetAudioBuf; | |
192 this->CloseAudio = ARTSC_CloseAudio; | |
193 | |
194 this->free = Audio_DeleteDevice; | |
195 | |
196 return this; | |
197 } | |
198 | |
199 AudioBootStrap ARTSC_bootstrap = { | |
200 ARTSC_DRIVER_NAME, "Analog Realtime Synthesizer", | |
201 Audio_Available, Audio_CreateDevice | |
202 }; | |
203 | |
204 /* This function waits until it is possible to write a full sound buffer */ | |
205 static void ARTSC_WaitAudio(_THIS) | |
206 { | |
207 Sint32 ticks; | |
208 | |
209 /* Check to see if the thread-parent process is still alive */ | |
210 { static int cnt = 0; | |
211 /* Note that this only works with thread implementations | |
212 that use a different process id for each thread. | |
213 */ | |
214 if (parent && (((++cnt)%10) == 0)) { /* Check every 10 loops */ | |
215 if ( kill(parent, 0) < 0 ) { | |
216 this->enabled = 0; | |
217 } | |
218 } | |
219 } | |
220 | |
221 /* Use timer for general audio synchronization */ | |
222 ticks = ((Sint32)(next_frame - SDL_GetTicks()))-FUDGE_TICKS; | |
223 if ( ticks > 0 ) { | |
224 SDL_Delay(ticks); | |
225 } | |
226 } | |
227 | |
228 static void ARTSC_PlayAudio(_THIS) | |
229 { | |
230 int written; | |
231 | |
232 /* Write the audio data */ | |
294
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
233 written = SDL_NAME(arts_write)(stream, mixbuf, mixlen); |
0 | 234 |
235 /* If timer synchronization is enabled, set the next write frame */ | |
236 if ( frame_ticks ) { | |
237 next_frame += frame_ticks; | |
238 } | |
239 | |
240 /* If we couldn't write, assume fatal error for now */ | |
241 if ( written < 0 ) { | |
242 this->enabled = 0; | |
243 } | |
244 #ifdef DEBUG_AUDIO | |
245 fprintf(stderr, "Wrote %d bytes of audio data\n", written); | |
246 #endif | |
247 } | |
248 | |
249 static Uint8 *ARTSC_GetAudioBuf(_THIS) | |
250 { | |
251 return(mixbuf); | |
252 } | |
253 | |
254 static void ARTSC_CloseAudio(_THIS) | |
255 { | |
256 if ( mixbuf != NULL ) { | |
257 SDL_FreeAudioMem(mixbuf); | |
258 mixbuf = NULL; | |
259 } | |
260 if ( stream ) { | |
294
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
261 SDL_NAME(arts_close_stream)(stream); |
0 | 262 stream = 0; |
263 } | |
294
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
264 SDL_NAME(arts_free)(); |
0 | 265 } |
266 | |
267 static int ARTSC_OpenAudio(_THIS, SDL_AudioSpec *spec) | |
268 { | |
269 int bits, frag_spec; | |
270 Uint16 test_format, format; | |
271 | |
272 /* Reset the timer synchronization flag */ | |
273 frame_ticks = 0.0; | |
274 | |
275 mixbuf = NULL; | |
276 | |
277 /* Try for a closest match on audio format */ | |
278 format = 0; | |
279 bits = 0; | |
280 for ( test_format = SDL_FirstAudioFormat(spec->format); | |
281 ! format && test_format; ) { | |
282 #ifdef DEBUG_AUDIO | |
283 fprintf(stderr, "Trying format 0x%4.4x\n", test_format); | |
284 #endif | |
285 switch ( test_format ) { | |
286 case AUDIO_U8: | |
287 bits = 8; | |
288 format = 1; | |
289 break; | |
290 case AUDIO_S16LSB: | |
291 bits = 16; | |
292 format = 1; | |
293 break; | |
294 default: | |
295 format = 0; | |
296 break; | |
297 } | |
298 if ( ! format ) { | |
299 test_format = SDL_NextAudioFormat(); | |
300 } | |
301 } | |
302 if ( format == 0 ) { | |
303 SDL_SetError("Couldn't find any hardware audio formats"); | |
304 return(-1); | |
305 } | |
306 spec->format = test_format; | |
307 | |
294
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
308 if ( SDL_NAME(arts_init)() != 0 ) { |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
309 SDL_SetError("Unable to initialize ARTS"); |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
310 return(-1); |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
311 } |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
312 stream = SDL_NAME(arts_play_stream)(spec->freq, bits, spec->channels, "SDL"); |
0 | 313 |
314 /* Calculate the final parameters for this audio specification */ | |
315 SDL_CalculateAudioSpec(spec); | |
316 | |
317 /* Determine the power of two of the fragment size */ | |
318 for ( frag_spec = 0; (0x01<<frag_spec) < spec->size; ++frag_spec ); | |
319 if ( (0x01<<frag_spec) != spec->size ) { | |
320 SDL_SetError("Fragment size must be a power of two"); | |
321 return(-1); | |
322 } | |
323 frag_spec |= 0x00020000; /* two fragments, for low latency */ | |
324 | |
325 #ifdef ARTS_P_PACKET_SETTINGS | |
294
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
326 SDL_NAME(arts_stream_set)(stream, ARTS_P_PACKET_SETTINGS, frag_spec); |
0 | 327 #else |
294
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
328 SDL_NAME(arts_stream_set)(stream, ARTS_P_PACKET_SIZE, frag_spec&0xffff); |
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
329 SDL_NAME(arts_stream_set)(stream, ARTS_P_PACKET_COUNT, frag_spec>>16); |
0 | 330 #endif |
294
d2d48e10f370
Added a new header file: SDL_loadso.h
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
331 spec->size = SDL_NAME(arts_stream_get)(stream, ARTS_P_PACKET_SIZE); |
0 | 332 |
333 /* Allocate mixing buffer */ | |
334 mixlen = spec->size; | |
335 mixbuf = (Uint8 *)SDL_AllocAudioMem(mixlen); | |
336 if ( mixbuf == NULL ) { | |
337 return(-1); | |
338 } | |
339 memset(mixbuf, spec->silence, spec->size); | |
340 | |
341 /* Get the parent process id (we're the parent of the audio thread) */ | |
342 parent = getpid(); | |
343 | |
344 /* We're ready to rock and roll. :-) */ | |
345 return(0); | |
346 } |