84bbd123 |
1 | /* |
2 | * Elite - The New Kind. |
3 | * |
4 | * Reverse engineered from the BBC disk version of Elite. |
5 | * Additional material by C.J.Pinder. |
6 | * |
7 | * The original Elite code is (C) I.Bell & D.Braben 1984. |
8 | * This version re-engineered in C by C.J.Pinder 1999-2001. |
9 | * |
10 | * email: <christian@newkind.co.uk> |
11 | * |
12 | * |
13 | */ |
14 | |
15 | /* |
16 | * sound.c |
17 | */ |
18 | |
19 | #include <stdlib.h> |
20 | #include <allegro.h> |
21 | #include "sound.h" |
22 | #include "alg_data.h" |
23 | |
24 | #define NUM_SAMPLES 14 |
25 | |
26 | extern DATAFILE *datafile; |
27 | |
28 | static int sound_on; |
29 | |
30 | struct sound_sample |
31 | { |
32 | SAMPLE *sample; |
33 | char filename[256]; |
34 | int runtime; |
35 | int timeleft; |
36 | }; |
37 | |
38 | struct sound_sample sample_list[NUM_SAMPLES] = |
39 | { |
40 | {NULL, "launch.wav", 32, 0}, |
41 | {NULL, "crash.wav", 7, 0}, |
42 | {NULL, "dock.wav", 36, 0}, |
43 | {NULL, "gameover.wav", 24, 0}, |
44 | {NULL, "pulse.wav", 4, 0}, |
45 | {NULL, "hitem.wav", 4, 0}, |
46 | {NULL, "explode.wav", 23, 0}, |
47 | {NULL, "ecm.wav", 23, 0}, |
48 | {NULL, "missile.wav", 25, 0}, |
49 | {NULL, "hyper.wav", 37, 0}, |
50 | {NULL, "incom1.wav", 4, 0}, |
51 | {NULL, "incom2.wav", 5, 0}, |
52 | {NULL, "beep.wav", 2, 0}, |
53 | {NULL, "boop.wav", 7, 0}, |
54 | }; |
55 | |
56 | |
57 | void snd_sound_startup (void) |
58 | { |
59 | int i; |
60 | |
61 | /* Install a sound driver.. */ |
62 | sound_on = 1; |
63 | |
64 | if (install_sound(DIGI_AUTODETECT, MIDI_AUTODETECT, ".") != 0) |
65 | { |
66 | sound_on = 0; |
67 | return; |
68 | } |
69 | |
70 | /* Load the sound samples... */ |
71 | |
72 | for (i = 0; i < NUM_SAMPLES; i++) |
73 | { |
74 | sample_list[i].sample = load_sample(sample_list[i].filename); |
75 | } |
76 | } |
77 | |
78 | |
79 | void snd_sound_shutdown (void) |
80 | { |
81 | int i; |
82 | |
83 | if (!sound_on) |
84 | return; |
85 | |
86 | for (i = 0; i < NUM_SAMPLES; i++) |
87 | { |
88 | if (sample_list[i].sample != NULL) |
89 | { |
90 | destroy_sample (sample_list[i].sample); |
91 | sample_list[i].sample = NULL; |
92 | } |
93 | } |
94 | } |
95 | |
96 | |
97 | void snd_play_sample (int sample_no) |
98 | { |
99 | if (!sound_on) |
100 | return; |
101 | |
102 | if (sample_list[sample_no].timeleft != 0) |
103 | return; |
104 | |
105 | sample_list[sample_no].timeleft = sample_list[sample_no].runtime; |
106 | |
107 | play_sample (sample_list[sample_no].sample, 255, 128, 1000, FALSE); |
108 | } |
109 | |
110 | |
111 | void snd_update_sound (void) |
112 | { |
113 | int i; |
114 | |
115 | for (i = 0; i < NUM_SAMPLES; i++) |
116 | { |
117 | if (sample_list[i].timeleft > 0) |
118 | sample_list[i].timeleft--; |
119 | } |
120 | } |
121 | |
122 | |
123 | void snd_play_midi (int midi_no, int repeat) |
124 | { |
125 | if (!sound_on) |
126 | return; |
127 | |
128 | switch (midi_no) |
129 | { |
130 | case SND_ELITE_THEME: |
131 | play_midi (datafile[THEME].dat, repeat); |
132 | break; |
133 | |
134 | case SND_BLUE_DANUBE: |
135 | play_midi (datafile[DANUBE].dat, repeat); |
136 | break; |
137 | } |
138 | } |
139 | |
140 | |
141 | void snd_stop_midi (void) |
142 | { |
143 | if (sound_on); |
144 | play_midi (NULL, TRUE); |
145 | } |