rnd-20020430-1-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 #define AUDIO_FORMAT_U8                         (1 << 0)
59 #define AUDIO_FORMAT_S16                        (1 << 1)
60 #define AUDIO_FORMAT_LE                         (1 << 2)
61 #define AUDIO_FORMAT_BE                         (1 << 3)
62
63 #if defined(TARGET_SDL)
64 /* one second fading interval == 1000 ticks (milliseconds) */
65 #define SOUND_FADING_INTERVAL                   1000
66 #define SOUND_MAX_VOLUME                        SDL_MIX_MAXVOLUME
67 #endif
68
69 #if defined(AUDIO_STREAMING_DSP)
70 #define SOUND_FADING_VOLUME_STEP                (PSND_MAX_VOLUME / 40)
71 #define SOUND_FADING_VOLUME_THRESHOLD           (SOUND_FADING_VOLUME_STEP * 2)
72 #endif
73
74 #define DEFAULT_AUDIO_SAMPLE_RATE               AUDIO_SAMPLE_RATE_22050
75 #define DEFAULT_AUDIO_FRAGMENT_SIZE_UNIX        AUDIO_FRAGMENT_SIZE_512
76 #define DEFAULT_AUDIO_FRAGMENT_SIZE_WIN32       AUDIO_FRAGMENT_SIZE_2048
77
78 #if defined(PLATFORM_UNIX)
79 #define DEFAULT_AUDIO_FRAGMENT_SIZE     DEFAULT_AUDIO_FRAGMENT_SIZE_UNIX
80 #else
81 #define DEFAULT_AUDIO_FRAGMENT_SIZE     DEFAULT_AUDIO_FRAGMENT_SIZE_WIN32
82 #endif
83
84 #if !defined(PLATFORM_MSDOS)
85 #define MAX_SOUNDS_PLAYING                      16
86 #else
87 #define MAX_SOUNDS_PLAYING                      8
88 #endif
89
90 #if !defined(PLATFORM_HPUX)
91 #define SND_BLOCKSIZE 4096
92 #else
93 #define SND_BLOCKSIZE 32768
94 #endif
95
96 /* some values for PlaySound(), StopSound() and friends */
97 #if !defined(PLATFORM_MSDOS)
98
99 #define PSND_SILENCE            0
100 #define PSND_MAX_VOLUME_BITS    15
101 #define PSND_MIN_VOLUME         0
102 #define PSND_MAX_VOLUME         (1 << PSND_MAX_VOLUME_BITS)
103 #define PSND_MIDDLE             0
104 #define PSND_MAX_STEREO_BITS    7
105 #define PSND_MAX_STEREO         (1 << PSND_MAX_STEREO_BITS)
106 #define PSND_MAX_LEFT           (-PSND_MAX_STEREO)
107 #define PSND_MAX_RIGHT          (+PSND_MAX_STEREO)
108 #define PSND_MAX_LEFT2RIGHT_BITS (PSND_MAX_STEREO_BITS+1)
109 #define PSND_MAX_LEFT2RIGHT     (1 << PSND_MAX_LEFT2RIGHT_BITS)
110
111 #else   /* PLATFORM_MSDOS */
112
113 #define PSND_SILENCE            0
114 #define PSND_MIN_VOLUME         0
115 #define PSND_MAX_VOLUME         255
116 #define PSND_MAX_LEFT           0
117 #define PSND_MAX_RIGHT          255
118 #define PSND_MIDDLE             128
119
120 #endif
121
122 #define PSND_NO_LOOP            0
123 #define PSND_LOOP               1
124 #define PSND_MUSIC              2
125
126 #define SSND_FADE_SOUND         (1 << 0)
127 #define SSND_FADE_MUSIC         (1 << 1)
128 #define SSND_FADE_ALL           (1 << 2)
129 #define SSND_FADING             (SSND_FADE_SOUND | \
130                                  SSND_FADE_MUSIC | \
131                                  SSND_FADE_ALL)
132 #define SSND_STOP_SOUND         (1 << 3)
133 #define SSND_STOP_MUSIC         (1 << 4)
134 #define SSND_STOP_ALL           (1 << 5)
135 #define SSND_STOPPING           (SSND_STOP_SOUND | \
136                                  SSND_STOP_MUSIC | \
137                                  SSND_STOP_ALL)
138 #define SSND_MUSIC              (SSND_FADE_MUSIC | SSND_STOP_MUSIC)
139 #define SSND_ALL                (SSND_FADE_ALL | SSND_STOP_ALL)
140
141 #define SND_RELOAD_SOUNDS       1
142 #define SND_RELOAD_MUSIC        2
143
144 #define SND_TYPE_NONE           0
145 #define SND_TYPE_WAV            1
146
147 #define MUS_TYPE_NONE           0
148 #define MUS_TYPE_WAV            1
149 #define MUS_TYPE_MOD            2
150
151 /* settings for sound path, sound device, etc. */
152 #ifndef SND_PATH
153 #define SND_PATH        "./sounds"
154 #endif
155
156 #define DEVICENAME_DSP          "/dev/dsp"
157 #define DEVICENAME_AUDIO        "/dev/audio"
158 #define DEVICENAME_AUDIOCTL     "/dev/audioCtl"
159
160 #if 0
161 #if defined(AUDIO_STREAMING_DSP)
162 #define AUDIO_DEVICE    DEVICENAME_DSP
163 #else
164 #define AUDIO_DEVICE    DEVICENAME_AUDIO
165 #endif
166 #endif
167
168 #if 0
169 struct SoundHeader_SUN
170 {
171   unsigned long magic;
172   unsigned long hdr_size;
173   unsigned long data_size;
174   unsigned long encoding;
175   unsigned long sample_rate;
176   unsigned long channels;
177 };
178
179 struct SoundHeader_8SVX
180 {
181   char magic_FORM[4];
182   unsigned long chunk_size;
183   char magic_8SVX[4];
184 };
185 #endif
186
187 struct AudioFormatInfo
188 {
189   boolean stereo;               /* availability of stereo sound */
190   int format;                   /* size and endianess of sample data */
191   int sample_rate;              /* sample frequency */
192   int fragment_size;            /* audio device fragment size in bytes */
193 };
194
195 struct SoundEffectInfo
196 {
197   char *text;
198   char *default_filename;
199   char *filename;
200 };
201
202 struct SampleInfo
203
204   int type;
205   char *source_filename;
206   int num_references;
207
208   long data_len;
209   void *data_ptr;
210   int format;
211 };
212
213 typedef struct SampleInfo       SoundInfo;
214 typedef struct SampleInfo       MusicInfo;
215
216 struct SoundControl
217 {
218   int nr;
219   int volume;
220   int stereo;
221
222   boolean active;
223   boolean loop;
224   boolean music;
225   boolean fade_sound;
226   boolean stop_sound;
227   boolean stop_all_sounds;
228   boolean reload_sounds;
229   boolean reload_music;
230
231   int playingtime;
232   long playingpos;
233
234   long data_len;
235   void *data_ptr;
236   int format;
237
238 #if defined(PLATFORM_MSDOS)
239   int voice;
240 #endif
241 };
242
243 /* general sound functions */
244 void UnixOpenAudio(void);
245 void UnixCloseAudio(void);
246
247 /* sound server functions */ 
248 void InitPlaylist(void);
249 void StartSoundserver(void);
250 void SoundServer(void);
251
252 /* sound client functions */
253 void PlayMusic(int);
254 void PlaySound(int);
255 void PlaySoundStereo(int, int);
256 void PlaySoundLoop(int);
257 void PlaySoundMusic(int);
258 void PlaySoundExt(int, int, int, boolean);
259 void FadeMusic(void);
260 void FadeSound(int);
261 void FadeSounds(void);
262 void StopMusic(void);
263 void StopSound(int);
264 void StopSounds(void);
265 void StopSoundExt(int, int);
266 void InitSoundList(struct SoundEffectInfo *, int);
267 void InitReloadSounds(char *);
268 void InitReloadMusic(char *);
269 void FreeAllSounds(void);
270 void FreeAllMusic(void);
271
272 #endif