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

Latest commit

 

History

History
302 lines (243 loc) · 8.5 KB

SDL_mintaudio_stfa.c

File metadata and controls

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