rnd-20020424-2-src
[rocksndiamonds.git] / src / libgame / sound.h
1 /***********************************************************
2 * Artsoft Retro-Game Library                               *
3 *----------------------------------------------------------*
4 * (c) 1994-2001 Artsoft Entertainment                      *
5 *               Holger Schemel                             *
6 *               Detmolder Strasse 189                      *
7 *               33604 Bielefeld                            *
8 *               Germany                                    *
9 *               e-mail: info@artsoft.org                   *
10 *----------------------------------------------------------*
11 * sound.h                                                  *
12 ***********************************************************/
13
14 #ifndef SOUND_H
15 #define SOUND_H
16
17 #include <math.h>
18
19 #include "platform.h"
20
21 #if defined(PLATFORM_LINUX)
22 #include <sys/ioctl.h>
23 #endif
24
25 #if defined(PLATFORM_LINUX)
26 #include <linux/soundcard.h>
27 #elif defined(PLATFORM_FREEBSD)
28 #include <machine/soundcard.h>
29 #elif defined(PLATFORM_NETBSD)
30 #include <sys/ioctl.h>
31 #include <sys/audioio.h>
32 #elif defined(PLATFORM_HPUX)
33 #include <sys/audio.h>
34 #endif
35
36 #include "system.h"
37
38
39 #if defined(PLATFORM_LINUX) || defined(PLATFORM_FREEBSD) || defined(VOXWARE)
40 #define AUDIO_LINUX_IOCTL
41 #endif
42
43 #if defined(AUDIO_LINUX_IOCTL) || defined(PLATFORM_NETBSD)
44 #define AUDIO_STREAMING_DSP
45 #endif
46
47 #define AUDIO_SAMPLE_RATE_8000                  8000
48 #define AUDIO_SAMPLE_RATE_22050                 22050
49
50 #define AUDIO_FRAGMENT_SIZE_512                 512
51 #define AUDIO_FRAGMENT_SIZE_1024                1024
52 #define AUDIO_FRAGMENT_SIZE_2048                2048
53 #define AUDIO_FRAGMENT_SIZE_4096                4096
54
55 #define AUDIO_MONO_CHANNEL                      1
56 #define AUDIO_STEREO_CHANNELS                   2
57
58 #if defined(TARGET_SDL)
59 /* one second fading interval == 1000 ticks (milliseconds) */
60 #define SOUND_FADING_INTERVAL                   1000
61 #define SOUND_MAX_VOLUME                        SDL_MIX_MAXVOLUME
62 #endif
63
64 #if defined(AUDIO_STREAMING_DSP)
65 #define SOUND_FADING_VOLUME_STEP                (PSND_MAX_VOLUME / 40)
66 #define SOUND_FADING_VOLUME_THRESHOLD           (SOUND_FADING_VOLUME_STEP * 2)
67 #endif
68
69 #define DEFAULT_AUDIO_SAMPLE_RATE               AUDIO_SAMPLE_RATE_22050
70 #define DEFAULT_AUDIO_FRAGMENT_SIZE_UNIX        AUDIO_FRAGMENT_SIZE_512
71 #define DEFAULT_AUDIO_FRAGMENT_SIZE_WIN32       AUDIO_FRAGMENT_SIZE_2048
72
73 #if defined(PLATFORM_UNIX)
74 #define DEFAULT_AUDIO_FRAGMENT_SIZE     DEFAULT_AUDIO_FRAGMENT_SIZE_UNIX
75 #else
76 #define DEFAULT_AUDIO_FRAGMENT_SIZE     DEFAULT_AUDIO_FRAGMENT_SIZE_WIN32
77 #endif
78
79 #if !defined(PLATFORM_MSDOS)
80 #define MAX_SOUNDS_PLAYING                      16
81 #else
82 #define MAX_SOUNDS_PLAYING                      8
83 #endif
84
85 #if !defined(PLATFORM_HPUX)
86 #define SND_BLOCKSIZE 4096
87 #else
88 #define SND_BLOCKSIZE 32768
89 #endif
90
91 /* some values for PlaySound(), StopSound() and friends */
92 #if !defined(PLATFORM_MSDOS)
93
94 #define PSND_SILENCE            0
95 #define PSND_MAX_VOLUME_BITS    7
96 #define PSND_MIN_VOLUME         0
97 #define PSND_MAX_VOLUME         (1 << PSND_MAX_VOLUME_BITS)
98 #define PSND_MIDDLE             0
99 #define PSND_MAX_STEREO_BITS    7
100 #define PSND_MAX_STEREO         (1 << PSND_MAX_STEREO_BITS)
101 #define PSND_MAX_LEFT           (-PSND_MAX_STEREO)
102 #define PSND_MAX_RIGHT          (+PSND_MAX_STEREO)
103 #define PSND_MAX_LEFT2RIGHT_BITS (PSND_MAX_STEREO_BITS+1)
104 #define PSND_MAX_LEFT2RIGHT     (1 << PSND_MAX_LEFT2RIGHT_BITS)
105
106 #else   /* PLATFORM_MSDOS */
107
108 #define PSND_SILENCE            0
109 #define PSND_MIN_VOLUME         0
110 #define PSND_MAX_VOLUME         255
111 #define PSND_MAX_LEFT           0
112 #define PSND_MAX_RIGHT          255
113 #define PSND_MIDDLE             128
114
115 #endif
116
117 #define PSND_NO_LOOP            0
118 #define PSND_LOOP               1
119 #define PSND_MUSIC              2
120
121 #define SSND_FADE_SOUND         (1 << 0)
122 #define SSND_FADE_MUSIC         (1 << 1)
123 #define SSND_FADE_ALL           (1 << 2)
124 #define SSND_FADING             (SSND_FADE_SOUND | \
125                                  SSND_FADE_MUSIC | \
126                                  SSND_FADE_ALL)
127 #define SSND_STOP_SOUND         (1 << 3)
128 #define SSND_STOP_MUSIC         (1 << 4)
129 #define SSND_STOP_ALL           (1 << 5)
130 #define SSND_STOPPING           (SSND_STOP_SOUND | \
131                                  SSND_STOP_MUSIC | \
132                                  SSND_STOP_ALL)
133 #define SSND_MUSIC              (SSND_FADE_MUSIC | SSND_STOP_MUSIC)
134 #define SSND_ALL                (SSND_FADE_ALL | SSND_STOP_ALL)
135
136 #define SND_RELOAD_SOUNDS       1
137 #define SND_RELOAD_MUSIC        2
138
139 #define SND_TYPE_NONE           0
140 #define SND_TYPE_WAV            1
141
142 #define MUS_TYPE_NONE           0
143 #define MUS_TYPE_WAV            1
144 #define MUS_TYPE_MOD            2
145
146 /* settings for sound path, sound device, etc. */
147 #ifndef SND_PATH
148 #define SND_PATH        "./sounds"
149 #endif
150
151 #define DEVICENAME_DSP          "/dev/dsp"
152 #define DEVICENAME_AUDIO        "/dev/audio"
153 #define DEVICENAME_AUDIOCTL     "/dev/audioCtl"
154
155 #if 0
156 #if defined(AUDIO_STREAMING_DSP)
157 #define AUDIO_DEVICE    DEVICENAME_DSP
158 #else
159 #define AUDIO_DEVICE    DEVICENAME_AUDIO
160 #endif
161 #endif
162
163 #if 0
164 struct SoundHeader_SUN
165 {
166   unsigned long magic;
167   unsigned long hdr_size;
168   unsigned long data_size;
169   unsigned long encoding;
170   unsigned long sample_rate;
171   unsigned long channels;
172 };
173
174 struct SoundHeader_8SVX
175 {
176   char magic_FORM[4];
177   unsigned long chunk_size;
178   char magic_8SVX[4];
179 };
180 #endif
181
182 struct SampleInfo
183
184   char *source_filename;
185
186   int type;
187
188   void *data_ptr;
189   long data_len;
190 };
191
192 typedef struct SampleInfo       SoundInfo;
193 typedef struct SampleInfo       MusicInfo;
194
195 struct SoundControl
196 {
197   int nr;
198   int volume;
199   int stereo;
200
201   boolean active;
202   boolean loop;
203   boolean music;
204   boolean fade_sound;
205   boolean stop_sound;
206   boolean stop_all_sounds;
207   boolean reload_sounds;
208   boolean reload_music;
209
210   int playingtime;
211   long playingpos;
212
213   unsigned long data_len;
214   byte *data_ptr;
215
216 #if defined(PLATFORM_MSDOS)
217   int voice;
218 #endif
219 };
220
221 /* general sound functions */
222 void UnixOpenAudio(void);
223 void UnixCloseAudio(void);
224
225 /* sound server functions */ 
226 void InitPlaylist(void);
227 void StartSoundserver(void);
228 void SoundServer(void);
229
230 /* sound client functions */
231 void ReloadSounds(char *);
232 void ReloadMusic(char *);
233 SoundInfo *LoadCustomSound(char *);
234 void InitSoundList(int);
235 void LoadSoundToList(char *, int);
236 void LoadCustomMusic(void);
237 void PlayMusic(int);
238 void PlaySound(int);
239 void PlaySoundStereo(int, int);
240 void PlaySoundLoop(int);
241 void PlaySoundMusic(int);
242 void PlaySoundExt(int, int, int, boolean);
243 void FadeMusic(void);
244 void FadeSound(int);
245 void FadeSounds(void);
246 void StopMusic(void);
247 void StopSound(int);
248 void StopSounds(void);
249 void StopSoundExt(int, int);
250 void InitReloadSounds(char *);
251 void InitReloadMusic(char *);
252 void FreeSound(SoundInfo *);
253 void FreeMusic(MusicInfo *);
254 void FreeAllSounds(void);
255 void FreeAllMusic(void);
256
257 #endif