comparison src/audio/mint/SDL_mintaudio_gsxb.c @ 1895:c121d94672cb

SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
author Sam Lantinga <slouken@libsdl.org>
date Mon, 10 Jul 2006 21:04:37 +0000
parents a8181c4040b8
children 45af7d69f8eb
comparison
equal deleted inserted replaced
1894:c69cee13dd76 1895:c121d94672cb
62 static unsigned long cookie_snd, cookie_gsxb; 62 static unsigned long cookie_snd, cookie_gsxb;
63 63
64 /*--- Audio driver functions ---*/ 64 /*--- Audio driver functions ---*/
65 65
66 static void Mint_CloseAudio(_THIS); 66 static void Mint_CloseAudio(_THIS);
67 static int Mint_OpenAudio(_THIS, SDL_AudioSpec *spec); 67 static int Mint_OpenAudio(_THIS, SDL_AudioSpec * spec);
68 static void Mint_LockAudio(_THIS); 68 static void Mint_LockAudio(_THIS);
69 static void Mint_UnlockAudio(_THIS); 69 static void Mint_UnlockAudio(_THIS);
70 70
71 /* To check/init hardware audio */ 71 /* To check/init hardware audio */
72 static int Mint_CheckAudio(_THIS, SDL_AudioSpec *spec); 72 static int Mint_CheckAudio(_THIS, SDL_AudioSpec * spec);
73 static void Mint_InitAudio(_THIS, SDL_AudioSpec *spec); 73 static void Mint_InitAudio(_THIS, SDL_AudioSpec * spec);
74 74
75 /* GSXB callbacks */ 75 /* GSXB callbacks */
76 static void Mint_GsxbInterrupt(void); 76 static void Mint_GsxbInterrupt(void);
77 static void Mint_GsxbNullInterrupt(void); 77 static void Mint_GsxbNullInterrupt(void);
78 78
79 /*--- Audio driver bootstrap functions ---*/ 79 /*--- Audio driver bootstrap functions ---*/
80 80
81 static int Audio_Available(void) 81 static int
82 { 82 Audio_Available(void)
83 const char *envr = SDL_getenv("SDL_AUDIODRIVER"); 83 {
84 84 const char *envr = SDL_getenv("SDL_AUDIODRIVER");
85 /* Check if user asked a different audio driver */ 85
86 if ((envr) && (SDL_strcmp(envr, MINT_AUDIO_DRIVER_NAME)!=0)) { 86 /* Check if user asked a different audio driver */
87 DEBUG_PRINT((DEBUG_NAME "user asked a different audio driver\n")); 87 if ((envr) && (SDL_strcmp(envr, MINT_AUDIO_DRIVER_NAME) != 0)) {
88 return(0); 88 DEBUG_PRINT((DEBUG_NAME "user asked a different audio driver\n"));
89 } 89 return (0);
90 90 }
91 /* Cookie _SND present ? if not, assume ST machine */ 91
92 if (Getcookie(C__SND, &cookie_snd) == C_NOTFOUND) { 92 /* Cookie _SND present ? if not, assume ST machine */
93 cookie_snd = SND_PSG; 93 if (Getcookie(C__SND, &cookie_snd) == C_NOTFOUND) {
94 } 94 cookie_snd = SND_PSG;
95 95 }
96 /* Check if we have 16 bits audio */ 96
97 if ((cookie_snd & SND_16BIT)==0) { 97 /* Check if we have 16 bits audio */
98 DEBUG_PRINT((DEBUG_NAME "no 16 bits sound\n")); 98 if ((cookie_snd & SND_16BIT) == 0) {
99 return(0); 99 DEBUG_PRINT((DEBUG_NAME "no 16 bits sound\n"));
100 } 100 return (0);
101 101 }
102 /* Cookie GSXB present ? */ 102
103 cookie_gsxb = (Getcookie(C_GSXB, &cookie_gsxb) == C_FOUND); 103 /* Cookie GSXB present ? */
104 104 cookie_gsxb = (Getcookie(C_GSXB, &cookie_gsxb) == C_FOUND);
105 /* Is it GSXB ? */ 105
106 if (((cookie_snd & SND_GSXB)==0) || (cookie_gsxb==0)) { 106 /* Is it GSXB ? */
107 DEBUG_PRINT((DEBUG_NAME "no GSXB audio\n")); 107 if (((cookie_snd & SND_GSXB) == 0) || (cookie_gsxb == 0)) {
108 return(0); 108 DEBUG_PRINT((DEBUG_NAME "no GSXB audio\n"));
109 } 109 return (0);
110 110 }
111 /* Check if audio is lockable */ 111
112 if (Locksnd()!=1) { 112 /* Check if audio is lockable */
113 DEBUG_PRINT((DEBUG_NAME "audio locked by other application\n")); 113 if (Locksnd() != 1) {
114 return(0); 114 DEBUG_PRINT((DEBUG_NAME "audio locked by other application\n"));
115 } 115 return (0);
116 116 }
117 Unlocksnd(); 117
118 118 Unlocksnd();
119 DEBUG_PRINT((DEBUG_NAME "GSXB audio available!\n")); 119
120 return(1); 120 DEBUG_PRINT((DEBUG_NAME "GSXB audio available!\n"));
121 } 121 return (1);
122 122 }
123 static void Audio_DeleteDevice(SDL_AudioDevice *device) 123
124 static void
125 Audio_DeleteDevice(SDL_AudioDevice * device)
124 { 126 {
125 SDL_free(device->hidden); 127 SDL_free(device->hidden);
126 SDL_free(device); 128 SDL_free(device);
127 } 129 }
128 130
129 static SDL_AudioDevice *Audio_CreateDevice(int devindex) 131 static SDL_AudioDevice *
130 { 132 Audio_CreateDevice(int devindex)
131 SDL_AudioDevice *this; 133 {
132 134 SDL_AudioDevice *this;
133 /* Initialize all variables that we clean on shutdown */ 135
134 this = (SDL_AudioDevice *)SDL_malloc(sizeof(SDL_AudioDevice)); 136 /* Initialize all variables that we clean on shutdown */
135 if ( this ) { 137 this = (SDL_AudioDevice *) SDL_malloc(sizeof(SDL_AudioDevice));
138 if (this) {
136 SDL_memset(this, 0, (sizeof *this)); 139 SDL_memset(this, 0, (sizeof *this));
137 this->hidden = (struct SDL_PrivateAudioData *) 140 this->hidden = (struct SDL_PrivateAudioData *)
138 SDL_malloc((sizeof *this->hidden)); 141 SDL_malloc((sizeof *this->hidden));
139 } 142 }
140 if ( (this == NULL) || (this->hidden == NULL) ) { 143 if ((this == NULL) || (this->hidden == NULL)) {
141 SDL_OutOfMemory(); 144 SDL_OutOfMemory();
142 if ( this ) { 145 if (this) {
143 SDL_free(this); 146 SDL_free(this);
144 } 147 }
145 return(0); 148 return (0);
146 } 149 }
147 SDL_memset(this->hidden, 0, (sizeof *this->hidden)); 150 SDL_memset(this->hidden, 0, (sizeof *this->hidden));
148 151
149 /* Set the function pointers */ 152 /* Set the function pointers */
150 this->OpenAudio = Mint_OpenAudio; 153 this->OpenAudio = Mint_OpenAudio;
151 this->CloseAudio = Mint_CloseAudio; 154 this->CloseAudio = Mint_CloseAudio;
152 this->LockAudio = Mint_LockAudio; 155 this->LockAudio = Mint_LockAudio;
153 this->UnlockAudio = Mint_UnlockAudio; 156 this->UnlockAudio = Mint_UnlockAudio;
154 this->free = Audio_DeleteDevice; 157 this->free = Audio_DeleteDevice;
155 158
156 return this; 159 return this;
157 } 160 }
158 161
159 AudioBootStrap MINTAUDIO_GSXB_bootstrap = { 162 AudioBootStrap MINTAUDIO_GSXB_bootstrap = {
160 MINT_AUDIO_DRIVER_NAME, "MiNT GSXB audio driver", 163 MINT_AUDIO_DRIVER_NAME, "MiNT GSXB audio driver",
161 Audio_Available, Audio_CreateDevice 164 Audio_Available, Audio_CreateDevice
162 }; 165 };
163 166
164 static void Mint_LockAudio(_THIS) 167 static void
165 { 168 Mint_LockAudio(_THIS)
166 /* Stop replay */ 169 {
167 Buffoper(0); 170 /* Stop replay */
168 } 171 Buffoper(0);
169 172 }
170 static void Mint_UnlockAudio(_THIS) 173
171 { 174 static void
172 /* Restart replay */ 175 Mint_UnlockAudio(_THIS)
173 Buffoper(SB_PLA_ENA|SB_PLA_RPT); 176 {
174 } 177 /* Restart replay */
175 178 Buffoper(SB_PLA_ENA | SB_PLA_RPT);
176 static void Mint_CloseAudio(_THIS) 179 }
177 { 180
178 /* Stop replay */ 181 static void
179 Buffoper(0); 182 Mint_CloseAudio(_THIS)
180 183 {
181 /* Uninstall interrupt */ 184 /* Stop replay */
182 if (NSetinterrupt(2, SI_NONE, Mint_GsxbNullInterrupt)<0) { 185 Buffoper(0);
183 DEBUG_PRINT((DEBUG_NAME "NSetinterrupt() failed in close\n")); 186
184 } 187 /* Uninstall interrupt */
185 188 if (NSetinterrupt(2, SI_NONE, Mint_GsxbNullInterrupt) < 0) {
186 /* Wait if currently playing sound */ 189 DEBUG_PRINT((DEBUG_NAME "NSetinterrupt() failed in close\n"));
187 while (SDL_MintAudio_mutex != 0) { 190 }
188 } 191
189 192 /* Wait if currently playing sound */
190 /* Clear buffers */ 193 while (SDL_MintAudio_mutex != 0) {
191 if (SDL_MintAudio_audiobuf[0]) { 194 }
192 Mfree(SDL_MintAudio_audiobuf[0]); 195
193 SDL_MintAudio_audiobuf[0] = SDL_MintAudio_audiobuf[1] = NULL; 196 /* Clear buffers */
194 } 197 if (SDL_MintAudio_audiobuf[0]) {
195 198 Mfree(SDL_MintAudio_audiobuf[0]);
196 /* Unlock sound system */ 199 SDL_MintAudio_audiobuf[0] = SDL_MintAudio_audiobuf[1] = NULL;
197 Unlocksnd(); 200 }
198 } 201
199 202 /* Unlock sound system */
200 static int Mint_CheckAudio(_THIS, SDL_AudioSpec *spec) 203 Unlocksnd();
201 { 204 }
202 long snd_format; 205
203 int i, resolution, format_signed, format_bigendian; 206 static int
204 207 Mint_CheckAudio(_THIS, SDL_AudioSpec * spec)
205 resolution = spec->format & 0x00ff; 208 {
206 format_signed = ((spec->format & 0x8000)!=0); 209 long snd_format;
207 format_bigendian = ((spec->format & 0x1000)!=0); 210 int i, resolution, format_signed, format_bigendian;
208 211
209 DEBUG_PRINT((DEBUG_NAME "asked: %d bits, ",spec->format & 0x00ff)); 212 resolution = spec->format & 0x00ff;
210 DEBUG_PRINT(("signed=%d, ", ((spec->format & 0x8000)!=0))); 213 format_signed = ((spec->format & 0x8000) != 0);
211 DEBUG_PRINT(("big endian=%d, ", ((spec->format & 0x1000)!=0))); 214 format_bigendian = ((spec->format & 0x1000) != 0);
212 DEBUG_PRINT(("channels=%d, ", spec->channels)); 215
213 DEBUG_PRINT(("freq=%d\n", spec->freq)); 216 DEBUG_PRINT((DEBUG_NAME "asked: %d bits, ", spec->format & 0x00ff));
214 217 DEBUG_PRINT(("signed=%d, ", ((spec->format & 0x8000) != 0)));
215 /* Check formats available */ 218 DEBUG_PRINT(("big endian=%d, ", ((spec->format & 0x1000) != 0)));
216 snd_format = Sndstatus(SND_QUERYFORMATS); 219 DEBUG_PRINT(("channels=%d, ", spec->channels));
217 switch (resolution) { 220 DEBUG_PRINT(("freq=%d\n", spec->freq));
218 case 8: 221
219 if ((snd_format & SND_FORMAT8)==0) { 222 /* Check formats available */
220 SDL_SetError("Mint_CheckAudio: 8 bits samples not supported"); 223 snd_format = Sndstatus(SND_QUERYFORMATS);
221 return -1; 224 switch (resolution) {
222 } 225 case 8:
223 snd_format = Sndstatus(SND_QUERY8BIT); 226 if ((snd_format & SND_FORMAT8) == 0) {
224 break; 227 SDL_SetError("Mint_CheckAudio: 8 bits samples not supported");
225 case 16: 228 return -1;
226 if ((snd_format & SND_FORMAT16)==0) { 229 }
227 SDL_SetError("Mint_CheckAudio: 16 bits samples not supported"); 230 snd_format = Sndstatus(SND_QUERY8BIT);
228 return -1; 231 break;
229 } 232 case 16:
230 snd_format = Sndstatus(SND_QUERY16BIT); 233 if ((snd_format & SND_FORMAT16) == 0) {
231 break; 234 SDL_SetError("Mint_CheckAudio: 16 bits samples not supported");
232 default: 235 return -1;
233 SDL_SetError("Mint_CheckAudio: Unsupported sample resolution"); 236 }
234 return -1; 237 snd_format = Sndstatus(SND_QUERY16BIT);
235 break; 238 break;
236 } 239 default:
237 240 SDL_SetError("Mint_CheckAudio: Unsupported sample resolution");
238 /* Check signed/unsigned format */ 241 return -1;
239 if (format_signed) { 242 break;
240 if (snd_format & SND_FORMATSIGNED) { 243 }
241 /* Ok */ 244
242 } else if (snd_format & SND_FORMATUNSIGNED) { 245 /* Check signed/unsigned format */
243 /* Give unsigned format */ 246 if (format_signed) {
244 spec->format = spec->format & (~0x8000); 247 if (snd_format & SND_FORMATSIGNED) {
245 } 248 /* Ok */
246 } else { 249 } else if (snd_format & SND_FORMATUNSIGNED) {
247 if (snd_format & SND_FORMATUNSIGNED) { 250 /* Give unsigned format */
248 /* Ok */ 251 spec->format = spec->format & (~0x8000);
249 } else if (snd_format & SND_FORMATSIGNED) { 252 }
250 /* Give signed format */ 253 } else {
251 spec->format |= 0x8000; 254 if (snd_format & SND_FORMATUNSIGNED) {
252 } 255 /* Ok */
253 } 256 } else if (snd_format & SND_FORMATSIGNED) {
254 257 /* Give signed format */
255 if (format_bigendian) { 258 spec->format |= 0x8000;
256 if (snd_format & SND_FORMATBIGENDIAN) { 259 }
257 /* Ok */ 260 }
258 } else if (snd_format & SND_FORMATLITTLEENDIAN) { 261
259 /* Give little endian format */ 262 if (format_bigendian) {
260 spec->format = spec->format & (~0x1000); 263 if (snd_format & SND_FORMATBIGENDIAN) {
261 } 264 /* Ok */
262 } else { 265 } else if (snd_format & SND_FORMATLITTLEENDIAN) {
263 if (snd_format & SND_FORMATLITTLEENDIAN) { 266 /* Give little endian format */
264 /* Ok */ 267 spec->format = spec->format & (~0x1000);
265 } else if (snd_format & SND_FORMATBIGENDIAN) { 268 }
266 /* Give big endian format */ 269 } else {
267 spec->format |= 0x1000; 270 if (snd_format & SND_FORMATLITTLEENDIAN) {
268 } 271 /* Ok */
269 } 272 } else if (snd_format & SND_FORMATBIGENDIAN) {
270 273 /* Give big endian format */
271 /* Calculate and select the closest frequency */ 274 spec->format |= 0x1000;
272 MINTAUDIO_freqcount=0; 275 }
273 for (i=1;i<4;i++) { 276 }
274 SDL_MintAudio_AddFrequency(this, 277
275 MASTERCLOCK_44K/(MASTERPREDIV_MILAN*(1<<i)), MASTERCLOCK_44K, 278 /* Calculate and select the closest frequency */
276 (1<<i)-1, -1); 279 MINTAUDIO_freqcount = 0;
277 } 280 for (i = 1; i < 4; i++) {
281 SDL_MintAudio_AddFrequency(this,
282 MASTERCLOCK_44K / (MASTERPREDIV_MILAN *
283 (1 << i)),
284 MASTERCLOCK_44K, (1 << i) - 1, -1);
285 }
278 286
279 #if 1 287 #if 1
280 for (i=0; i<MINTAUDIO_freqcount; i++) { 288 for (i = 0; i < MINTAUDIO_freqcount; i++) {
281 DEBUG_PRINT((DEBUG_NAME "freq %d: %lu Hz, clock %lu, prediv %d\n", 289 DEBUG_PRINT((DEBUG_NAME "freq %d: %lu Hz, clock %lu, prediv %d\n",
282 i, MINTAUDIO_frequencies[i].frequency, MINTAUDIO_frequencies[i].masterclock, 290 i, MINTAUDIO_frequencies[i].frequency,
283 MINTAUDIO_frequencies[i].predivisor 291 MINTAUDIO_frequencies[i].masterclock,
284 )); 292 MINTAUDIO_frequencies[i].predivisor));
285 } 293 }
286 #endif 294 #endif
287 295
288 MINTAUDIO_numfreq=SDL_MintAudio_SearchFrequency(this, spec->freq); 296 MINTAUDIO_numfreq = SDL_MintAudio_SearchFrequency(this, spec->freq);
289 spec->freq=MINTAUDIO_frequencies[MINTAUDIO_numfreq].frequency; 297 spec->freq = MINTAUDIO_frequencies[MINTAUDIO_numfreq].frequency;
290 298
291 DEBUG_PRINT((DEBUG_NAME "obtained: %d bits, ",spec->format & 0x00ff)); 299 DEBUG_PRINT((DEBUG_NAME "obtained: %d bits, ", spec->format & 0x00ff));
292 DEBUG_PRINT(("signed=%d, ", ((spec->format & 0x8000)!=0))); 300 DEBUG_PRINT(("signed=%d, ", ((spec->format & 0x8000) != 0)));
293 DEBUG_PRINT(("big endian=%d, ", ((spec->format & 0x1000)!=0))); 301 DEBUG_PRINT(("big endian=%d, ", ((spec->format & 0x1000) != 0)));
294 DEBUG_PRINT(("channels=%d, ", spec->channels)); 302 DEBUG_PRINT(("channels=%d, ", spec->channels));
295 DEBUG_PRINT(("freq=%d\n", spec->freq)); 303 DEBUG_PRINT(("freq=%d\n", spec->freq));
296 304
297 return 0; 305 return 0;
298 } 306 }
299 307
300 static void Mint_InitAudio(_THIS, SDL_AudioSpec *spec) 308 static void
301 { 309 Mint_InitAudio(_THIS, SDL_AudioSpec * spec)
302 int channels_mode, prediv; 310 {
303 void *buffer; 311 int channels_mode, prediv;
304 312 void *buffer;
305 /* Stop currently playing sound */ 313
306 Buffoper(0); 314 /* Stop currently playing sound */
307 315 Buffoper(0);
308 /* Set replay tracks */ 316
309 Settracks(0,0); 317 /* Set replay tracks */
310 Setmontracks(0); 318 Settracks(0, 0);
311 319 Setmontracks(0);
312 /* Select replay format */ 320
313 switch (spec->format & 0xff) { 321 /* Select replay format */
314 case 8: 322 switch (spec->format & 0xff) {
315 if (spec->channels==2) { 323 case 8:
316 channels_mode=STEREO8; 324 if (spec->channels == 2) {
317 } else { 325 channels_mode = STEREO8;
318 channels_mode=MONO8; 326 } else {
319 } 327 channels_mode = MONO8;
320 break; 328 }
321 case 16: 329 break;
322 if (spec->channels==2) { 330 case 16:
323 channels_mode=STEREO16; 331 if (spec->channels == 2) {
324 } else { 332 channels_mode = STEREO16;
325 channels_mode=MONO16; 333 } else {
326 } 334 channels_mode = MONO16;
327 break; 335 }
328 default: 336 break;
329 channels_mode=STEREO16; 337 default:
330 break; 338 channels_mode = STEREO16;
331 } 339 break;
332 if (Setmode(channels_mode)<0) { 340 }
333 DEBUG_PRINT((DEBUG_NAME "Setmode() failed\n")); 341 if (Setmode(channels_mode) < 0) {
334 } 342 DEBUG_PRINT((DEBUG_NAME "Setmode() failed\n"));
335 343 }
336 prediv = MINTAUDIO_frequencies[MINTAUDIO_numfreq].predivisor; 344
337 Devconnect(DMAPLAY, DAC, CLKEXT, prediv, 1); 345 prediv = MINTAUDIO_frequencies[MINTAUDIO_numfreq].predivisor;
338 346 Devconnect(DMAPLAY, DAC, CLKEXT, prediv, 1);
339 /* Set buffer */ 347
340 buffer = SDL_MintAudio_audiobuf[SDL_MintAudio_numbuf]; 348 /* Set buffer */
341 if (Setbuffer(0, buffer, buffer + spec->size)<0) { 349 buffer = SDL_MintAudio_audiobuf[SDL_MintAudio_numbuf];
342 DEBUG_PRINT((DEBUG_NAME "Setbuffer() failed\n")); 350 if (Setbuffer(0, buffer, buffer + spec->size) < 0) {
343 } 351 DEBUG_PRINT((DEBUG_NAME "Setbuffer() failed\n"));
344 352 }
345 /* Install interrupt */ 353
346 if (NSetinterrupt(2, SI_PLAY, Mint_GsxbInterrupt)<0) { 354 /* Install interrupt */
347 DEBUG_PRINT((DEBUG_NAME "NSetinterrupt() failed\n")); 355 if (NSetinterrupt(2, SI_PLAY, Mint_GsxbInterrupt) < 0) {
348 } 356 DEBUG_PRINT((DEBUG_NAME "NSetinterrupt() failed\n"));
349 357 }
350 /* Go */ 358
351 Buffoper(SB_PLA_ENA|SB_PLA_RPT); 359 /* Go */
352 DEBUG_PRINT((DEBUG_NAME "hardware initialized\n")); 360 Buffoper(SB_PLA_ENA | SB_PLA_RPT);
353 } 361 DEBUG_PRINT((DEBUG_NAME "hardware initialized\n"));
354 362 }
355 static int Mint_OpenAudio(_THIS, SDL_AudioSpec *spec) 363
356 { 364 static int
357 /* Lock sound system */ 365 Mint_OpenAudio(_THIS, SDL_AudioSpec * spec)
358 if (Locksnd()!=1) { 366 {
359 SDL_SetError("Mint_OpenAudio: Audio system already in use"); 367 /* Lock sound system */
360 return(-1); 368 if (Locksnd() != 1) {
361 } 369 SDL_SetError("Mint_OpenAudio: Audio system already in use");
362 370 return (-1);
363 SDL_MintAudio_device = this; 371 }
364 372
365 /* Check audio capabilities */ 373 SDL_MintAudio_device = this;
366 if (Mint_CheckAudio(this, spec)==-1) { 374
367 return -1; 375 /* Check audio capabilities */
368 } 376 if (Mint_CheckAudio(this, spec) == -1) {
369 377 return -1;
370 SDL_CalculateAudioSpec(spec); 378 }
371 379
372 /* Allocate memory for audio buffers in DMA-able RAM */ 380 SDL_CalculateAudioSpec(spec);
373 DEBUG_PRINT((DEBUG_NAME "buffer size=%d\n", spec->size)); 381
374 382 /* Allocate memory for audio buffers in DMA-able RAM */
375 SDL_MintAudio_audiobuf[0] = Atari_SysMalloc(spec->size *2, MX_STRAM); 383 DEBUG_PRINT((DEBUG_NAME "buffer size=%d\n", spec->size));
376 if (SDL_MintAudio_audiobuf[0]==NULL) { 384
377 SDL_SetError("MINT_OpenAudio: Not enough memory for audio buffer"); 385 SDL_MintAudio_audiobuf[0] = Atari_SysMalloc(spec->size * 2, MX_STRAM);
378 return (-1); 386 if (SDL_MintAudio_audiobuf[0] == NULL) {
379 } 387 SDL_SetError("MINT_OpenAudio: Not enough memory for audio buffer");
380 SDL_MintAudio_audiobuf[1] = SDL_MintAudio_audiobuf[0] + spec->size ; 388 return (-1);
381 SDL_MintAudio_numbuf=0; 389 }
382 SDL_memset(SDL_MintAudio_audiobuf[0], spec->silence, spec->size *2); 390 SDL_MintAudio_audiobuf[1] = SDL_MintAudio_audiobuf[0] + spec->size;
383 SDL_MintAudio_audiosize = spec->size; 391 SDL_MintAudio_numbuf = 0;
384 SDL_MintAudio_mutex = 0; 392 SDL_memset(SDL_MintAudio_audiobuf[0], spec->silence, spec->size * 2);
385 393 SDL_MintAudio_audiosize = spec->size;
386 DEBUG_PRINT((DEBUG_NAME "buffer 0 at 0x%08x\n", SDL_MintAudio_audiobuf[0])); 394 SDL_MintAudio_mutex = 0;
387 DEBUG_PRINT((DEBUG_NAME "buffer 1 at 0x%08x\n", SDL_MintAudio_audiobuf[1])); 395
388 396 DEBUG_PRINT((DEBUG_NAME "buffer 0 at 0x%08x\n",
389 /* Setup audio hardware */ 397 SDL_MintAudio_audiobuf[0]));
390 Mint_InitAudio(this, spec); 398 DEBUG_PRINT((DEBUG_NAME "buffer 1 at 0x%08x\n",
391 399 SDL_MintAudio_audiobuf[1]));
392 return(1); /* We don't use threaded audio */ 400
393 } 401 /* Setup audio hardware */
394 402 Mint_InitAudio(this, spec);
395 static void Mint_GsxbInterrupt(void) 403
396 { 404 return (1); /* We don't use threaded audio */
397 Uint8 *newbuf; 405 }
398 406
399 if (SDL_MintAudio_mutex) 407 static void
400 return; 408 Mint_GsxbInterrupt(void)
401 409 {
402 SDL_MintAudio_mutex=1; 410 Uint8 *newbuf;
403 411
404 SDL_MintAudio_numbuf ^= 1; 412 if (SDL_MintAudio_mutex)
405 SDL_MintAudio_Callback(); 413 return;
406 newbuf = SDL_MintAudio_audiobuf[SDL_MintAudio_numbuf]; 414
407 Setbuffer(0, newbuf, newbuf + SDL_MintAudio_audiosize); 415 SDL_MintAudio_mutex = 1;
408 416
409 SDL_MintAudio_mutex=0; 417 SDL_MintAudio_numbuf ^= 1;
410 } 418 SDL_MintAudio_Callback();
411 419 newbuf = SDL_MintAudio_audiobuf[SDL_MintAudio_numbuf];
412 static void Mint_GsxbNullInterrupt(void) 420 Setbuffer(0, newbuf, newbuf + SDL_MintAudio_audiosize);
413 { 421
414 } 422 SDL_MintAudio_mutex = 0;
423 }
424
425 static void
426 Mint_GsxbNullInterrupt(void)
427 {
428 }
429
430 /* vi: set ts=4 sw=4 expandtab: */