SDL-1.2.14
[sdl_omap.git] / src / audio / mint / SDL_mintaudio.h
1 /*
2     SDL - Simple DirectMedia Layer
3     Copyright (C) 1997-2009 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 #ifndef MFP_PARALLEL
88 enum {
89         MFP_PARALLEL=0,
90         MFP_DCD,
91         MFP_CTS,
92         MFP_BITBLT,
93         MFP_TIMERD,
94         MFP_BAUDRATE=MFP_TIMERD,
95         MFP_TIMERC,
96         MFP_200HZ=MFP_TIMERC,
97         MFP_ACIA,
98         MFP_DISK,
99         MFP_TIMERB,
100         MFP_HBLANK=MFP_TIMERB,
101         MFP_TERR,
102         MFP_TBE,
103         MFP_RERR,
104         MFP_RBF,
105         MFP_TIMERA,
106         MFP_DMASOUND=MFP_TIMERA,
107         MFP_RING,
108         MFP_MONODETECT
109 };
110 #endif
111
112 /* Xbtimer() timers */
113 #ifndef XB_TIMERA
114 enum {
115         XB_TIMERA=0,
116         XB_TIMERB,
117         XB_TIMERC,
118         XB_TIMERD
119 };
120 #endif
121
122 /* Variables */
123 extern SDL_AudioDevice *SDL_MintAudio_device;
124 extern Uint8 *SDL_MintAudio_audiobuf[2];        /* Pointers to buffers */
125 extern unsigned long SDL_MintAudio_audiosize;           /* Length of audio buffer=spec->size */
126 extern volatile unsigned short SDL_MintAudio_numbuf;            /* Buffer to play */
127 extern volatile unsigned short SDL_MintAudio_mutex;
128 extern cookie_stfa_t *SDL_MintAudio_stfa;
129 extern volatile unsigned long SDL_MintAudio_clocktics;
130 extern unsigned short SDL_MintAudio_hasfpu;     /* To preserve fpu registers if needed */
131
132 /* MiNT thread variables */
133 extern SDL_bool SDL_MintAudio_mint_present;
134 extern SDL_bool SDL_MintAudio_quit_thread;
135 extern SDL_bool SDL_MintAudio_thread_finished;
136 extern long SDL_MintAudio_thread_pid;
137
138 /* Functions */
139 void SDL_MintAudio_Callback(void);
140 void SDL_MintAudio_AddFrequency(_THIS, Uint32 frequency, Uint32 clock,
141         Uint32 prediv, int gpio_bits);
142 int SDL_MintAudio_SearchFrequency(_THIS, int desired_freq);
143 void SDL_MintAudio_CheckFpu(void);
144
145 /* MiNT thread functions */
146 int SDL_MintAudio_Thread(long param);
147 void SDL_MintAudio_WaitThread(void);
148
149 /* ASM interrupt functions */
150 void SDL_MintAudio_GsxbInterrupt(void);
151 void SDL_MintAudio_EmptyGsxbInterrupt(void);
152 void SDL_MintAudio_XbiosInterruptMeasureClock(void);
153 void SDL_MintAudio_XbiosInterrupt(void);
154 void SDL_MintAudio_Dma8Interrupt(void);
155 void SDL_MintAudio_StfaInterrupt(void);
156
157 #endif /* _SDL_mintaudio_h */