1
/* sound.c - Sound effect function
2
* Copyright (c) 1995-1997 Stefan Jokisch
4
* This file is part of Frotz.
6
* Frotz is free software; you can redistribute it and/or modify
7
* it under the terms of the GNU General Public License as published by
8
* the Free Software Foundation; either version 2 of the License, or
9
* (at your option) any later version.
11
* Frotz is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
* GNU General Public License for more details.
16
* You should have received a copy of the GNU General Public License
17
* along with this program; if not, write to the Free Software
18
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
27
#define EFFECT_PREPARE 1
30
#define EFFECT_FINISH_WITH 4
32
extern int direct_call (zword);
34
static zword routine = 0;
36
static int next_sample = 0;
37
static int next_volume = 0;
39
static bool locked = FALSE;
40
static bool playing = FALSE;
45
* Initialize sound variables.
49
void init_sound (void)
59
* Call the IO interface to play a sample.
63
static void start_sample (int number, int volume, int repeats, zword eos)
66
static zbyte lh_repeats[] = {
67
0x00, 0x00, 0x00, 0x01, 0xff,
68
0x00, 0x01, 0x01, 0x01, 0x01,
69
0xff, 0x01, 0x01, 0xff, 0x00,
70
0xff, 0xff, 0xff, 0xff, 0xff
73
if (story_id == LURKING_HORROR)
74
repeats = lh_repeats[number];
76
os_start_sample (number, volume, repeats, eos);
86
* Play a sample that has been delayed until the previous sound effect has
87
* finished. This is necessary for two samples in The Lurking Horror that
88
* immediately follow other samples.
92
static void start_next_sample (void)
96
start_sample (next_sample, next_volume, 0, 0);
101
}/* start_next_sample */
106
* Call the Z-code routine which was given as the last parameter of
107
* a sound_effect call. This function may be called from a hardware
108
* interrupt (which requires extremely careful programming).
112
void end_of_sound (void)
115
#if defined(DJGPP) && defined(SOUND_SUPPORT)
116
end_of_sound_flag = 0;
123
if (story_id == LURKING_HORROR)
124
start_next_sample ();
126
direct_call (routine);
133
* z_sound_effect, load / play / stop / discard a sound effect.
135
* zargs[0] = number of bleep (1 or 2) or sample
136
* zargs[1] = operation to perform (samples only)
137
* zargs[2] = repeats and volume (play sample only)
138
* zargs[3] = end-of-sound routine (play sample only, optional)
140
* Note: Volumes range from 1 to 8, volume 255 is the default volume.
141
* Repeats are stored in the high byte, 255 is infinite loop.
145
void z_sound_effect (void)
147
zword number = zargs[0];
148
zword effect = zargs[1];
149
zword volume = zargs[2];
151
/* By default play sound 1 at volume 8 */
155
effect = EFFECT_PLAY;
159
if (number >= 3 || number == 0) {
163
if (story_id == LURKING_HORROR && (number == 9 || number == 16)) {
165
if (effect == EFFECT_PLAY) {
167
next_sample = number;
168
next_volume = volume;
173
start_next_sample ();
175
} else locked = FALSE;
186
os_prepare_sample (number);
189
start_sample (number, lo (volume), hi (volume), (zargc == 4) ? zargs[3] : 0);
192
os_stop_sample (number);
194
case EFFECT_FINISH_WITH:
195
os_finish_with_sample (number);
202
} else os_beep (number);
204
}/* z_sound_effect */