1 /* Project 16 Source Code~
\r
2 * Copyright (C) 2012-2017 sparky4 & pngwen & andrius4669 & joncampbell123 & yakui-lover
\r
4 * This file is part of Project 16.
\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
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
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
25 // ID_SD.h - Sound Manager Header
\r
26 // Version for Wolfenstein
\r
27 // By Jason Blochowiak
\r
33 #include "src/lib/16_head.h"
\r
34 #include "src/lib/16_pm.h"
\r
36 void alOut(byte n,byte b);
\r
39 #define __DEBUG_SoundMgr__
\r
42 #define TickBase 70 // 70Hz per tick - used as a base for timer 0
\r
52 sds_Off,sds_PC,sds_SoundSource,sds_SoundBlaster
\r
61 #define pcTimer 0x42
\r
62 #define pcTAccess 0x43
\r
63 #define pcSpeaker 0x61
\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
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
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
111 SoundCommon common;
\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
123 // Register addresses
\r
125 #define alChar 0x20
\r
126 #define alScale 0x40
\r
127 #define alAttack 0x60
\r
129 #define alWave 0xe0
\r
131 #define alFreqL 0xa0
\r
132 #define alFreqH 0xb0
\r
133 #define alFeedCon 0xc0
\r
135 #define alEffects 0xbd
\r
146 // These are only for Muse - these bytes are really unused
\r
154 SoundCommon common;
\r
161 // Sequencing stuff
\r
163 #define sqMaxTracks 10
\r
164 #define sqMaxMoods 1 // DEBUG
\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
176 // Flags for MusicGroup.flags
\r
177 #define sf_Melodic 0
\r
178 #define sf_Percussive 1
\r
197 /* This part needs to be set up by the user */
\r
198 word mood,far *moods[sqMaxMoods];
\r
200 /* The rest is set up by the code */
\r
202 boolean percussive;
\r
207 #define sqmode_Normal 0
\r
208 #define sqmode_FadeIn 1
\r
209 #define sqmode_FadeOut 2
\r
211 #define sqMaxFade 64 // DEBUG
\r
214 // Global variables
\r
215 extern boolean AdLibPresent,
\r
216 SoundSourcePresent,
\r
217 SoundBlasterPresent,
\r
218 NeedsMusic, // For Caching Mgr
\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
227 // Function prototypes
\r
228 extern void SD_Startup(void),
\r
230 SD_Default(boolean gotit,SDMode sd,SMMode sm),
\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
238 SD_StartMusic(MusicGroup far *music),
\r
241 SD_FadeOutMusic(void),
\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
249 extern void SD_SetDigiDevice(SDSMode),
\r
250 SD_PlayDigitized(word which,int leftpos,int rightpos),
\r
251 SD_StopDigitized(void),
\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