]> 4ch.mooo.com Git - 16.git/blob - src/lib/id_sd.h
16_sd official port started. but class and work in the way
[16.git] / src / lib / id_sd.h
1 /* Project 16 Source Code~\r
2  * Copyright (C) 2012-2017 sparky4 & pngwen & andrius4669 & joncampbell123 & yakui-lover\r
3  *\r
4  * This file is part of Project 16.\r
5  *\r
6  * Project 16 is free software; you can redistribute it and/or modify\r
7  * it under the terms of the GNU General Public License as published by\r
8  * the Free Software Foundation; either version 3 of the License, or\r
9  * (at your option) any later version.\r
10  *\r
11  * Project 16 is distributed in the hope that it will be useful,\r
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
14  * GNU General Public License for more details.\r
15  *\r
16  * You should have received a copy of the GNU General Public License\r
17  * along with this program.  If not, see <http://www.gnu.org/licenses/>, or\r
18  * write to the Free Software Foundation, Inc., 51 Franklin Street,\r
19  * Fifth Floor, Boston, MA 02110-1301 USA.\r
20  *\r
21  */\r
22 \r
23 //\r
24 //      ID Engine\r
25 //      ID_SD.h - Sound Manager Header\r
26 //      Version for Wolfenstein\r
27 //      By Jason Blochowiak\r
28 //\r
29 \r
30 #ifndef __16_SD__\r
31 #define __16_SD__\r
32 \r
33 #include "src/lib/16_head.h"\r
34 #include "src/lib/16_pm.h"\r
35 \r
36 void    alOut(byte n,byte b);\r
37 \r
38 #ifdef  __DEBUG__\r
39 #define __DEBUG_SoundMgr__\r
40 #endif\r
41 \r
42 #define TickBase        70              // 70Hz per tick - used as a base for timer 0\r
43 \r
44 typedef enum    {\r
45                                         sdm_Off,\r
46                                         sdm_PC,sdm_AdLib,\r
47                                 }       SDMode;\r
48 typedef enum    {\r
49                                         smm_Off,smm_AdLib\r
50                                 }       SMMode;\r
51 typedef enum    {\r
52                                         sds_Off,sds_PC,sds_SoundSource,sds_SoundBlaster\r
53                                 }       SDSMode;\r
54 typedef struct\r
55                 {\r
56                         dword   length;\r
57                         word            priority;\r
58                 } SoundCommon;\r
59 \r
60 //      PC Sound stuff\r
61 #define pcTimer         0x42\r
62 #define pcTAccess       0x43\r
63 #define pcSpeaker       0x61\r
64 \r
65 #define pcSpkBits       3\r
66 \r
67 typedef struct\r
68                 {\r
69                         SoundCommon     common;\r
70                         byte            data[1];\r
71                 } PCSound;\r
72 \r
73 //      Registers for the Sound Blaster card - needs to be offset by n0 (0x10,0x20,0x30,0x40,0x50,0x60)\r
74 #define sbReset         0x206   // W\r
75 #define sbFMStatus      0x208   // R\r
76 #define sbFMAddr        0x208   // W\r
77 #define sbFMData        0x209   // W\r
78 #define sbReadData      0x20a   // R\r
79 #define sbWriteCmd      0x20c   // W\r
80 #define sbWriteData     0x20c   // W\r
81 #define sbWriteStat     0x20c   // R\r
82 #define sbDataAvail     0x20e   // R\r
83 \r
84 //      Registers for the Sound Blaster Pro card - needs to be offset by n0 (0x20 or 0x40)\r
85 #define sbpLFMStatus    0x200   // R\r
86 #define sbpLFMAddr              0x200   // W\r
87 #define sbpLFMData              0x201   // W\r
88 #define sbpRFMStatus    0x202   // R\r
89 #define sbpRFMAddr              0x202   // W\r
90 #define sbpRFMData              0x203   // W\r
91 #define sbpMixerAddr    0x204   // W\r
92 #define sbpMixerData    0x205   // RW\r
93 #define sbpCDData               0x210   // R\r
94 #define sbpCDCommand    0x210   // W\r
95 #define sbpCDStatus             0x211   // R\r
96 #define sbpCDReset              0x212   // W\r
97 \r
98 //      SBPro Mixer addresses\r
99 #define sbpmReset               0x00\r
100 #define sbpmVoiceVol    0x04\r
101 #define sbpmMicMix              0x0a\r
102 #define sbpmFilterADC   0x0c\r
103 #define sbpmControl             0x0e\r
104 #define sbpmMasterVol   0x22\r
105 #define sbpmFMVol               0x26\r
106 #define sbpmCDVol               0x28\r
107 #define sbpmLineVol             0x2e\r
108 \r
109 typedef struct\r
110                 {\r
111                         SoundCommon     common;\r
112                         word            hertz;\r
113                         byte            bits,\r
114                                                 reference,\r
115                                                 data[1];\r
116                 } SampledSound;\r
117 \r
118 //      Registers for the AdLib card\r
119 #define alFMStatus      0x388   // R\r
120 #define alFMAddr        0x388   // W\r
121 #define alFMData        0x389   // W\r
122 \r
123 //      Register addresses\r
124 // Operator stuff\r
125 #define alChar          0x20\r
126 #define alScale         0x40\r
127 #define alAttack        0x60\r
128 #define alSus           0x80\r
129 #define alWave          0xe0\r
130 // Channel stuff\r
131 #define alFreqL         0xa0\r
132 #define alFreqH         0xb0\r
133 #define alFeedCon       0xc0\r
134 // Global stuff\r
135 #define alEffects       0xbd\r
136 \r
137 typedef struct\r
138                 {\r
139                         byte    mChar,cChar,\r
140                                         mScale,cScale,\r
141                                         mAttack,cAttack,\r
142                                         mSus,cSus,\r
143                                         mWave,cWave,\r
144                                         nConn,\r
145 \r
146                                         // These are only for Muse - these bytes are really unused\r
147                                         voice,\r
148                                         mode,\r
149                                         unused[3];\r
150                 } Instrument;\r
151 \r
152 typedef struct\r
153                 {\r
154                         SoundCommon     common;\r
155                         Instrument      inst;\r
156                         byte            block,\r
157                                                 data[1];\r
158                 } AdLibSound;\r
159 \r
160 //\r
161 //      Sequencing stuff\r
162 //\r
163 #define sqMaxTracks     10\r
164 #define sqMaxMoods      1       // DEBUG\r
165 \r
166 #define sev_Null                0       // Does nothing\r
167 #define sev_NoteOff             1       // Turns a note off\r
168 #define sev_NoteOn              2       // Turns a note on\r
169 #define sev_NotePitch   3       // Sets the pitch of a currently playing note\r
170 #define sev_NewInst             4       // Installs a new instrument\r
171 #define sev_NewPerc             5       // Installs a new percussive instrument\r
172 #define sev_PercOn              6       // Turns a percussive note on\r
173 #define sev_PercOff             7       // Turns a percussive note off\r
174 #define sev_SeqEnd              -1      // Terminates a sequence\r
175 \r
176 //      Flags for MusicGroup.flags\r
177 #define sf_Melodic              0\r
178 #define sf_Percussive   1\r
179 \r
180 #if 1\r
181 typedef struct\r
182                 {\r
183                         word    length,\r
184                                         values[1];\r
185                 } MusicGroup;\r
186 #else\r
187 typedef struct\r
188                 {\r
189                         word    flags,\r
190                                         count,\r
191                                         offsets[1];\r
192                 } MusicGroup;\r
193 #endif\r
194 \r
195 typedef struct\r
196                 {\r
197                         /* This part needs to be set up by the user */\r
198                         word        mood,far *moods[sqMaxMoods];\r
199 \r
200                         /* The rest is set up by the code */\r
201                         Instrument      inst;\r
202                         boolean         percussive;\r
203                         word            far *seq;\r
204                         dword   nextevent;\r
205                 } ActiveTrack;\r
206 \r
207 #define sqmode_Normal           0\r
208 #define sqmode_FadeIn           1\r
209 #define sqmode_FadeOut          2\r
210 \r
211 #define sqMaxFade               64      // DEBUG\r
212 \r
213 \r
214 // Global variables\r
215 extern  boolean         AdLibPresent,\r
216                                         SoundSourcePresent,\r
217                                         SoundBlasterPresent,\r
218                                         NeedsMusic,                                     // For Caching Mgr\r
219                                         SoundPositioned;\r
220 extern  SDMode          SoundMode;\r
221 extern  SDSMode         DigiMode;\r
222 extern  SMMode          MusicMode;\r
223 extern  boolean         DigiPlaying;\r
224 extern  int                     DigiMap[];\r
225 extern  dword   TimeCount;                                      // Global time in ticks\r
226 \r
227 // Function prototypes\r
228 extern  void    SD_Startup(void),\r
229                                 SD_Shutdown(void),\r
230                                 SD_Default(boolean gotit,SDMode sd,SMMode sm),\r
231 \r
232                                 SD_PositionSound(int leftvol,int rightvol);\r
233 extern  boolean SD_PlaySound(soundnames sound);\r
234 extern  void    SD_SetPosition(int leftvol,int rightvol),\r
235                                 SD_StopSound(void),\r
236                                 SD_WaitSoundDone(void),\r
237 \r
238                                 SD_StartMusic(MusicGroup far *music),\r
239                                 SD_MusicOn(void),\r
240                                 SD_MusicOff(void),\r
241                                 SD_FadeOutMusic(void),\r
242 \r
243                                 SD_SetUserHook(void (*hook)(void));\r
244 extern  boolean SD_MusicPlaying(void),\r
245                                 SD_SetSoundMode(SDMode mode),\r
246                                 SD_SetMusicMode(SMMode mode);\r
247 extern  word    SD_SoundPlaying(void);\r
248 \r
249 extern  void    SD_SetDigiDevice(SDSMode),\r
250                                 SD_PlayDigitized(word which,int leftpos,int rightpos),\r
251                                 SD_StopDigitized(void),\r
252                                 SD_Poll(void);\r
253 \r
254 #ifdef  _MUSE_  // MUSE Goes directly to the lower level routines\r
255 extern  void    SDL_PCPlaySound(PCSound far *sound),\r
256                                 SDL_PCStopSound(void),\r
257                                 SDL_ALPlaySound(AdLibSound far *sound),\r
258                                 SDL_ALStopSound(void);\r
259 #endif\r
260 \r
261 #endif\r
262 \r