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

Latest commit

 

History

History
307 lines (248 loc) · 8.64 KB

SDL_mintaudio_stfa.c

File metadata and controls

307 lines (248 loc) · 8.64 KB
 
1
2
/*
SDL - Simple DirectMedia Layer
Dec 8, 2008
Dec 8, 2008
3
Copyright (C) 1997-2009 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
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 */
Oct 28, 2006
Oct 28, 2006
101
102
while (SDL_MintAudio_mutex != 0) {
}
Oct 17, 2006
Oct 17, 2006
103
104
105
106
107
108
/* Clear buffers */
if (SDL_MintAudio_audiobuf[0]) {
Mfree(SDL_MintAudio_audiobuf[0]);
SDL_MintAudio_audiobuf[0] = SDL_MintAudio_audiobuf[1] = NULL;
}
109
Oct 17, 2006
Oct 17, 2006
110
111
SDL_free(this->hidden);
this->hidden = NULL;
Jul 10, 2006
Jul 10, 2006
112
}
113
114
}
Jul 10, 2006
Jul 10, 2006
115
static int
Oct 17, 2006
Oct 17, 2006
116
MINTSTFA_CheckAudio(_THIS)
117
{
Jul 10, 2006
Jul 10, 2006
118
119
int i;
Sep 24, 2006
Sep 24, 2006
120
DEBUG_PRINT((DEBUG_NAME "asked: %d bits, ",
Oct 17, 2006
Oct 17, 2006
121
122
123
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)));
Oct 28, 2006
Oct 28, 2006
124
125
DEBUG_PRINT(("big endian=%d, ",
SDL_AUDIO_ISBIGENDIAN(this->spec.format)));
Oct 17, 2006
Oct 17, 2006
126
127
128
129
DEBUG_PRINT(("channels=%d, ", this->spec.channels));
DEBUG_PRINT(("freq=%d\n", this->spec.freq));
if (SDL_AUDIO_BITSIZE(this->spec.format) > 16) {
Oct 28, 2006
Oct 28, 2006
130
this->spec.format = AUDIO_S16SYS; /* clamp out int32/float32 ... */
Sep 1, 2006
Sep 1, 2006
131
132
}
Oct 17, 2006
Oct 17, 2006
133
if (this->spec.channels > 2) {
Oct 28, 2006
Oct 28, 2006
134
this->spec.channels = 2; /* no more than stereo! */
Sep 1, 2006
Sep 1, 2006
135
136
}
Jul 10, 2006
Jul 10, 2006
137
138
139
140
141
/* Check formats available */
MINTAUDIO_freqcount = 0;
for (i = 0; i < 16; i++) {
SDL_MintAudio_AddFrequency(this, freqs[i], 0, i, -1);
}
142
Oct 29, 2004
Oct 29, 2004
143
#if 1
Jul 10, 2006
Jul 10, 2006
144
145
146
147
148
149
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
150
151
#endif
Oct 17, 2006
Oct 17, 2006
152
153
MINTAUDIO_numfreq = SDL_MintAudio_SearchFrequency(this, this->spec.freq);
this->spec.freq = MINTAUDIO_frequencies[MINTAUDIO_numfreq].frequency;
154
Sep 24, 2006
Sep 24, 2006
155
DEBUG_PRINT((DEBUG_NAME "obtained: %d bits, ",
Oct 17, 2006
Oct 17, 2006
156
157
158
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)));
Oct 28, 2006
Oct 28, 2006
159
160
DEBUG_PRINT(("big endian=%d, ",
SDL_AUDIO_ISBIGENDIAN(this->spec.format)));
Oct 17, 2006
Oct 17, 2006
161
162
DEBUG_PRINT(("channels=%d, ", this->spec.channels));
DEBUG_PRINT(("freq=%d\n", this->spec.freq));
163
Jul 10, 2006
Jul 10, 2006
164
return 0;
165
166
}
Jul 10, 2006
Jul 10, 2006
167
static void
Oct 17, 2006
Oct 17, 2006
168
MINTSTFA_InitAudio(_THIS)
169
{
Oct 17, 2006
Oct 17, 2006
170
171
void *buffer = SDL_MintAudio_audiobuf[SDL_MintAudio_numbuf];
void *oldpile = (void *) Super(0);
172
Jul 10, 2006
Jul 10, 2006
173
174
/* Stop replay */
cookie_stfa->sound_enable = STFA_PLAY_DISABLE;
175
Jul 10, 2006
Jul 10, 2006
176
177
178
/* Select replay format */
cookie_stfa->sound_control =
MINTAUDIO_frequencies[MINTAUDIO_numfreq].predivisor;
Oct 17, 2006
Oct 17, 2006
179
if (SDL_AUDIO_BITSIZE(this->spec.format) == 8) {
Jul 10, 2006
Jul 10, 2006
180
181
182
183
cookie_stfa->sound_control |= STFA_FORMAT_8BIT;
} else {
cookie_stfa->sound_control |= STFA_FORMAT_16BIT;
}
Oct 17, 2006
Oct 17, 2006
184
if (this->spec.channels == 2) {
Jul 10, 2006
Jul 10, 2006
185
186
187
188
cookie_stfa->sound_control |= STFA_FORMAT_STEREO;
} else {
cookie_stfa->sound_control |= STFA_FORMAT_MONO;
}
Oct 17, 2006
Oct 17, 2006
189
if (SDL_AUDIO_ISSIGNED(this->spec.format) != 0) {
Jul 10, 2006
Jul 10, 2006
190
191
192
193
cookie_stfa->sound_control |= STFA_FORMAT_SIGNED;
} else {
cookie_stfa->sound_control |= STFA_FORMAT_UNSIGNED;
}
Oct 17, 2006
Oct 17, 2006
194
if (SDL_AUDIO_ISBIGENDIAN(this->spec.format) != 0) {
Jul 10, 2006
Jul 10, 2006
195
196
197
198
cookie_stfa->sound_control |= STFA_FORMAT_BIGENDIAN;
} else {
cookie_stfa->sound_control |= STFA_FORMAT_LITENDIAN;
}
199
Jul 10, 2006
Jul 10, 2006
200
201
/* Set buffer */
cookie_stfa->sound_start = (unsigned long) buffer;
Oct 17, 2006
Oct 17, 2006
202
cookie_stfa->sound_end = (unsigned long) (buffer + this->spec.size);
203
Jul 10, 2006
Jul 10, 2006
204
205
/* Set interrupt */
cookie_stfa->stfa_it = SDL_MintAudio_StfaInterrupt;
206
Jul 10, 2006
Jul 10, 2006
207
208
/* Restart replay */
cookie_stfa->sound_enable = STFA_PLAY_ENABLE | STFA_PLAY_REPEAT;
209
Jul 10, 2006
Jul 10, 2006
210
Super(oldpile);
211
Jul 10, 2006
Jul 10, 2006
212
DEBUG_PRINT((DEBUG_NAME "hardware initialized\n"));
213
214
}
Jul 10, 2006
Jul 10, 2006
215
static int
Oct 17, 2006
Oct 17, 2006
216
MINTSTFA_OpenDevice(_THIS, const char *devname, int iscapture)
217
{
Jul 10, 2006
Jul 10, 2006
218
SDL_MintAudio_device = this;
219
Jul 10, 2006
Jul 10, 2006
220
/* Check audio capabilities */
Oct 17, 2006
Oct 17, 2006
221
222
223
224
225
226
if (MINTSTFA_CheckAudio(this) == -1) {
return 0;
}
/* Initialize all variables that we clean on shutdown */
this->hidden = (struct SDL_PrivateAudioData *)
Oct 28, 2006
Oct 28, 2006
227
SDL_malloc((sizeof *this->hidden));
Oct 17, 2006
Oct 17, 2006
228
229
230
if (this->hidden == NULL) {
SDL_OutOfMemory();
return 0;
Jul 10, 2006
Jul 10, 2006
231
}
Oct 17, 2006
Oct 17, 2006
232
SDL_memset(this->hidden, 0, (sizeof *this->hidden));
233
Oct 17, 2006
Oct 17, 2006
234
SDL_CalculateAudioSpec(&this->spec);
235
Jul 10, 2006
Jul 10, 2006
236
/* Allocate memory for audio buffers in DMA-able RAM */
Oct 17, 2006
Oct 17, 2006
237
DEBUG_PRINT((DEBUG_NAME "buffer size=%d\n", this->spec.size));
238
Oct 28, 2006
Oct 28, 2006
239
240
SDL_MintAudio_audiobuf[0] =
Atari_SysMalloc(this->spec.size * 2, MX_STRAM);
Jul 10, 2006
Jul 10, 2006
241
if (SDL_MintAudio_audiobuf[0] == NULL) {
Jul 13, 2007
Jul 13, 2007
242
243
SDL_OutOfMemory();
SDL_free(this->hidden);
Oct 17, 2006
Oct 17, 2006
244
245
this->hidden = NULL;
return 0;
Jul 10, 2006
Jul 10, 2006
246
}
Oct 17, 2006
Oct 17, 2006
247
SDL_MintAudio_audiobuf[1] = SDL_MintAudio_audiobuf[0] + this->spec.size;
Jul 10, 2006
Jul 10, 2006
248
SDL_MintAudio_numbuf = 0;
Oct 28, 2006
Oct 28, 2006
249
250
SDL_memset(SDL_MintAudio_audiobuf[0], this->spec.silence,
this->spec.size * 2);
Oct 17, 2006
Oct 17, 2006
251
SDL_MintAudio_audiosize = this->spec.size;
Jul 10, 2006
Jul 10, 2006
252
SDL_MintAudio_mutex = 0;
253
Jul 10, 2006
Jul 10, 2006
254
255
256
257
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]));
258
Sep 16, 2006
Sep 16, 2006
259
260
SDL_MintAudio_CheckFpu();
Jul 10, 2006
Jul 10, 2006
261
/* Setup audio hardware */
Oct 17, 2006
Oct 17, 2006
262
MINTSTFA_InitAudio(this);
263
Oct 28, 2006
Oct 28, 2006
264
return 1; /* good to go. */
265
}
Jul 10, 2006
Jul 10, 2006
266
Oct 17, 2006
Oct 17, 2006
267
268
static int
Oct 28, 2006
Oct 28, 2006
269
MINTSTFA_Init(SDL_AudioDriverImpl * impl)
Oct 17, 2006
Oct 17, 2006
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
{
/* 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;
Jul 13, 2007
Jul 13, 2007
294
295
impl->LockDevice = MINTSTFA_LockDevice;
impl->UnlockDevice = MINTSTFA_UnlockDevice;
Oct 17, 2006
Oct 17, 2006
296
297
298
299
impl->OnlyHasDefaultOutputDevice = 1;
impl->ProvidesOwnCallbackThread = 1;
impl->SkipMixerLock = 1;
Jan 1, 2009
Jan 1, 2009
300
return 2; /* 2 == definitely has an audio device. */
Oct 17, 2006
Oct 17, 2006
301
302
303
304
305
306
}
AudioBootStrap MINTAUDIO_STFA_bootstrap = {
MINT_AUDIO_DRIVER_NAME, "MiNT STFA audio driver", MINTSTFA_Init, 0
};
Jul 10, 2006
Jul 10, 2006
307
/* vi: set ts=4 sw=4 expandtab: */