Skip to content
This repository has been archived by the owner on Feb 11, 2021. It is now read-only.

Latest commit

 

History

History
331 lines (264 loc) · 8.87 KB

SDL_mintaudio_stfa.c

File metadata and controls

331 lines (264 loc) · 8.87 KB
 
1
2
/*
SDL - Simple DirectMedia Layer
Jan 4, 2004
Jan 4, 2004
3
Copyright (C) 1997-2004 Sam Lantinga
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Sam Lantinga
slouken@libsdl.org
*/
Feb 21, 2006
Feb 21, 2006
22
#include "SDL_config.h"
23
24
25
26
27
28
29
30
31
32
33
34
35
36
/*
MiNT audio driver
using XBIOS functions (STFA driver)
Patrice Mandin
*/
/* Mint includes */
#include <mint/osbind.h>
#include <mint/falcon.h>
#include <mint/cookie.h>
#include "SDL_audio.h"
Feb 16, 2006
Feb 16, 2006
37
38
#include "../SDL_audio_c.h"
#include "../SDL_sysaudio.h"
39
Feb 21, 2006
Feb 21, 2006
40
#include "../../video/ataricommon/SDL_atarimxalloc_c.h"
41
42
43
44
45
46
47
48
49
50
#include "SDL_mintaudio.h"
#include "SDL_mintaudio_stfa.h"
/*--- Defines ---*/
#define MINT_AUDIO_DRIVER_NAME "mint_stfa"
/* Debug print info */
#define DEBUG_NAME "audio:stfa: "
Oct 29, 2004
Oct 29, 2004
51
#if 0
52
53
54
55
56
57
58
59
60
61
62
63
64
#define DEBUG_PRINT(what) \
{ \
printf what; \
}
#else
#define DEBUG_PRINT(what)
#endif
/*--- Static variables ---*/
static unsigned long cookie_snd, cookie_mch;
static cookie_stfa_t *cookie_stfa;
May 28, 2006
May 28, 2006
65
66
67
68
69
static const int freqs[16] = {
4995, 6269, 7493, 8192,
9830, 10971, 12538, 14985,
16384, 19819, 21943, 24576,
30720, 32336, 43885, 49152
70
71
72
73
};
/*--- Audio driver functions ---*/
May 28, 2006
May 28, 2006
74
75
76
77
static void Mint_CloseAudio (_THIS);
static int Mint_OpenAudio (_THIS, SDL_AudioSpec * spec);
static void Mint_LockAudio (_THIS);
static void Mint_UnlockAudio (_THIS);
78
79
/* To check/init hardware audio */
May 28, 2006
May 28, 2006
80
81
static int Mint_CheckAudio (_THIS, SDL_AudioSpec * spec);
static void Mint_InitAudio (_THIS, SDL_AudioSpec * spec);
82
83
84
/*--- Audio driver bootstrap functions ---*/
May 28, 2006
May 28, 2006
85
86
static int
Audio_Available (void)
87
{
May 28, 2006
May 28, 2006
88
const char *envr = SDL_getenv ("SDL_AUDIODRIVER");
89
May 28, 2006
May 28, 2006
90
91
92
93
94
/* Check if user asked a different audio driver */
if ((envr) && (SDL_strcmp (envr, MINT_AUDIO_DRIVER_NAME) != 0)) {
DEBUG_PRINT ((DEBUG_NAME "user asked a different audio driver\n"));
return (0);
}
95
May 28, 2006
May 28, 2006
96
97
98
99
/* Cookie _MCH present ? if not, assume ST machine */
if (Getcookie (C__MCH, &cookie_mch) == C_NOTFOUND) {
cookie_mch = MCH_ST;
}
100
May 28, 2006
May 28, 2006
101
102
103
104
/* Cookie _SND present ? if not, assume ST machine */
if (Getcookie (C__SND, &cookie_snd) == C_NOTFOUND) {
cookie_snd = SND_PSG;
}
105
May 28, 2006
May 28, 2006
106
107
108
109
110
/* Cookie STFA present ? */
if (Getcookie (C_STFA, (long *) &cookie_stfa) != C_FOUND) {
DEBUG_PRINT ((DEBUG_NAME "no STFA audio\n"));
return (0);
}
111
May 28, 2006
May 28, 2006
112
SDL_MintAudio_stfa = cookie_stfa;
113
May 28, 2006
May 28, 2006
114
115
DEBUG_PRINT ((DEBUG_NAME "STFA audio available!\n"));
return (1);
116
117
}
May 28, 2006
May 28, 2006
118
119
static void
Audio_DeleteDevice (SDL_AudioDevice * device)
120
{
May 28, 2006
May 28, 2006
121
122
SDL_free (device->hidden);
SDL_free (device);
123
124
}
May 28, 2006
May 28, 2006
125
126
static SDL_AudioDevice *
Audio_CreateDevice (int devindex)
127
{
May 28, 2006
May 28, 2006
128
SDL_AudioDevice *this;
129
May 28, 2006
May 28, 2006
130
131
132
133
/* Initialize all variables that we clean on shutdown */
this = (SDL_AudioDevice *) SDL_malloc (sizeof (SDL_AudioDevice));
if (this) {
SDL_memset (this, 0, (sizeof *this));
134
this->hidden = (struct SDL_PrivateAudioData *)
May 28, 2006
May 28, 2006
135
SDL_malloc ((sizeof *this->hidden));
136
}
May 28, 2006
May 28, 2006
137
138
139
140
if ((this == NULL) || (this->hidden == NULL)) {
SDL_OutOfMemory ();
if (this) {
SDL_free (this);
141
}
May 28, 2006
May 28, 2006
142
return (0);
143
}
May 28, 2006
May 28, 2006
144
SDL_memset (this->hidden, 0, (sizeof *this->hidden));
145
146
/* Set the function pointers */
May 28, 2006
May 28, 2006
147
148
149
this->OpenAudio = Mint_OpenAudio;
this->CloseAudio = Mint_CloseAudio;
this->LockAudio = Mint_LockAudio;
150
this->UnlockAudio = Mint_UnlockAudio;
May 28, 2006
May 28, 2006
151
this->free = Audio_DeleteDevice;
152
153
154
155
156
return this;
}
AudioBootStrap MINTAUDIO_STFA_bootstrap = {
May 28, 2006
May 28, 2006
157
158
MINT_AUDIO_DRIVER_NAME, "MiNT STFA audio driver",
Audio_Available, Audio_CreateDevice
159
160
};
May 28, 2006
May 28, 2006
161
162
static void
Mint_LockAudio (_THIS)
163
{
May 28, 2006
May 28, 2006
164
void *oldpile;
165
May 28, 2006
May 28, 2006
166
167
168
169
/* Stop replay */
oldpile = (void *) Super (0);
cookie_stfa->sound_enable = STFA_PLAY_DISABLE;
Super (oldpile);
170
171
}
May 28, 2006
May 28, 2006
172
173
static void
Mint_UnlockAudio (_THIS)
174
{
May 28, 2006
May 28, 2006
175
void *oldpile;
176
May 28, 2006
May 28, 2006
177
178
179
180
/* Restart replay */
oldpile = (void *) Super (0);
cookie_stfa->sound_enable = STFA_PLAY_ENABLE | STFA_PLAY_REPEAT;
Super (oldpile);
181
182
}
May 28, 2006
May 28, 2006
183
184
static void
Mint_CloseAudio (_THIS)
185
{
May 28, 2006
May 28, 2006
186
void *oldpile;
187
May 28, 2006
May 28, 2006
188
189
190
191
/* Stop replay */
oldpile = (void *) Super (0);
cookie_stfa->sound_enable = STFA_PLAY_DISABLE;
Super (oldpile);
192
May 28, 2006
May 28, 2006
193
194
195
/* Wait if currently playing sound */
while (SDL_MintAudio_mutex != 0) {
}
196
May 28, 2006
May 28, 2006
197
198
199
200
201
/* Clear buffers */
if (SDL_MintAudio_audiobuf[0]) {
Mfree (SDL_MintAudio_audiobuf[0]);
SDL_MintAudio_audiobuf[0] = SDL_MintAudio_audiobuf[1] = NULL;
}
202
203
}
May 28, 2006
May 28, 2006
204
205
static int
Mint_CheckAudio (_THIS, SDL_AudioSpec * spec)
206
{
May 28, 2006
May 28, 2006
207
208
209
210
211
212
213
214
215
216
217
218
219
int i;
DEBUG_PRINT ((DEBUG_NAME "asked: %d bits, ", spec->format & 0x00ff));
DEBUG_PRINT (("signed=%d, ", ((spec->format & 0x8000) != 0)));
DEBUG_PRINT (("big endian=%d, ", ((spec->format & 0x1000) != 0)));
DEBUG_PRINT (("channels=%d, ", spec->channels));
DEBUG_PRINT (("freq=%d\n", spec->freq));
/* Check formats available */
MINTAUDIO_freqcount = 0;
for (i = 0; i < 16; i++) {
SDL_MintAudio_AddFrequency (this, freqs[i], 0, i, -1);
}
220
Oct 29, 2004
Oct 29, 2004
221
#if 1
May 28, 2006
May 28, 2006
222
223
224
225
226
227
for (i = 0; i < MINTAUDIO_freqcount; i++) {
DEBUG_PRINT ((DEBUG_NAME "freq %d: %lu Hz, clock %lu, prediv %d\n",
i, MINTAUDIO_frequencies[i].frequency,
MINTAUDIO_frequencies[i].masterclock,
MINTAUDIO_frequencies[i].predivisor));
}
Oct 29, 2004
Oct 29, 2004
228
229
#endif
May 28, 2006
May 28, 2006
230
231
MINTAUDIO_numfreq = SDL_MintAudio_SearchFrequency (this, spec->freq);
spec->freq = MINTAUDIO_frequencies[MINTAUDIO_numfreq].frequency;
232
May 28, 2006
May 28, 2006
233
234
235
236
237
DEBUG_PRINT ((DEBUG_NAME "obtained: %d bits, ", spec->format & 0x00ff));
DEBUG_PRINT (("signed=%d, ", ((spec->format & 0x8000) != 0)));
DEBUG_PRINT (("big endian=%d, ", ((spec->format & 0x1000) != 0)));
DEBUG_PRINT (("channels=%d, ", spec->channels));
DEBUG_PRINT (("freq=%d\n", spec->freq));
238
May 28, 2006
May 28, 2006
239
return 0;
240
241
}
May 28, 2006
May 28, 2006
242
243
static void
Mint_InitAudio (_THIS, SDL_AudioSpec * spec)
244
{
May 28, 2006
May 28, 2006
245
246
void *buffer;
void *oldpile;
247
May 28, 2006
May 28, 2006
248
buffer = SDL_MintAudio_audiobuf[SDL_MintAudio_numbuf];
249
May 28, 2006
May 28, 2006
250
oldpile = (void *) Super (0);
251
May 28, 2006
May 28, 2006
252
253
/* Stop replay */
cookie_stfa->sound_enable = STFA_PLAY_DISABLE;
254
May 28, 2006
May 28, 2006
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
/* Select replay format */
cookie_stfa->sound_control =
MINTAUDIO_frequencies[MINTAUDIO_numfreq].predivisor;
if ((spec->format & 0xff) == 8) {
cookie_stfa->sound_control |= STFA_FORMAT_8BIT;
} else {
cookie_stfa->sound_control |= STFA_FORMAT_16BIT;
}
if (spec->channels == 2) {
cookie_stfa->sound_control |= STFA_FORMAT_STEREO;
} else {
cookie_stfa->sound_control |= STFA_FORMAT_MONO;
}
if ((spec->format & 0x8000) != 0) {
cookie_stfa->sound_control |= STFA_FORMAT_SIGNED;
} else {
cookie_stfa->sound_control |= STFA_FORMAT_UNSIGNED;
}
if ((spec->format & 0x1000) != 0) {
cookie_stfa->sound_control |= STFA_FORMAT_BIGENDIAN;
} else {
cookie_stfa->sound_control |= STFA_FORMAT_LITENDIAN;
}
278
May 28, 2006
May 28, 2006
279
280
281
/* Set buffer */
cookie_stfa->sound_start = (unsigned long) buffer;
cookie_stfa->sound_end = (unsigned long) (buffer + spec->size);
282
May 28, 2006
May 28, 2006
283
284
/* Set interrupt */
cookie_stfa->stfa_it = SDL_MintAudio_StfaInterrupt;
285
May 28, 2006
May 28, 2006
286
287
/* Restart replay */
cookie_stfa->sound_enable = STFA_PLAY_ENABLE | STFA_PLAY_REPEAT;
288
May 28, 2006
May 28, 2006
289
Super (oldpile);
290
May 28, 2006
May 28, 2006
291
DEBUG_PRINT ((DEBUG_NAME "hardware initialized\n"));
292
293
}
May 28, 2006
May 28, 2006
294
295
static int
Mint_OpenAudio (_THIS, SDL_AudioSpec * spec)
296
{
May 28, 2006
May 28, 2006
297
SDL_MintAudio_device = this;
298
May 28, 2006
May 28, 2006
299
300
301
302
/* Check audio capabilities */
if (Mint_CheckAudio (this, spec) == -1) {
return -1;
}
303
May 28, 2006
May 28, 2006
304
SDL_CalculateAudioSpec (spec);
305
May 28, 2006
May 28, 2006
306
307
/* Allocate memory for audio buffers in DMA-able RAM */
DEBUG_PRINT ((DEBUG_NAME "buffer size=%d\n", spec->size));
308
May 28, 2006
May 28, 2006
309
310
311
312
313
314
315
316
317
318
SDL_MintAudio_audiobuf[0] = Atari_SysMalloc (spec->size * 2, MX_STRAM);
if (SDL_MintAudio_audiobuf[0] == NULL) {
SDL_SetError ("MINT_OpenAudio: Not enough memory for audio buffer");
return (-1);
}
SDL_MintAudio_audiobuf[1] = SDL_MintAudio_audiobuf[0] + spec->size;
SDL_MintAudio_numbuf = 0;
SDL_memset (SDL_MintAudio_audiobuf[0], spec->silence, spec->size * 2);
SDL_MintAudio_audiosize = spec->size;
SDL_MintAudio_mutex = 0;
319
May 28, 2006
May 28, 2006
320
321
322
323
DEBUG_PRINT ((DEBUG_NAME "buffer 0 at 0x%08x\n",
SDL_MintAudio_audiobuf[0]));
DEBUG_PRINT ((DEBUG_NAME "buffer 1 at 0x%08x\n",
SDL_MintAudio_audiobuf[1]));
324
May 28, 2006
May 28, 2006
325
326
/* Setup audio hardware */
Mint_InitAudio (this, spec);
327
May 28, 2006
May 28, 2006
328
return (1); /* We don't use threaded audio */
329
}
May 28, 2006
May 28, 2006
330
331
/* vi: set ts=4 sw=4 expandtab: */