Home | History | Annotate | Download | only in mint
      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 (at) 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