rnd-20001202-2-src
[rocksndiamonds.git] / src / libgame / sound.h
1 /***********************************************************
2 *  Rocks'n'Diamonds -- McDuffin Strikes Back!              *
3 *----------------------------------------------------------*
4 *  (c) 1995-98 Artsoft Entertainment                       *
5 *              Holger Schemel                              *
6 *              Oststrasse 11a                              *
7 *              33604 Bielefeld                             *
8 *              phone: ++49 +521 290471                     *
9 *              email: aeglos@valinor.owl.de                *
10 *----------------------------------------------------------*
11 *  sound.c                                                 *
12 ***********************************************************/
13
14 #ifndef SOUND_H
15 #define SOUND_H
16
17 #include <math.h>
18
19 #if defined(PLATFORM_LINUX)
20 #include <sys/ioctl.h>
21 #endif
22
23 #define SND_BLOCKSIZE 4096
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 #undef  SND_BLOCKSIZE
32 #define SND_BLOCKSIZE 32768
33 #endif
34
35 #include "libgame.h"
36
37 #if defined(PLATFORM_LINUX) || defined(PLATFORM_FREEBSD) || defined(VOXWARE)
38 #define AUDIO_STREAMING_DSP
39 #endif
40
41 #if !defined(PLATFORM_MSDOS)
42 #define MAX_SOUNDS_PLAYING      16
43 #else
44 #define MAX_SOUNDS_PLAYING      8
45 #endif
46
47 /* some values for PlaySound(), StopSound() and friends */
48 #if !defined(PLATFORM_MSDOS)
49 #define PSND_SILENCE            0
50 #define PSND_MAX_VOLUME_BITS    7
51 #define PSND_MIN_VOLUME         0
52 #define PSND_MAX_VOLUME         (1 << PSND_MAX_VOLUME_BITS)
53 #define PSND_NO_LOOP            0
54 #define PSND_LOOP               1
55 #define PSND_MIDDLE             0
56 #define PSND_MAX_STEREO_BITS    7
57 #define PSND_MAX_STEREO         (1 << PSND_MAX_STEREO_BITS)
58 #define PSND_MAX_LEFT           (-PSND_MAX_STEREO)
59 #define PSND_MAX_RIGHT          (+PSND_MAX_STEREO)
60 #define PSND_MAX_LEFT2RIGHT_BITS (PSND_MAX_STEREO_BITS+1)
61 #define PSND_MAX_LEFT2RIGHT     (1 << PSND_MAX_LEFT2RIGHT_BITS)
62 #else
63 #define PSND_SILENCE            0
64 #define PSND_MIN_VOLUME         0
65 #define PSND_MAX_VOLUME         255
66 #define PSND_NO_LOOP            0
67 #define PSND_LOOP               1
68 #define PSND_MAX_LEFT           0
69 #define PSND_MAX_RIGHT          255
70 #define PSND_MIDDLE             128
71 #endif
72
73 #define SSND_FADE_SOUND         (1<<0)
74 #define SSND_FADE_ALL_SOUNDS    (1<<1)
75 #define SSND_FADING(x)          (x & (SSND_FADE_SOUND | SSND_FADE_ALL_SOUNDS))
76 #define SSND_STOP_SOUND         (1<<2)
77 #define SSND_STOP_ALL_SOUNDS    (1<<3)
78 #define SSND_STOPPING(x)        (x & (SSND_STOP_SOUND | SSND_STOP_ALL_SOUNDS))
79 #define SSND_ALL(x)             (x&(SSND_FADE_ALL_SOUNDS|SSND_STOP_ALL_SOUNDS))
80
81 /* settings for sound path, sound device, etc. */
82 #ifndef SND_PATH
83 #define SND_PATH        "./sounds"
84 #endif
85
86 #define DEVICENAME_DSP          "/dev/dsp"
87 #define DEVICENAME_AUDIO        "/dev/audio"
88 #define DEVICENAME_AUDIOCTL     "/dev/audioCtl"
89
90 #if 0
91 #if defined(AUDIO_STREAMING_DSP)
92 #define AUDIO_DEVICE    DEVICENAME_DSP
93 #else
94 #define AUDIO_DEVICE    DEVICENAME_AUDIO
95 #endif
96 #endif
97
98 struct SoundHeader_SUN
99 {
100   unsigned long magic;
101   unsigned long hdr_size;
102   unsigned long data_size;
103   unsigned long encoding;
104   unsigned long sample_rate;
105   unsigned long channels;
106 };
107
108 struct SoundHeader_8SVX
109 {
110   char magic_FORM[4];
111   unsigned long chunk_size;
112   char magic_8SVX[4];
113 };
114
115 struct SampleInfo
116
117   char *name;
118   byte *data_ptr;
119   long data_len;
120
121 #if defined(PLATFORM_MSDOS)
122   SAMPLE *sample_ptr;
123 #endif
124
125 #if defined(TARGET_SDL)
126   Mix_Chunk *mix_chunk;
127 #endif
128 };
129
130 struct SoundControl
131 {
132   int nr;
133   int volume;
134   int stereo;
135   boolean active;
136   boolean loop;
137   boolean fade_sound;
138   boolean stop_sound;
139   boolean stop_all_sounds;
140   int playingtime;
141   long playingpos;
142   long data_len;
143   byte *data_ptr;
144
145 #if defined(PLATFORM_MSDOS)
146   int voice;
147 #endif
148 };
149
150 /* general sound functions */
151 void UnixOpenAudio(struct AudioSystemInfo *);
152 void UnixCloseAudio(struct AudioSystemInfo *);
153
154 /* sound server functions */ 
155 void SoundServer(void);
156
157 /* sound client functions */
158 boolean LoadSound(struct SampleInfo *);
159 void PlaySound(int);
160 void PlaySoundStereo(int, int);
161 void PlaySoundLoop(int);
162 void PlaySoundExt(int, int, int, boolean);
163 void FadeSound(int);
164 void FadeSounds(void);
165 void StopSound(int);
166 void StopSounds(void);
167 void StopSoundExt(int, int);
168 void FreeSounds(int);
169
170 #endif