ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/Deliantra-Client/bin/cfplus
(Generate patch)

Comparing deliantra/Deliantra-Client/bin/cfplus (file contents):
Revision 1.195 by root, Tue Jul 31 01:03:52 2007 UTC vs.
Revision 1.198 by root, Tue Jul 31 02:45:39 2007 UTC

159our $STATWIDS; 159our $STATWIDS;
160 160
161our $SDL_ACTIVE; 161our $SDL_ACTIVE;
162our %SDL_CB; 162our %SDL_CB;
163 163
164our $ALT_ENTER_MESSAGE;
165our $STATUSBOX;
166our $DEBUG_STATUS;
167
168our $INV;
169our $INVR;
170our $INV_RIGHT_HB;
171
172our $PICKUP_CFG;
173
174#############################################################################
175
176sub status {
177 $STATUSBOX->add (CFPlus::asxml $_[0], pri => -10, group => "status", timeout => 10, fg => [1, 1, 0, 1]);
178}
179
180sub debug {
181 $DEBUG_STATUS->set_text ($_[0]);
182}
183
184sub message {
185 my ($para) = @_;
186 $MESSAGE_WINDOW->message ($para);
187}
188
189#############################################################################
190#TODO: maybe move into own audio module...
191
164our $SDL_MIXER; 192our $SDL_MIXER;
193
165our $MUSIC_DEFAULT = "in_a_heartbeat.ogg"; 194our $MUSIC_DEFAULT = "in_a_heartbeat.ogg";
166our @MUSIC_WANT; 195our $MUSIC_WANT; # arryref of ambient music we want to play
196our @MUSIC_HAVE; # ambient music we have on disk
167our $MUSIC_START; 197our $MUSIC_START;
198our @MUSIC_JINGLE; # which jingles to play next
168our $MUSIC_PLAYING_DATA; 199our $MUSIC_PLAYING_DATA;
169our $MUSIC_PLAYING_META; 200our $MUSIC_PLAYING_META;
170our $MUSIC_PLAYER; 201our $MUSIC_PLAYER;
171our $MUSIC_RESUME = 30; # resume music when players less than these many seconds before 202our $MUSIC_RESUME = 30; # resume music when played less than these many seconds before
172our @SOUNDS; # event => file mapping 203
173our %AUDIO_CHUNK; # audio files 204our %AUDIO_CHUNK; # audio "files"
174 205our %AUDIO_PLAY; # which audio faces should be played
175our $ALT_ENTER_MESSAGE;
176our $STATUSBOX;
177our $DEBUG_STATUS;
178
179our $INV;
180our $INVR;
181our $INV_RIGHT_HB;
182
183our $PICKUP_CFG;
184
185#############################################################################
186#TODO: maybe move into own audio module...
187 206
188sub audio_channel_finished { 207sub audio_channel_finished {
189 my ($channel) = @_; 208 my ($channel) = @_;
190 209
191# warn "channel $channel finished\n";#d# 210# warn "channel $channel finished\n";#d#
192} 211}
193
194our %AUDIO_PLAY;
195our %AUDIO_CHUNK;
196 212
197sub audio_sound_push($) { 213sub audio_sound_push($) {
198 my ($face) = @_; 214 my ($face) = @_;
199 215
200 if (my $chunk = $AUDIO_CHUNK{$face}) { 216 if (my $chunk = $AUDIO_CHUNK{$face}) {
201 for (grep $_->[0] >= Event::time, @{(delete $AUDIO_PLAY{$face}) || []}) { 217 for (grep $_->[0] >= Event::time, @{(delete $AUDIO_PLAY{$face}) || []}) {
202 my (undef, $dx, $dy, $vol) = @$_; 218 my (undef, $dx, $dy, $vol) = @$_;
203 219
204 my $channel = CFPlus::Channel::find; 220 my $channel = CFPlus::Channel::find;
205 $channel->volume (128 + $vol); 221 $channel->volume ($vol * 128 / 255);
206 $dx = $dx / 10 * 255; 222 $dx = $dx / 10 * 255;
207 $channel->set_panning ((min 255, 255 - $dx), (min 255, 255 + $dx)); 223 $channel->set_panning (255 - $dx, 255 + $dx);
208 224
209# my $angle = $dx ? : $dx < 0 ? 225# my $angle = $dx ? : $dx < 0 ?
210# my $distance = -$vol; 226# my $distance = -$vol;
211# $channel->set_position ($angle, $distance); 227# $channel->set_position ($angle, $distance);
212 228
215 } else { 231 } else {
216 # sound_meta not set means data is in flight either way 232 # sound_meta not set means data is in flight either way
217 my $meta = $CONN->{sound_meta}{$face} 233 my $meta = $CONN->{sound_meta}{$face}
218 or return; 234 or return;
219 235
236 # if its a jingle, play it as ambient music
237 if ($meta->{meta}{jingle}) {
238 delete $AUDIO_PLAY{$face}; # take the jingle out of the sound queue
239 push @MUSIC_JINGLE, $meta; # push it oto the music/jingle queue
240 &audio_music_push ($face);
241 } else {
220 # fetch from database 242 # fetch from database
221 CFPlus::DB::get res_data => $meta->{name}, sub { 243 CFPlus::DB::get res_data => $meta->{name}, sub {
222 my $vol = $meta->{meta}{volume} || 1;
223 my $rwops = new CFPlus::RW $_[0]; 244 my $rwops = new CFPlus::RW $_[0];
224 my $chunk = new CFPlus::MixChunk $rwops; 245 my $chunk = new CFPlus::MixChunk $rwops;
225 $chunk->volume ($vol * 128); 246 $chunk->volume (($meta->{meta}{volume} || 1) * 128);
226 $AUDIO_CHUNK{$face} = $chunk; 247 $AUDIO_CHUNK{$face} = $chunk;
227 248
228 audio_sound_push ($face); 249 audio_sound_push ($face);
250 };
229 }; 251 }
230 } 252 }
231} 253}
232 254
233sub audio_sound_play { 255sub audio_sound_play {
234 my ($face, $dx, $dy, $vol) = @_; 256 my ($face, $dx, $dy, $vol) = @_;
243} 265}
244 266
245sub audio_music_update_volume { 267sub audio_music_update_volume {
246 return unless $MUSIC_PLAYING_META; 268 return unless $MUSIC_PLAYING_META;
247 my $volume = $MUSIC_PLAYING_META->{meta}{volume} || 1; 269 my $volume = $MUSIC_PLAYING_META->{meta}{volume} || 1;
248 my $base = $CFG->{bgm_volume}; 270 my $base = $MUSIC_PLAYING_META->{meta}{jingle} ? 1 : $CFG->{bgm_volume};
249 CFPlus::MixMusic::volume $base * $volume * 128; 271 CFPlus::MixMusic::volume $base * $volume * 128;
250}
251
252sub audio_music_set_ambient {
253 my ($songs) = @_;
254
255 my @want =
256 grep $_,
257 map $CONN->{music_meta}{$_},
258 @$songs;
259
260 if (@want) {
261 @MUSIC_WANT = @want;
262 &audio_music_changed ();
263 }
264} 272}
265 273
266sub audio_music_start { 274sub audio_music_start {
267 my $meta = $MUSIC_PLAYING_META; 275 my $meta = $MUSIC_PLAYING_META;
268 276
298 delete $MUSIC_PLAYING_META->{stop_time}; 306 delete $MUSIC_PLAYING_META->{stop_time};
299 delete $MUSIC_PLAYING_META->{stop_pos}; 307 delete $MUSIC_PLAYING_META->{stop_pos};
300 } 308 }
301} 309}
302 310
303sub audio_music_changed { 311sub audio_music_push {
304 return unless $CFG->{bgm_enable};
305 return unless $SDL_MIXER; 312 return unless $SDL_MIXER;
306 313
314 my $fade_out;
315
316 if (@MUSIC_JINGLE) {
317 @MUSIC_HAVE = $MUSIC_JINGLE[0];
318 $fade_out = 333;
319 } else {
320 return unless $CFG->{bgm_enable};
321
322 my @have =
323 grep $_,
324 map $CONN->{music_meta}{$_},
325 @$MUSIC_WANT;
326
327 @MUSIC_HAVE = @have
328 if @have;
329
307 # default MUSIC_WANT == MUSIC_DEFAULT 330 # default MUSIC_HAVE == MUSIC_DEFAULT
308 @MUSIC_WANT = { path => CFPlus::find_rcfile "music/$MUSIC_DEFAULT" } unless @MUSIC_WANT; 331 @MUSIC_HAVE = { path => CFPlus::find_rcfile "music/$MUSIC_DEFAULT" } unless @MUSIC_HAVE;
332 $fade_out = 1000;
333 }
309 334
310 # if the currently playing song is acceptable, let it continue 335 # if the currently playing song is acceptable, let it continue
311 return if $MUSIC_PLAYING_META 336 return if $MUSIC_PLAYING_META
312 && grep $MUSIC_PLAYING_META == $_, @MUSIC_WANT; 337 && grep $MUSIC_PLAYING_META == $_, @MUSIC_HAVE;
313 338
314 my $NOW = time; 339 my $NOW = time;
315 340
316 if ($MUSIC_PLAYING_META) { 341 if ($MUSIC_PLAYING_META) {
317 $MUSIC_PLAYING_META->{stop_time} = $NOW; 342 $MUSIC_PLAYING_META->{stop_time} = $NOW;
318 $MUSIC_PLAYING_META->{stop_pos} = $NOW - $MUSIC_START; 343 $MUSIC_PLAYING_META->{stop_pos} = $NOW - $MUSIC_START;
319 CFPlus::MixMusic::fade_out 1000; 344 CFPlus::MixMusic::fade_out $fade_out;
320 } else { 345 } else {
321 # sort by stop time, oldest first 346 # sort by stop time, oldest first
322 @MUSIC_WANT = sort { $a->{stop_time} <=> $b->{stop_time} } @MUSIC_WANT; 347 @MUSIC_HAVE = sort { $a->{stop_time} <=> $b->{stop_time} } @MUSIC_HAVE;
323 348
324 # if the most recently-played piece played very recently, 349 # if the most recently-played piece played very recently,
325 # resume it, else choose the oldest piece for rotation. 350 # resume it, else choose the oldest piece for rotation.
326 $MUSIC_PLAYING_META = 351 $MUSIC_PLAYING_META =
327 $MUSIC_WANT[-1]{stop_time} > $NOW - $MUSIC_RESUME 352 $MUSIC_HAVE[-1]{stop_time} > $NOW - $MUSIC_RESUME
328 ? $MUSIC_WANT[-1] 353 ? $MUSIC_HAVE[-1]
329 : $MUSIC_WANT[0]; 354 : $MUSIC_HAVE[0];
330 355
331 audio_music_start; 356 audio_music_start;
332 } 357 }
333} 358}
334 359
360sub audio_music_set_ambient {
361 my ($songs) = @_;
362
363 $MUSIC_WANT = $songs;
364 audio_music_push;
365}
366
335sub audio_music_finished { 367sub audio_music_finished {
368 # we compress multiple jingles of the same type
369 shift @MUSIC_JINGLE
370 while @MUSIC_JINGLE && $MUSIC_PLAYING_META == $MUSIC_JINGLE[0];
371
336 undef $MUSIC_PLAYER; 372 undef $MUSIC_PLAYER;
337 undef $MUSIC_PLAYING_META; 373 undef $MUSIC_PLAYING_META;
338 undef $MUSIC_PLAYING_DATA; 374 undef $MUSIC_PLAYING_DATA;
339 375
340 audio_music_changed; 376 audio_music_push;
377}
378
379sub audio_init {
380 if ($CFG->{audio_enable}) {
381 $ENV{MIX_EFFECTSMAXSPEED} = 1;
382 $SDL_MIXER = !CFPlus::Mix_OpenAudio;
383
384 unless ($SDL_MIXER) {
385 status "Unable to open sound device: there will be no sound";
386 return;
387 }
388
389 CFPlus::Mix_AllocateChannels 16;
390
391 audio_music_finished;
392 } else {
393 undef $SDL_MIXER;
394 }
395}
396
397sub audio_shutdown {
398 undef $MUSIC_PLAYER;
399 undef $MUSIC_PLAYING_META;
400 undef $MUSIC_PLAYING_DATA;
401
402 $MUSIC_WANT = [];
403 @MUSIC_JINGLE = ();
404 %AUDIO_PLAY = ();
405 %AUDIO_CHUNK = ();
406
407 CFPlus::Mix_CloseAudio if $SDL_MIXER;
408 undef $SDL_MIXER;
341} 409}
342 410
343############################################################################# 411#############################################################################
344
345sub status {
346 $STATUSBOX->add (CFPlus::asxml $_[0], pri => -10, group => "status", timeout => 10, fg => [1, 1, 0, 1]);
347}
348
349sub debug {
350 $DEBUG_STATUS->set_text ($_[0]);
351}
352
353sub message {
354 my ($para) = @_;
355 $MESSAGE_WINDOW->message ($para);
356}
357 412
358sub destroy_query_dialog { 413sub destroy_query_dialog {
359 (delete $_[0]{query_dialog})->destroy 414 (delete $_[0]{query_dialog})->destroy
360 if $_[0]{query_dialog}; 415 if $_[0]{query_dialog};
361} 416}
1945 2000
1946sub video_shutdown { 2001sub video_shutdown {
1947 CFPlus::OpenGL::shutdown; 2002 CFPlus::OpenGL::shutdown;
1948 2003
1949 undef $SDL_ACTIVE; 2004 undef $SDL_ACTIVE;
1950}
1951
1952sub audio_init {
1953 if ($CFG->{audio_enable}) {
1954 $ENV{MIX_EFFECTSMAXSPEED} = 1;
1955 $SDL_MIXER = !CFPlus::Mix_OpenAudio;
1956
1957 unless ($SDL_MIXER) {
1958 status "Unable to open sound device: there will be no sound";
1959 return;
1960 }
1961
1962 CFPlus::Mix_AllocateChannels 16;
1963
1964 audio_music_finished;
1965 } else {
1966 undef $SDL_MIXER;
1967 }
1968}
1969
1970sub audio_shutdown {
1971 CFPlus::Mix_CloseAudio if $SDL_MIXER;
1972 undef $SDL_MIXER;
1973 @SOUNDS = ();
1974 %AUDIO_CHUNK = ();
1975} 2005}
1976 2006
1977my %animate_object; 2007my %animate_object;
1978my $animate_timer; 2008my $animate_timer;
1979 2009

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines