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

Latest commit

 

History

History
308 lines (249 loc) · 8.58 KB

SDL_mintaudio_stfa.c

File metadata and controls

308 lines (249 loc) · 8.58 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
#define DEBUG_PRINT(what) \
{ \
printf what; \
}
#else
#define DEBUG_PRINT(what)
#endif
/*--- Static variables ---*/
Oct 7, 2006
Oct 7, 2006
62
63
64
static unsigned long cookie_snd = 0;
static unsigned long cookie_mch = 0;
static cookie_stfa_t *cookie_stfa = NULL;
65
Jul 10, 2006
Jul 10, 2006
66
67
68
69
70
static const int freqs[16] = {
4995, 6269, 7493, 8192,
9830, 10971, 12538, 14985,
16384, 19819, 21943, 24576,
30720, 32336, 43885, 49152
71
72
};
Jul 10, 2006
Jul 10, 2006
73
static int
Oct 7, 2006
Oct 7, 2006
74
MINTSTFA_Available(void)
75
{
Jul 10, 2006
Jul 10, 2006
76
77
78
79
/* Cookie _MCH present ? if not, assume ST machine */
if (Getcookie(C__MCH, &cookie_mch) == C_NOTFOUND) {
cookie_mch = MCH_ST;
}
80
Jul 10, 2006
Jul 10, 2006
81
82
83
84
/* Cookie _SND present ? if not, assume ST machine */
if (Getcookie(C__SND, &cookie_snd) == C_NOTFOUND) {
cookie_snd = SND_PSG;
}
85
Jul 10, 2006
Jul 10, 2006
86
87
88
89
90
/* Cookie STFA present ? */
if (Getcookie(C_STFA, (long *) &cookie_stfa) != C_FOUND) {
DEBUG_PRINT((DEBUG_NAME "no STFA audio\n"));
return (0);
}
91
Jul 10, 2006
Jul 10, 2006
92
SDL_MintAudio_stfa = cookie_stfa;
93
Jul 10, 2006
Jul 10, 2006
94
95
DEBUG_PRINT((DEBUG_NAME "STFA audio available!\n"));
return (1);
96
97
}
Jul 10, 2006
Jul 10, 2006
98
static void
Oct 7, 2006
Oct 7, 2006
99
MINTSTFA_LockDevice(_THIS)
100
{
Jul 10, 2006
Jul 10, 2006
101
/* Stop replay */
Oct 7, 2006
Oct 7, 2006
102
void *oldpile = (void *) Super(0);
Jul 10, 2006
Jul 10, 2006
103
104
cookie_stfa->sound_enable = STFA_PLAY_DISABLE;
Super(oldpile);
105
106
}
Jul 10, 2006
Jul 10, 2006
107
static void
Oct 7, 2006
Oct 7, 2006
108
MINTSTFA_UnlockDevice(_THIS)
109
{
Jul 10, 2006
Jul 10, 2006
110
/* Restart replay */
Oct 7, 2006
Oct 7, 2006
111
void *oldpile = (void *) Super(0);
Jul 10, 2006
Jul 10, 2006
112
113
cookie_stfa->sound_enable = STFA_PLAY_ENABLE | STFA_PLAY_REPEAT;
Super(oldpile);
114
115
}
Jul 10, 2006
Jul 10, 2006
116
static void
Oct 7, 2006
Oct 7, 2006
117
MINTSTFA_CloseDevice(_THIS)
118
{
Oct 7, 2006
Oct 7, 2006
119
120
121
122
123
124
125
126
127
128
129
130
131
132
if (this->hidden != NULL) {
/* Stop replay */
void *oldpile = (void *) Super(0);
cookie_stfa->sound_enable = STFA_PLAY_DISABLE;
Super(oldpile);
/* Wait if currently playing sound */
while (SDL_MintAudio_mutex != 0) {}
/* Clear buffers */
if (SDL_MintAudio_audiobuf[0]) {
Mfree(SDL_MintAudio_audiobuf[0]);
SDL_MintAudio_audiobuf[0] = SDL_MintAudio_audiobuf[1] = NULL;
}
133
Oct 7, 2006
Oct 7, 2006
134
135
SDL_free(this->hidden);
this->hidden = NULL;
Jul 10, 2006
Jul 10, 2006
136
}
137
138
}
Jul 10, 2006
Jul 10, 2006
139
static int
Oct 7, 2006
Oct 7, 2006
140
MINTSTFA_CheckAudio(_THIS)
141
{
Jul 10, 2006
Jul 10, 2006
142
143
int i;
Sep 24, 2006
Sep 24, 2006
144
DEBUG_PRINT((DEBUG_NAME "asked: %d bits, ",
Oct 7, 2006
Oct 7, 2006
145
146
147
148
149
150
151
152
153
SDL_AUDIO_BITSIZE(this->spec.format)));
DEBUG_PRINT(("float=%d, ", SDL_AUDIO_ISFLOAT(this->spec.format)));
DEBUG_PRINT(("signed=%d, ", SDL_AUDIO_ISSIGNED(this->spec.format)));
DEBUG_PRINT(("big endian=%d, ", SDL_AUDIO_ISBIGENDIAN(this->spec.format)));
DEBUG_PRINT(("channels=%d, ", this->spec.channels));
DEBUG_PRINT(("freq=%d\n", this->spec.freq));
if (SDL_AUDIO_BITSIZE(this->spec.format) > 16) {
this->spec.format = AUDIO_S16SYS; /* clamp out int32/float32 ... */
Sep 1, 2006
Sep 1, 2006
154
155
}
Oct 7, 2006
Oct 7, 2006
156
157
if (this->spec.channels > 2) {
this->spec.channels = 2; /* no more than stereo! */
Sep 1, 2006
Sep 1, 2006
158
159
}
Jul 10, 2006
Jul 10, 2006
160
161
162
163
164
/* Check formats available */
MINTAUDIO_freqcount = 0;
for (i = 0; i < 16; i++) {
SDL_MintAudio_AddFrequency(this, freqs[i], 0, i, -1);
}
165
Oct 29, 2004
Oct 29, 2004
166
#if 1
Jul 10, 2006
Jul 10, 2006
167
168
169
170
171
172
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
173
174
#endif
Oct 7, 2006
Oct 7, 2006
175
176
MINTAUDIO_numfreq = SDL_MintAudio_SearchFrequency(this, this->spec.freq);
this->spec.freq = MINTAUDIO_frequencies[MINTAUDIO_numfreq].frequency;
177
Sep 24, 2006
Sep 24, 2006
178
DEBUG_PRINT((DEBUG_NAME "obtained: %d bits, ",
Oct 7, 2006
Oct 7, 2006
179
180
181
182
183
184
SDL_AUDIO_BITSIZE(this->spec.format)));
DEBUG_PRINT(("float=%d, ", SDL_AUDIO_ISFLOAT(this->spec.format)));
DEBUG_PRINT(("signed=%d, ", SDL_AUDIO_ISSIGNED(this->spec.format)));
DEBUG_PRINT(("big endian=%d, ", SDL_AUDIO_ISBIGENDIAN(this->spec.format)));
DEBUG_PRINT(("channels=%d, ", this->spec.channels));
DEBUG_PRINT(("freq=%d\n", this->spec.freq));
185
Jul 10, 2006
Jul 10, 2006
186
return 0;
187
188
}
Jul 10, 2006
Jul 10, 2006
189
static void
Oct 7, 2006
Oct 7, 2006
190
MINTSTFA_InitAudio(_THIS)
191
{
Oct 7, 2006
Oct 7, 2006
192
193
void *buffer = SDL_MintAudio_audiobuf[SDL_MintAudio_numbuf];
void *oldpile = (void *) Super(0);
194
Jul 10, 2006
Jul 10, 2006
195
196
/* Stop replay */
cookie_stfa->sound_enable = STFA_PLAY_DISABLE;
197
Jul 10, 2006
Jul 10, 2006
198
199
200
/* Select replay format */
cookie_stfa->sound_control =
MINTAUDIO_frequencies[MINTAUDIO_numfreq].predivisor;
Oct 7, 2006
Oct 7, 2006
201
if (SDL_AUDIO_BITSIZE(this->spec.format) == 8) {
Jul 10, 2006
Jul 10, 2006
202
203
204
205
cookie_stfa->sound_control |= STFA_FORMAT_8BIT;
} else {
cookie_stfa->sound_control |= STFA_FORMAT_16BIT;
}
Oct 7, 2006
Oct 7, 2006
206
if (this->spec.channels == 2) {
Jul 10, 2006
Jul 10, 2006
207
208
209
210
cookie_stfa->sound_control |= STFA_FORMAT_STEREO;
} else {
cookie_stfa->sound_control |= STFA_FORMAT_MONO;
}
Oct 7, 2006
Oct 7, 2006
211
if (SDL_AUDIO_ISSIGNED(this->spec.format) != 0) {
Jul 10, 2006
Jul 10, 2006
212
213
214
215
cookie_stfa->sound_control |= STFA_FORMAT_SIGNED;
} else {
cookie_stfa->sound_control |= STFA_FORMAT_UNSIGNED;
}
Oct 7, 2006
Oct 7, 2006
216
if (SDL_AUDIO_ISBIGENDIAN(this->spec.format) != 0) {
Jul 10, 2006
Jul 10, 2006
217
218
219
220
cookie_stfa->sound_control |= STFA_FORMAT_BIGENDIAN;
} else {
cookie_stfa->sound_control |= STFA_FORMAT_LITENDIAN;
}
221
Jul 10, 2006
Jul 10, 2006
222
223
/* Set buffer */
cookie_stfa->sound_start = (unsigned long) buffer;
Oct 7, 2006
Oct 7, 2006
224
cookie_stfa->sound_end = (unsigned long) (buffer + this->spec.size);
225
Jul 10, 2006
Jul 10, 2006
226
227
/* Set interrupt */
cookie_stfa->stfa_it = SDL_MintAudio_StfaInterrupt;
228
Jul 10, 2006
Jul 10, 2006
229
230
/* Restart replay */
cookie_stfa->sound_enable = STFA_PLAY_ENABLE | STFA_PLAY_REPEAT;
231
Jul 10, 2006
Jul 10, 2006
232
Super(oldpile);
233
Jul 10, 2006
Jul 10, 2006
234
DEBUG_PRINT((DEBUG_NAME "hardware initialized\n"));
235
236
}
Jul 10, 2006
Jul 10, 2006
237
static int
Oct 7, 2006
Oct 7, 2006
238
MINTSTFA_OpenDevice(_THIS, const char *devname, int iscapture)
239
{
Jul 10, 2006
Jul 10, 2006
240
SDL_MintAudio_device = this;
241
Jul 10, 2006
Jul 10, 2006
242
/* Check audio capabilities */
Oct 7, 2006
Oct 7, 2006
243
244
if (MINTSTFA_CheckAudio(this) == -1) {
return 0;
Jul 10, 2006
Jul 10, 2006
245
}
246
Oct 7, 2006
Oct 7, 2006
247
248
249
250
251
252
253
254
255
256
/* Initialize all variables that we clean on shutdown */
this->hidden = (struct SDL_PrivateAudioData *)
SDL_malloc((sizeof *this->hidden));
if (this->hidden == NULL) {
SDL_OutOfMemory();
return 0;
}
SDL_memset(this->hidden, 0, (sizeof *this->hidden));
SDL_CalculateAudioSpec(&this->spec);
257
Jul 10, 2006
Jul 10, 2006
258
/* Allocate memory for audio buffers in DMA-able RAM */
Oct 7, 2006
Oct 7, 2006
259
DEBUG_PRINT((DEBUG_NAME "buffer size=%d\n", this->spec.size));
260
Oct 7, 2006
Oct 7, 2006
261
SDL_MintAudio_audiobuf[0] = Atari_SysMalloc(this->spec.size * 2, MX_STRAM);
Jul 10, 2006
Jul 10, 2006
262
if (SDL_MintAudio_audiobuf[0] == NULL) {
Oct 7, 2006
Oct 7, 2006
263
264
265
266
SDL_OutOfMemory()
SDL_free(this->hidden);
this->hidden = NULL;
return 0;
Jul 10, 2006
Jul 10, 2006
267
}
Oct 7, 2006
Oct 7, 2006
268
SDL_MintAudio_audiobuf[1] = SDL_MintAudio_audiobuf[0] + this->spec.size;
Jul 10, 2006
Jul 10, 2006
269
SDL_MintAudio_numbuf = 0;
Oct 7, 2006
Oct 7, 2006
270
271
SDL_memset(SDL_MintAudio_audiobuf[0],this->spec.silence,this->spec.size*2);
SDL_MintAudio_audiosize = this->spec.size;
Jul 10, 2006
Jul 10, 2006
272
SDL_MintAudio_mutex = 0;
273
Jul 10, 2006
Jul 10, 2006
274
275
276
277
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]));
278
Sep 16, 2006
Sep 16, 2006
279
280
SDL_MintAudio_CheckFpu();
Jul 10, 2006
Jul 10, 2006
281
/* Setup audio hardware */
Oct 7, 2006
Oct 7, 2006
282
MINTSTFA_InitAudio(this);
283
Oct 7, 2006
Oct 7, 2006
284
return 1; /* good to go. */
285
}
Jul 10, 2006
Jul 10, 2006
286
Oct 7, 2006
Oct 7, 2006
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
static int
MINTSTFA_Init(SDL_AudioDriverImpl *impl)
{
/* Set the function pointers */
impl->OpenDevice = MINTSTFA_OpenDevice;
impl->CloseDevice = MINTSTFA_CloseDevice;
impl->LockAudio = MINTSTFA_LockAudio;
impl->UnlockAudio = MINTSTFA_UnlockAudio;
impl->OnlyHasDefaultOutputDevice = 1;
impl->ProvidesOwnCallbackThread = 1;
impl->SkipMixerLock = 1;
return 1;
}
AudioBootStrap MINTAUDIO_STFA_bootstrap = {
MINT_AUDIO_DRIVER_NAME, "MiNT STFA audio driver",
MINTSTFA_Available, MINTSTFA_Init, 0
};
Jul 10, 2006
Jul 10, 2006
308
/* vi: set ts=4 sw=4 expandtab: */