]>
git.zerfleddert.de Git - micropolis/blob - src/sim/w_sound.c
3f2ec389321a9489eac5dea931b4454393b9f392
2 * Portions Copyright (c) 2008 Deanna Phillips <deanna@sdf.lonestar.org>
7 * Micropolis, Unix Version. This game was released for the Unix platform
8 * in or about 1990 and has been modified for inclusion in the One Laptop
9 * Per Child program. Copyright (C) 1989 - 2007 Electronic Arts Inc. If
10 * you need assistance with this program, you may contact:
11 * http://wiki.laptop.org/go/Micropolis or email micropolis@laptop.org.
13 * This program is free software: you can redistribute it and/or modify
14 * it under the terms of the GNU General Public License as published by
15 * the Free Software Foundation, either version 3 of the License, or (at
16 * your option) any later version.
18 * This program is distributed in the hope that it will be useful, but
19 * WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
21 * General Public License for more details. You should have received a
22 * copy of the GNU General Public License along with this program. If
23 * not, see <http://www.gnu.org/licenses/>.
25 * ADDITIONAL TERMS per GNU GPL Section 7
27 * No trademark or publicity rights are granted. This license does NOT
28 * give you any right, title or interest in the trademark SimCity or any
29 * other Electronic Arts trademark. You may not distribute any
30 * modification of this program using the trademark SimCity or claim any
31 * affliation or association with Electronic Arts Inc. or its employees.
33 * Any propagation or conveyance of this program must include this
34 * copyright notice and these terms.
36 * If you convey this program (or any modifications of it) and assume
37 * contractual liability for the program to recipients of it, you agree
38 * to indemnify Electronic Arts for any liability that those contractual
39 * assumptions impose on Electronic Arts.
41 * You may not misrepresent the origins of this program; modified
42 * versions of the program must be marked as such and not identified as
43 * the original program.
45 * This disclaimer supplements the one included in the General Public
46 * License. TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, THIS
47 * PROGRAM IS PROVIDED TO YOU "AS IS," WITH ALL FAULTS, WITHOUT WARRANTY
48 * OF ANY KIND, AND YOUR USE IS AT YOUR SOLE RISK. THE ENTIRE RISK OF
49 * SATISFACTORY QUALITY AND PERFORMANCE RESIDES WITH YOU. ELECTRONIC ARTS
50 * DISCLAIMS ANY AND ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES,
51 * INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY,
52 * FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY
53 * RIGHTS, AND WARRANTIES (IF ANY) ARISING FROM A COURSE OF DEALING,
54 * USAGE, OR TRADE PRACTICE. ELECTRONIC ARTS DOES NOT WARRANT AGAINST
55 * INTERFERENCE WITH YOUR ENJOYMENT OF THE PROGRAM; THAT THE PROGRAM WILL
56 * MEET YOUR REQUIREMENTS; THAT OPERATION OF THE PROGRAM WILL BE
57 * UNINTERRUPTED OR ERROR-FREE, OR THAT THE PROGRAM WILL BE COMPATIBLE
58 * WITH THIRD PARTY SOFTWARE OR THAT ANY ERRORS IN THE PROGRAM WILL BE
59 * CORRECTED. NO ORAL OR WRITTEN ADVICE PROVIDED BY ELECTRONIC ARTS OR
60 * ANY AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY. SOME
61 * JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF OR LIMITATIONS ON IMPLIED
62 * WARRANTIES OR THE LIMITATIONS ON THE APPLICABLE STATUTORY RIGHTS OF A
63 * CONSUMER, SO SOME OR ALL OF THE ABOVE EXCLUSIONS AND LIMITATIONS MAY
68 #include "SDL_mixer.h"
74 #define SIM_NSOUNDS 47
75 #define SIM_NCHANNELS 32
76 #define DOZER_CHANNEL 0
77 #define DOZER_SOUND "rumble.wav"
89 struct sound sounds
[SIM_NSOUNDS
] = {
90 { "A", "a.wav", NULL
},
91 { "Aaah", "aaah.wav", NULL
},
92 { "Airport", "airport.wav", NULL
},
93 { "Beep", "beep.wav", NULL
},
94 { "Boing", "boing.wav", NULL
},
95 { "Bop", "bop.wav", NULL
},
96 { "Build", "build.wav", NULL
},
97 { "Bulldozer", "bulldozer.wav", NULL
},
98 { "Chalk", "chalk.wav", NULL
},
99 { "Coal", "coal.wav", NULL
},
100 { "Com", "com.wav", NULL
},
101 { "Computer", "computer.wav", NULL
},
102 { "Cuckoo", "cuckoo.wav", NULL
},
103 { "E", "e.wav", NULL
},
104 { "Eraser", "eraser.wav", NULL
},
105 { "Explosion-High", "explosion-high.wav", NULL
},
106 { "Explosion-Low", "explosion-low.wav", NULL
},
107 { "Fire", "fire.wav", NULL
},
108 { "HeavyTraffic", "heavytraffic.wav", NULL
},
109 { "HonkHonk-High", "honkhonk-high.wav", NULL
},
110 { "HonkHonk-Low", "honkhonk-low.wav", NULL
},
111 { "HonkHonk-Med", "honkhonk-med.wav", NULL
},
112 { "Ignition", "ignition.wav", NULL
},
113 { "Ind", "ind.wav", NULL
},
114 { "Monster", "monster.wav", NULL
},
115 { "Nuclear", "nuclear.wav", NULL
},
116 { "O", "o.wav", NULL
},
117 { "Oop", "oop.wav", NULL
},
118 { "Park", "park.wav", NULL
},
119 { "Player", "player.wav", NULL
},
120 { "Police", "police.wav", NULL
},
121 { "QuackQuack", "quackquack.wav", NULL
},
122 { "Query", "query.wav", NULL
},
123 { "Rail", "rail.wav", NULL
},
124 { "Res", "res.wav", NULL
},
125 { "Road", "road.wav", NULL
},
126 { "Rumble", "rumble.wav", NULL
},
127 { "Seaport", "seaport.wav", NULL
},
128 { "Siren", "siren.wav", NULL
},
129 { "Skid", "skid.wav", NULL
},
130 { "Sorry", "sorry.wav", NULL
},
131 { "Stadium", "stadium.wav", NULL
},
132 { "UhUh", "uhuh.wav", NULL
},
133 { "Whip", "whip.wav", NULL
},
134 { "Wire", "wire.wav", NULL
},
135 { "Woosh", "woosh.wav", NULL
},
136 { "Zone", "zone.wav", NULL
}
139 static int SoundInitialized
= 0;
141 #ifdef WITH_SDL_MIXER
153 if (SDL_Init(SDL_INIT_AUDIO
) == -1) {
154 fprintf(stderr
, "SDL_Init: %s\n", SDL_GetError());
158 if (Mix_OpenAudio(22050, MIX_DEFAULT_FORMAT
, 1, 1024) == -1) {
159 fprintf(stderr
, "Mix_OpenAudio: %s\n", Mix_GetError());
163 reserved_chans
= Mix_ReserveChannels(1);
165 if (reserved_chans
!= 1) {
166 fprintf(stderr
, "Mix_ReserveChannels: %s\n", Mix_GetError());
170 if (Mix_AllocateChannels(SIM_NCHANNELS
) == -1) {
171 fprintf(stderr
, "Mix_AllocateChannels: %s\n", Mix_GetError());
175 snprintf(buf
, sizeof(buf
), "%s/sounds/%s", ResourceDir
, DOZER_SOUND
);
176 rumble
= Mix_LoadWAV(buf
);
178 if (rumble
== NULL
) {
179 printf("Mix_LoadWAV: %s\n", Mix_GetError());
183 SoundInitialized
= 1;
190 SoundInitialized
= 0;
192 for (i
= 0; i
< SIM_NSOUNDS
; i
++) {
193 if (sounds
[i
].wave
) {
194 Mix_FreeChunk(sounds
[i
].wave
);
195 sounds
[i
].wave
= NULL
;
199 Mix_FreeChunk(rumble
);
207 MakeSound(char *channel
, char *id
)
212 if (!UserSoundOn
) return;
213 if (!SoundInitialized
) return;
215 for (i
= 0; i
< SIM_NSOUNDS
; i
++) {
216 if (!strcmp(sounds
[i
].id
, id
))
220 if (sounds
[i
].wave
) {
221 if (Mix_PlayChannel(-1, sounds
[i
].wave
, 0) == -1)
222 fprintf(stderr
, "Mix_PlayChannel: %s\n", Mix_GetError());
226 snprintf(buf
, sizeof(buf
), "%s/sounds/%s", ResourceDir
,
229 sounds
[i
].wave
= Mix_LoadWAV(buf
);
231 if (sounds
[i
].wave
== NULL
) {
232 fprintf(stderr
, "Mix_LoadWAV: %s\n", Mix_GetError());
236 if (Mix_PlayChannel(-1, sounds
[i
].wave
, 0) == -1)
237 fprintf(stderr
, "Mix_PlayChannel: %s\n", Mix_GetError());
242 if (!UserSoundOn
) return;
243 if (!SoundInitialized
) return;
245 if (Mix_PlayChannel(DOZER_CHANNEL
, rumble
, 4) == -1) {
246 printf("Mix_PlayChannel: %s\n", Mix_GetError());
254 if (!UserSoundOn
) return;
255 if (!SoundInitialized
) return;
257 Mix_HaltChannel(DOZER_CHANNEL
);
260 #else /* WITH_SDL_MIXER */
263 SoundInitialized
= 1;
268 SoundInitialized
= 0;
271 MakeSound(char *channel
, char *id
)
273 char filename
[256], player
[256];
277 if (!UserSoundOn
) return;
278 if (!SoundInitialized
) return;
280 for (i
= 0; i
< SIM_NSOUNDS
; i
++) {
281 if (!strcmp(sounds
[i
].id
, id
))
285 snprintf(filename
, sizeof(filename
), "%s/sounds/%s", ResourceDir
,
288 snprintf(player
, sizeof(player
), "%s/sounds/player", ResourceDir
);
294 execl(player
, player
, filename
, NULL
);
298 perror("fork failed");
307 MakeSound(0, "Rumble");
316 MakeSoundOn(SimView
*view
, char *channel
, char *id
)
318 if (!UserSoundOn
) return;
319 if (!SoundInitialized
) return;
321 MakeSound(channel
, id
);
325 /* XXX comefrom: doKeyEvent */
332 DoStartSound(char *channel
, char *id
)
334 MakeSound(channel
, id
);
337 DoStopSound(char *id
)
342 SoundCmd(CLIENT_ARGS
)
344 if (!strcmp(argv
[2], "Rumble"))
347 MakeSound(NULL
, argv
[2]);
351 DozerCmd(CLIENT_ARGS
)
359 Tcl_CreateCommand(tk_mainInterp
, "playsound", SoundCmd
,
360 (ClientData
)NULL
, (void (*)()) NULL
);
361 Tcl_CreateCommand(tk_mainInterp
, "stopdozer", DozerCmd
,
362 (ClientData
)NULL
, (void (*)()) NULL
);