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