rnd-20001210-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 #define DEFAULT_AUDIO_SAMPLE_RATE               AUDIO_SAMPLE_RATE_22050
58 #define DEFAULT_AUDIO_FRAGMENT_SIZE_UNIX        AUDIO_FRAGMENT_SIZE_512
59 #define DEFAULT_AUDIO_FRAGMENT_SIZE_WIN32       AUDIO_FRAGMENT_SIZE_2048
60
61 #if defined(PLATFORM_UNIX)
62 #define DEFAULT_AUDIO_FRAGMENT_SIZE     DEFAULT_AUDIO_FRAGMENT_SIZE_UNIX
63 #else
64 #define DEFAULT_AUDIO_FRAGMENT_SIZE     DEFAULT_AUDIO_FRAGMENT_SIZE_WIN32
65 #endif
66
67 #if !defined(PLATFORM_MSDOS)
68 #define MAX_SOUNDS_PLAYING                      16
69 #else
70 #define MAX_SOUNDS_PLAYING                      8
71 #endif
72
73 #if !defined(PLATFORM_HPUX)
74 #define SND_BLOCKSIZE 4096
75 #else
76 #define SND_BLOCKSIZE 32768
77 #endif
78
79 /* some values for PlaySound(), StopSound() and friends */
80 #if !defined(PLATFORM_MSDOS)
81 #define PSND_SILENCE            0
82 #define PSND_MAX_VOLUME_BITS    7
83 #define PSND_MIN_VOLUME         0
84 #define PSND_MAX_VOLUME         (1 << PSND_MAX_VOLUME_BITS)
85 #define PSND_NO_LOOP            0
86 #define PSND_LOOP               1
87 #define PSND_MIDDLE             0
88 #define PSND_MAX_STEREO_BITS    7
89 #define PSND_MAX_STEREO         (1 << PSND_MAX_STEREO_BITS)
90 #define PSND_MAX_LEFT           (-PSND_MAX_STEREO)
91 #define PSND_MAX_RIGHT          (+PSND_MAX_STEREO)
92 #define PSND_MAX_LEFT2RIGHT_BITS (PSND_MAX_STEREO_BITS+1)
93 #define PSND_MAX_LEFT2RIGHT     (1 << PSND_MAX_LEFT2RIGHT_BITS)
94 #else
95 #define PSND_SILENCE            0
96 #define PSND_MIN_VOLUME         0
97 #define PSND_MAX_VOLUME         255
98 #define PSND_NO_LOOP            0
99 #define PSND_LOOP               1
100 #define PSND_MAX_LEFT           0
101 #define PSND_MAX_RIGHT          255
102 #define PSND_MIDDLE             128
103 #endif
104
105 #define SSND_FADE_SOUND         (1<<0)
106 #define SSND_FADE_ALL_SOUNDS    (1<<1)
107 #define SSND_FADING(x)          (x & (SSND_FADE_SOUND | SSND_FADE_ALL_SOUNDS))
108 #define SSND_STOP_SOUND         (1<<2)
109 #define SSND_STOP_ALL_SOUNDS    (1<<3)
110 #define SSND_STOPPING(x)        (x & (SSND_STOP_SOUND | SSND_STOP_ALL_SOUNDS))
111 #define SSND_ALL(x)             (x&(SSND_FADE_ALL_SOUNDS|SSND_STOP_ALL_SOUNDS))
112
113 /* settings for sound path, sound device, etc. */
114 #ifndef SND_PATH
115 #define SND_PATH        "./sounds"
116 #endif
117
118 #define DEVICENAME_DSP          "/dev/dsp"
119 #define DEVICENAME_AUDIO        "/dev/audio"
120 #define DEVICENAME_AUDIOCTL     "/dev/audioCtl"
121
122 #if 0
123 #if defined(AUDIO_STREAMING_DSP)
124 #define AUDIO_DEVICE    DEVICENAME_DSP
125 #else
126 #define AUDIO_DEVICE    DEVICENAME_AUDIO
127 #endif
128 #endif
129
130 struct SoundHeader_SUN
131 {
132   unsigned long magic;
133   unsigned long hdr_size;
134   unsigned long data_size;
135   unsigned long encoding;
136   unsigned long sample_rate;
137   unsigned long channels;
138 };
139
140 struct SoundHeader_8SVX
141 {
142   char magic_FORM[4];
143   unsigned long chunk_size;
144   char magic_8SVX[4];
145 };
146
147 struct SampleInfo
148
149   char *name;
150   byte *data_ptr;
151   long data_len;
152
153 #if defined(PLATFORM_MSDOS)
154   SAMPLE *sample_ptr;
155 #endif
156
157 #if defined(TARGET_SDL)
158   Mix_Chunk *mix_chunk;
159 #endif
160 };
161
162 struct SoundControl
163 {
164   int nr;
165   int volume;
166   int stereo;
167   boolean active;
168   boolean loop;
169   boolean fade_sound;
170   boolean stop_sound;
171   boolean stop_all_sounds;
172   int playingtime;
173   long playingpos;
174   long data_len;
175   byte *data_ptr;
176
177 #if defined(PLATFORM_MSDOS)
178   int voice;
179 #endif
180 };
181
182 /* general sound functions */
183 void UnixOpenAudio(void);
184 void UnixCloseAudio(void);
185
186 /* sound server functions */ 
187 void SoundServer(void);
188
189 /* sound client functions */
190 void AllocSoundArray(int);
191 boolean LoadSound(int, char *);
192 void PlayMusic(int);
193 void PlaySound(int);
194 void PlaySoundStereo(int, int);
195 void PlaySoundLoop(int);
196 void PlaySoundExt(int, int, int, boolean);
197 void FadeMusic(void);
198 void FadeSound(int);
199 void FadeSounds(void);
200 void StopMusic(void);
201 void StopSound(int);
202 void StopSounds(void);
203 void StopSoundExt(int, int);
204 void FreeSounds(int);
205
206 #endif