Mercurial > sdl-ios-xcode
comparison src/audio/mint/SDL_mintaudio_gsxb.c @ 961:185acc07127a
Date: Fri, 29 Oct 2004 11:47:09 +0200
From: Patrice Mandin
Subject: Reworked audio drivers for Atari platform
These are reworked audio drivers for the Atari platform.
Previous drivers were missing some features:
- Test external clock plugged to DSP port on Atari Falcon 030.
- Ability to select internal or external clock.
So now, I generate a list of frequencies available, with the master clock
and predivisor to use. One big caveat to this: I do not have an external
clock, so I hope it works.
author | Patrice Mandin <patmandin@gmail.com> |
---|---|
date | Fri, 29 Oct 2004 09:56:53 +0000 |
parents | b8d311d90021 |
children | 176240cf4405 |
comparison
equal
deleted
inserted
replaced
960:eec28a5278be | 961:185acc07127a |
---|---|
51 | 51 |
52 #define MINT_AUDIO_DRIVER_NAME "mint_gsxb" | 52 #define MINT_AUDIO_DRIVER_NAME "mint_gsxb" |
53 | 53 |
54 /* Debug print info */ | 54 /* Debug print info */ |
55 #define DEBUG_NAME "audio:gsxb: " | 55 #define DEBUG_NAME "audio:gsxb: " |
56 #if 0 | 56 #if 1 |
57 #define DEBUG_PRINT(what) \ | 57 #define DEBUG_PRINT(what) \ |
58 { \ | 58 { \ |
59 printf what; \ | 59 printf what; \ |
60 } | 60 } |
61 #else | 61 #else |
177 static void Mint_CloseAudio(_THIS) | 177 static void Mint_CloseAudio(_THIS) |
178 { | 178 { |
179 /* Stop replay */ | 179 /* Stop replay */ |
180 Buffoper(0); | 180 Buffoper(0); |
181 | 181 |
182 DEBUG_PRINT((DEBUG_NAME "closeaudio: replay stopped\n")); | |
183 | |
184 /* Uninstall interrupt */ | 182 /* Uninstall interrupt */ |
185 if (NSetinterrupt(2, SI_NONE, SDL_MintAudio_EmptyGsxbInterrupt)<0) { | 183 if (NSetinterrupt(2, SI_NONE, SDL_MintAudio_EmptyGsxbInterrupt)<0) { |
186 DEBUG_PRINT((DEBUG_NAME "NSetinterrupt() failed in close\n")); | 184 DEBUG_PRINT((DEBUG_NAME "NSetinterrupt() failed in close\n")); |
187 } | 185 } |
188 | 186 |
189 DEBUG_PRINT((DEBUG_NAME "closeaudio: interrupt disabled\n")); | |
190 | |
191 /* Wait if currently playing sound */ | 187 /* Wait if currently playing sound */ |
192 while (SDL_MintAudio_mutex != 0) { | 188 while (SDL_MintAudio_mutex != 0) { |
193 } | 189 } |
194 | |
195 DEBUG_PRINT((DEBUG_NAME "closeaudio: no more interrupt running\n")); | |
196 | 190 |
197 /* Clear buffers */ | 191 /* Clear buffers */ |
198 if (SDL_MintAudio_audiobuf[0]) { | 192 if (SDL_MintAudio_audiobuf[0]) { |
199 Mfree(SDL_MintAudio_audiobuf[0]); | 193 Mfree(SDL_MintAudio_audiobuf[0]); |
200 SDL_MintAudio_audiobuf[0] = SDL_MintAudio_audiobuf[1] = NULL; | 194 SDL_MintAudio_audiobuf[0] = SDL_MintAudio_audiobuf[1] = NULL; |
201 } | 195 } |
202 | |
203 DEBUG_PRINT((DEBUG_NAME "closeaudio: buffers freed\n")); | |
204 | 196 |
205 /* Unlock sound system */ | 197 /* Unlock sound system */ |
206 Unlocksnd(); | 198 Unlocksnd(); |
207 } | 199 } |
208 | 200 |
276 spec->format |= 0x1000; | 268 spec->format |= 0x1000; |
277 } | 269 } |
278 } | 270 } |
279 | 271 |
280 /* Calculate and select the closest frequency */ | 272 /* Calculate and select the closest frequency */ |
281 MINTAUDIO_sfreq=1; | 273 MINTAUDIO_freqcount=0; |
282 MINTAUDIO_nfreq=12; | 274 for (i=1;i<4;i++) { |
283 for (i=MINTAUDIO_sfreq;i<MINTAUDIO_nfreq;i++) { | 275 SDL_MintAudio_AddFrequency(this, MASTERCLOCK_44K/(MASTERPREDIV_MILAN*(1<<i)), MASTERCLOCK_44K, (1<<i)-1); |
284 MINTAUDIO_hardfreq[i]=MASTERCLOCK_44K/(MASTERPREDIV_MILAN*(i+1)); | 276 } |
285 DEBUG_PRINT((DEBUG_NAME "calc:freq(%d)=%lu\n", i, MINTAUDIO_hardfreq[i])); | 277 |
286 } | 278 #if 1 |
287 | 279 for (i=0; i<MINTAUDIO_freqcount; i++) { |
288 MINTAUDIO_numfreq=SDL_MintAudio_SearchFrequency(this, 1, spec->freq); | 280 DEBUG_PRINT((DEBUG_NAME "freq %d: %lu Hz, clock %lu, prediv %d\n", |
289 spec->freq=MINTAUDIO_hardfreq[MINTAUDIO_numfreq]; | 281 i, MINTAUDIO_frequencies[i].frequency, MINTAUDIO_frequencies[i].masterclock, |
282 MINTAUDIO_frequencies[i].predivisor | |
283 )); | |
284 } | |
285 #endif | |
286 | |
287 MINTAUDIO_numfreq=SDL_MintAudio_SearchFrequency(this, spec->freq); | |
288 spec->freq=MINTAUDIO_frequencies[MINTAUDIO_numfreq].frequency; | |
290 | 289 |
291 DEBUG_PRINT((DEBUG_NAME "obtained: %d bits, ",spec->format & 0x00ff)); | 290 DEBUG_PRINT((DEBUG_NAME "obtained: %d bits, ",spec->format & 0x00ff)); |
292 DEBUG_PRINT(("signed=%d, ", ((spec->format & 0x8000)!=0))); | 291 DEBUG_PRINT(("signed=%d, ", ((spec->format & 0x8000)!=0))); |
293 DEBUG_PRINT(("big endian=%d, ", ((spec->format & 0x1000)!=0))); | 292 DEBUG_PRINT(("big endian=%d, ", ((spec->format & 0x1000)!=0))); |
294 DEBUG_PRINT(("channels=%d, ", spec->channels)); | 293 DEBUG_PRINT(("channels=%d, ", spec->channels)); |
297 return 0; | 296 return 0; |
298 } | 297 } |
299 | 298 |
300 static void Mint_InitAudio(_THIS, SDL_AudioSpec *spec) | 299 static void Mint_InitAudio(_THIS, SDL_AudioSpec *spec) |
301 { | 300 { |
302 int channels_mode; | 301 int channels_mode, prediv; |
303 void *buffer; | 302 void *buffer; |
304 | 303 |
305 /* Stop currently playing sound */ | 304 /* Stop currently playing sound */ |
306 Buffoper(0); | 305 Buffoper(0); |
307 | 306 |
331 } | 330 } |
332 if (Setmode(channels_mode)<0) { | 331 if (Setmode(channels_mode)<0) { |
333 DEBUG_PRINT((DEBUG_NAME "Setmode() failed\n")); | 332 DEBUG_PRINT((DEBUG_NAME "Setmode() failed\n")); |
334 } | 333 } |
335 | 334 |
336 Devconnect(DMAPLAY, DAC, CLKEXT, MINTAUDIO_numfreq, 1); | 335 prediv = MINTAUDIO_frequencies[MINTAUDIO_numfreq].predivisor; |
336 Devconnect(DMAPLAY, DAC, CLKEXT, prediv, 1); | |
337 | 337 |
338 /* Set buffer */ | 338 /* Set buffer */ |
339 buffer = SDL_MintAudio_audiobuf[SDL_MintAudio_numbuf]; | 339 buffer = SDL_MintAudio_audiobuf[SDL_MintAudio_numbuf]; |
340 if (Setbuffer(0, buffer, buffer + spec->size)<0) { | 340 if (Setbuffer(0, buffer, buffer + spec->size)<0) { |
341 DEBUG_PRINT((DEBUG_NAME "Setbuffer() failed\n")); | 341 DEBUG_PRINT((DEBUG_NAME "Setbuffer() failed\n")); |