rnd-20001216-1-src
[rocksndiamonds.git] / src / libgame / sound.h
1 /***********************************************************
2 * Artsoft Retro-Game Library                               *
3 *----------------------------------------------------------*
4 * (c) 1994-2000 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_HPUX)
30 #include <sys/audio.h>
31 #endif
32
33 #include "system.h"
34
35
36 #if defined(PLATFORM_LINUX) || defined(PLATFORM_FREEBSD) || defined(VOXWARE)
37 #define AUDIO_STREAMING_DSP
38 #endif
39
40 #define AUDIO_SAMPLE_RATE_8000                  8000
41 #define AUDIO_SAMPLE_RATE_22050                 22050
42
43 #define AUDIO_FRAGMENT_SIZE_512                 512
44 #define AUDIO_FRAGMENT_SIZE_1024                1024
45 #define AUDIO_FRAGMENT_SIZE_2048                2048
46 #define AUDIO_FRAGMENT_SIZE_4096                4096
47
48 #define AUDIO_MONO_CHANNEL                      1
49 #define AUDIO_STEREO_CHANNELS                   2
50
51 #if defined(TARGET_SDL)
52 /* one second fading interval == 1000 ticks (milliseconds) */
53 #define SOUND_FADING_INTERVAL                   1000
54 #define SOUND_MAX_VOLUME                        (SDL_MIX_MAXVOLUME / 4)
55 #endif
56
57 #if defined(AUDIO_STREAMING_DSP)
58 #define SOUND_FADING_VOLUME_STEP                (PSND_MAX_VOLUME / 40)
59 #define SOUND_FADING_VOLUME_THRESHOLD           (SOUND_FADING_VOLUME_STEP * 2)
60 #endif
61
62 #define DEFAULT_AUDIO_SAMPLE_RATE               AUDIO_SAMPLE_RATE_22050
63 #define DEFAULT_AUDIO_FRAGMENT_SIZE_UNIX        AUDIO_FRAGMENT_SIZE_512
64 #define DEFAULT_AUDIO_FRAGMENT_SIZE_WIN32       AUDIO_FRAGMENT_SIZE_2048
65
66 #if defined(PLATFORM_UNIX)
67 #define DEFAULT_AUDIO_FRAGMENT_SIZE     DEFAULT_AUDIO_FRAGMENT_SIZE_UNIX
68 #else
69 #define DEFAULT_AUDIO_FRAGMENT_SIZE     DEFAULT_AUDIO_FRAGMENT_SIZE_WIN32
70 #endif
71
72 #if !defined(PLATFORM_MSDOS)
73 #define MAX_SOUNDS_PLAYING                      16
74 #else
75 #define MAX_SOUNDS_PLAYING                      8
76 #endif
77
78 #if !defined(PLATFORM_HPUX)
79 #define SND_BLOCKSIZE 4096
80 #else
81 #define SND_BLOCKSIZE 32768
82 #endif
83
84 /* some values for PlaySound(), StopSound() and friends */
85 #if !defined(PLATFORM_MSDOS)
86 #define PSND_SILENCE            0
87 #define PSND_MAX_VOLUME_BITS    7
88 #define PSND_MIN_VOLUME         0
89 #define PSND_MAX_VOLUME         (1 << PSND_MAX_VOLUME_BITS)
90 #define PSND_NO_LOOP            0
91 #define PSND_LOOP               1
92 #define PSND_MIDDLE             0
93 #define PSND_MAX_STEREO_BITS    7
94 #define PSND_MAX_STEREO         (1 << PSND_MAX_STEREO_BITS)
95 #define PSND_MAX_LEFT           (-PSND_MAX_STEREO)
96 #define PSND_MAX_RIGHT          (+PSND_MAX_STEREO)
97 #define PSND_MAX_LEFT2RIGHT_BITS (PSND_MAX_STEREO_BITS+1)
98 #define PSND_MAX_LEFT2RIGHT     (1 << PSND_MAX_LEFT2RIGHT_BITS)
99 #else
100 #define PSND_SILENCE            0
101 #define PSND_MIN_VOLUME         0
102 #define PSND_MAX_VOLUME         255
103 #define PSND_NO_LOOP            0
104 #define PSND_LOOP               1
105 #define PSND_MAX_LEFT           0
106 #define PSND_MAX_RIGHT          255
107 #define PSND_MIDDLE             128
108 #endif
109
110 #define SSND_FADE_SOUND         (1<<0)
111 #define SSND_FADE_ALL_SOUNDS    (1<<1)
112 #define SSND_FADING(x)          (x & (SSND_FADE_SOUND | SSND_FADE_ALL_SOUNDS))
113 #define SSND_STOP_SOUND         (1<<2)
114 #define SSND_STOP_ALL_SOUNDS    (1<<3)
115 #define SSND_STOPPING(x)        (x & (SSND_STOP_SOUND | SSND_STOP_ALL_SOUNDS))
116 #define SSND_ALL(x)             (x&(SSND_FADE_ALL_SOUNDS|SSND_STOP_ALL_SOUNDS))
117
118 /* settings for sound path, sound device, etc. */
119 #ifndef SND_PATH
120 #define SND_PATH        "./sounds"
121 #endif
122
123 #define DEVICENAME_DSP          "/dev/dsp"
124 #define DEVICENAME_AUDIO        "/dev/audio"
125 #define DEVICENAME_AUDIOCTL     "/dev/audioCtl"
126
127 #if 0
128 #if defined(AUDIO_STREAMING_DSP)
129 #define AUDIO_DEVICE    DEVICENAME_DSP
130 #else
131 #define AUDIO_DEVICE    DEVICENAME_AUDIO
132 #endif
133 #endif
134
135 struct SoundHeader_SUN
136 {
137   unsigned long magic;
138   unsigned long hdr_size;
139   unsigned long data_size;
140   unsigned long encoding;
141   unsigned long sample_rate;
142   unsigned long channels;
143 };
144
145 struct SoundHeader_8SVX
146 {
147   char magic_FORM[4];
148   unsigned long chunk_size;
149   char magic_8SVX[4];
150 };
151
152 struct SampleInfo
153
154   char *name;
155   byte *data_ptr;
156   long data_len;
157
158 #if defined(PLATFORM_MSDOS)
159   SAMPLE *sample_ptr;
160 #endif
161
162 #if defined(TARGET_SDL)
163   Mix_Chunk *mix_chunk;
164   Mix_Music *mix_music;
165 #endif
166 };
167
168 struct SoundControl
169 {
170   int nr;
171   int volume;
172   int stereo;
173   boolean active;
174   boolean loop;
175   boolean fade_sound;
176   boolean stop_sound;
177   boolean stop_all_sounds;
178   int playingtime;
179   long playingpos;
180   long data_len;
181   byte *data_ptr;
182
183 #if defined(PLATFORM_MSDOS)
184   int voice;
185 #endif
186 };
187
188 /* general sound functions */
189 void UnixOpenAudio(void);
190 void UnixCloseAudio(void);
191
192 /* sound server functions */ 
193 void InitPlaylist(void);
194 void StartSoundserver(void);
195 void SoundServer(void);
196
197 /* sound client functions */
198 boolean LoadSound(char *);
199 boolean LoadMod(char *);
200 int LoadMusic(void);
201 void PlayMusic(int);
202 void PlaySound(int);
203 void PlaySoundStereo(int, int);
204 void PlaySoundLoop(int);
205 void PlaySoundExt(int, int, int, boolean);
206 void FadeMusic(void);
207 void FadeSound(int);
208 void FadeSounds(void);
209 void StopMusic(void);
210 void StopSound(int);
211 void StopSounds(void);
212 void StopSoundExt(int, int);
213 void FreeSounds(int);
214
215 #endif