• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2     SDL - Simple DirectMedia Layer
3     Copyright (C) 1997-2004 Sam Lantinga
4 
5     This library is free software; you can redistribute it and/or
6     modify it under the terms of the GNU Library General Public
7     License as published by the Free Software Foundation; either
8     version 2 of the License, or (at your option) any later version.
9 
10     This library is distributed in the hope that it will be useful,
11     but WITHOUT ANY WARRANTY; without even the implied warranty of
12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13     Library General Public License for more details.
14 
15     You should have received a copy of the GNU Library General Public
16     License along with this library; if not, write to the Free
17     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18 
19     Sam Lantinga
20     slouken@libsdl.org
21 */
22 #include "SDL_config.h"
23 
24 /*
25 	MiNT audio driver
26 
27 	Patrice Mandin
28 */
29 
30 #ifndef _SDL_mintaudio_h
31 #define _SDL_mintaudio_h
32 
33 #include "../SDL_sysaudio.h"
34 #include "SDL_mintaudio_stfa.h"
35 
36 /* Hidden "this" pointer for the audio functions */
37 #define _THIS	SDL_AudioDevice *this
38 
39 /* 16 predivisors with 3 clocks max. */
40 #define MINTAUDIO_maxfreqs		(16*3)
41 
42 typedef struct {
43 	Uint32	frequency;
44 	Uint32	masterclock;
45 	Uint32	predivisor;
46 	int	gpio_bits;	/* in case of external clock */
47 } mint_frequency_t;
48 
49 struct SDL_PrivateAudioData {
50 	mint_frequency_t	frequencies[MINTAUDIO_maxfreqs];
51 	int 	freq_count;		/* Number of frequencies in the array */
52 	int		numfreq;		/* Number of selected frequency */
53 };
54 
55 /* Old variable names */
56 
57 #define MINTAUDIO_frequencies	(this->hidden->frequencies)
58 #define MINTAUDIO_freqcount		(this->hidden->freq_count)
59 #define MINTAUDIO_numfreq		(this->hidden->numfreq)
60 
61 /* _MCH cookie (values>>16) */
62 enum {
63 	MCH_ST=0,
64 	MCH_STE,
65 	MCH_TT,
66 	MCH_F30,
67 	MCH_CLONE,
68 	MCH_ARANYM
69 };
70 
71 /* Master clocks for replay frequencies */
72 #define MASTERCLOCK_STE		8010666		/* Not sure of this one */
73 #define MASTERCLOCK_TT		16107953	/* Not sure of this one */
74 #define MASTERCLOCK_FALCON1	25175000
75 #define MASTERCLOCK_FALCON2	32000000	/* Only usable for DSP56K */
76 #define MASTERCLOCK_FALCONEXT	-1		/* Clock on DSP56K port, unknown */
77 #define MASTERCLOCK_44K		22579200	/* Standard clock for 44.1 Khz */
78 #define MASTERCLOCK_48K		24576000	/* Standard clock for 48 Khz */
79 
80 /* Master clock predivisors */
81 #define MASTERPREDIV_STE	160
82 #define MASTERPREDIV_TT		320
83 #define MASTERPREDIV_FALCON	256
84 #define MASTERPREDIV_MILAN	256
85 
86 /* MFP 68901 interrupt sources */
87 enum {
88 	MFP_PARALLEL=0,
89 	MFP_DCD,
90 	MFP_CTS,
91 	MFP_BITBLT,
92 	MFP_TIMERD,
93 	MFP_BAUDRATE=MFP_TIMERD,
94 	MFP_TIMERC,
95 	MFP_200HZ=MFP_TIMERC,
96 	MFP_ACIA,
97 	MFP_DISK,
98 	MFP_TIMERB,
99 	MFP_HBLANK=MFP_TIMERB,
100 	MFP_TERR,
101 	MFP_TBE,
102 	MFP_RERR,
103 	MFP_RBF,
104 	MFP_TIMERA,
105 	MFP_DMASOUND=MFP_TIMERA,
106 	MFP_RING,
107 	MFP_MONODETECT
108 };
109 
110 /* Xbtimer() timers */
111 enum {
112 	XB_TIMERA=0,
113 	XB_TIMERB,
114 	XB_TIMERC,
115 	XB_TIMERD
116 };
117 
118 /* Variables */
119 extern SDL_AudioDevice *SDL_MintAudio_device;
120 extern Uint8 *SDL_MintAudio_audiobuf[2];	/* Pointers to buffers */
121 extern unsigned long SDL_MintAudio_audiosize;		/* Length of audio buffer=spec->size */
122 extern volatile unsigned short SDL_MintAudio_numbuf;		/* Buffer to play */
123 extern volatile unsigned short SDL_MintAudio_mutex;
124 extern cookie_stfa_t *SDL_MintAudio_stfa;
125 extern volatile unsigned long SDL_MintAudio_clocktics;
126 extern unsigned short SDL_MintAudio_hasfpu;	/* To preserve fpu registers if needed */
127 
128 /* MiNT thread variables */
129 extern SDL_bool	SDL_MintAudio_mint_present;
130 extern SDL_bool SDL_MintAudio_quit_thread;
131 extern SDL_bool SDL_MintAudio_thread_finished;
132 extern long SDL_MintAudio_thread_pid;
133 
134 /* Functions */
135 void SDL_MintAudio_Callback(void);
136 void SDL_MintAudio_AddFrequency(_THIS, Uint32 frequency, Uint32 clock,
137 	Uint32 prediv, int gpio_bits);
138 int SDL_MintAudio_SearchFrequency(_THIS, int desired_freq);
139 void SDL_MintAudio_CheckFpu(void);
140 
141 /* MiNT thread functions */
142 int SDL_MintAudio_Thread(long param);
143 void SDL_MintAudio_WaitThread(void);
144 
145 /* ASM interrupt functions */
146 void SDL_MintAudio_GsxbInterrupt(void);
147 void SDL_MintAudio_EmptyGsxbInterrupt(void);
148 void SDL_MintAudio_XbiosInterruptMeasureClock(void);
149 void SDL_MintAudio_XbiosInterrupt(void);
150 void SDL_MintAudio_Dma8Interrupt(void);
151 void SDL_MintAudio_StfaInterrupt(void);
152 
153 #endif /* _SDL_mintaudio_h */
154