45 |
45 |
46 // MUSIC |
46 // MUSIC |
47 |
47 |
48 // Obvious music commands for music track |
48 // Obvious music commands for music track |
49 procedure SetMusic(enabled: boolean); // Enable/disable music. |
49 procedure SetMusic(enabled: boolean); // Enable/disable music. |
50 procedure SetMusicName(musicname: shortstring); // Enable/disable music and set name of musicfile to play. |
50 procedure SetMusicName(musicname: shortstring); // Enable/disable music and set name of the file to play. |
51 procedure PlayMusic; // Play music from the start. |
51 procedure PlayMusic; // Play music from the start. |
52 procedure PauseMusic; // Pause music. |
52 procedure PauseMusic; // Pause music. |
53 procedure ResumeMusic; // Resume music from pause point. |
53 procedure ResumeMusic; // Resume music from pause point. |
54 procedure ChangeMusic(musicname: shortstring); // Replaces music track with musicname and plays it. |
54 procedure ChangeMusic(musicname: shortstring); // Replaces music track with musicname and plays it. |
55 procedure StopMusic; // Stops and releases the current track. |
55 procedure StopMusic; // Stops and releases the current track. |
80 |
80 |
81 procedure AddVoice(snd: TSound; voicepack: PVoicepack); |
81 procedure AddVoice(snd: TSound; voicepack: PVoicepack); |
82 procedure PlayNextVoice; |
82 procedure PlayNextVoice; |
83 |
83 |
84 |
84 |
85 // MISC |
85 // GLOBAL FUNCTIONS |
86 |
|
87 // Set the initial volume |
|
88 procedure SetVolume(volume: LongInt); |
|
89 |
|
90 // Modifies the sound volume of the game by voldelta and returns the new volume level. |
|
91 function ChangeVolume(voldelta: LongInt): LongInt; |
|
92 |
|
93 // Returns a pointer to the voicepack with the given name. |
|
94 function AskForVoicepack(name: shortstring): Pointer; |
|
95 |
86 |
96 // Drastically lower the volume when we lose focus (and restore the previous value). |
87 // Drastically lower the volume when we lose focus (and restore the previous value). |
97 procedure DampenAudio; |
88 procedure DampenAudio; |
98 procedure UndampenAudio; |
89 procedure UndampenAudio; |
99 |
90 |
|
91 // Mute/Unmute audio |
|
92 procedure MuteAudio; |
|
93 |
|
94 |
|
95 // MISC |
|
96 |
|
97 // Set the initial volume |
|
98 procedure SetVolume(volume: LongInt); |
|
99 |
|
100 // Modifies the sound volume of the game by voldelta and returns the new volume level. |
|
101 function ChangeVolume(voldelta: LongInt): LongInt; |
|
102 |
|
103 // Returns a pointer to the voicepack with the given name. |
|
104 function AskForVoicepack(name: shortstring): Pointer; |
|
105 |
|
106 |
100 implementation |
107 implementation |
101 uses uVariables, uConsole, uUtils, uCommands, uDebug; |
108 uses uVariables, uConsole, uUtils, uCommands, uDebug; |
102 |
109 |
103 const chanTPU = 32; |
110 const chanTPU = 32; |
104 var Volume: LongInt; |
111 var Volume: LongInt; |
|
112 cInitVolume: LongInt; |
|
113 previousVolume: LongInt; // cached volume value |
105 lastChan: array [TSound] of LongInt; |
114 lastChan: array [TSound] of LongInt; |
106 voicepacks: array[0..cMaxTeams] of TVoicepack; |
115 voicepacks: array[0..cMaxTeams] of TVoicepack; |
107 defVoicepack: PVoicepack; |
116 defVoicepack: PVoicepack; |
108 Mus: PMixMusic = nil; |
117 Mus: PMixMusic = nil; // music pointer |
109 MusicFN: shortstring; // music file name |
118 MusicFN: shortstring; // music file name |
110 previousVolume: LongInt; // cached volume value |
|
111 isMusicEnabled: boolean; |
119 isMusicEnabled: boolean; |
112 isSoundEnabled: boolean; |
120 isSoundEnabled: boolean; |
113 isSEBackup: boolean; |
121 isSEBackup: boolean; |
114 cInitVolume: LongInt; |
|
115 |
122 |
116 |
123 |
117 function AskForVoicepack(name: shortstring): Pointer; |
124 function AskForVoicepack(name: shortstring): Pointer; |
118 var i: Longword; |
125 var i: Longword; |
119 locName, path: shortstring; |
126 locName, path: shortstring; |
178 WriteToConsole('Init SDL_mixer... '); |
185 WriteToConsole('Init SDL_mixer... '); |
179 SDLTry(Mix_Init(MIX_INIT_OGG) <> 0, true); |
186 SDLTry(Mix_Init(MIX_INIT_OGG) <> 0, true); |
180 WriteLnToConsole(msgOK); |
187 WriteLnToConsole(msgOK); |
181 |
188 |
182 Mix_AllocateChannels(Succ(chanTPU)); |
189 Mix_AllocateChannels(Succ(chanTPU)); |
183 ChangeVolume(cInitVolume); |
190 ChangeVolume(cInitVolume); |
184 end; |
191 end; |
185 |
192 |
186 procedure ResetSound; |
193 procedure ResetSound; |
187 begin |
194 begin |
188 isSoundEnabled:= isSEBackup; |
195 isSoundEnabled:= isSEBackup; |
456 Mix_Volume(-1, Volume); |
463 Mix_Volume(-1, Volume); |
457 // get assigned Volume |
464 // get assigned Volume |
458 Volume:= Mix_Volume(-1, -1); |
465 Volume:= Mix_Volume(-1, -1); |
459 if isMusicEnabled then |
466 if isMusicEnabled then |
460 Mix_VolumeMusic(Volume * 4 div 8); |
467 Mix_VolumeMusic(Volume * 4 div 8); |
461 ChangeVolume:= Volume * 100 div MIX_MAX_VOLUME |
468 ChangeVolume:= Volume * 100 div MIX_MAX_VOLUME; |
|
469 |
|
470 if (isMusicEnabled) then |
|
471 if (Volume = 0) then |
|
472 PauseMusic |
|
473 else |
|
474 ResumeMusic; |
|
475 |
|
476 isAudioMuted:= (Volume = 0); |
462 end; |
477 end; |
463 |
478 |
464 procedure DampenAudio; |
479 procedure DampenAudio; |
465 begin |
480 begin |
|
481 if (isAudioMuted) then |
|
482 exit; |
466 previousVolume:= Volume; |
483 previousVolume:= Volume; |
467 ChangeVolume(-Volume * 7 div 9); |
484 ChangeVolume(-Volume * 7 div 9); |
468 end; |
485 end; |
469 |
486 |
470 procedure UndampenAudio; |
487 procedure UndampenAudio; |
471 begin |
488 begin |
|
489 if (isAudioMuted) then |
|
490 exit; |
472 ChangeVolume(previousVolume - Volume); |
491 ChangeVolume(previousVolume - Volume); |
|
492 end; |
|
493 |
|
494 procedure MuteAudio; |
|
495 begin |
|
496 if (not isSoundEnabled) then |
|
497 exit; |
|
498 |
|
499 if (isAudioMuted) then |
|
500 begin |
|
501 ResumeMusic; |
|
502 ChangeVolume(previousVolume); |
|
503 end |
|
504 else |
|
505 begin |
|
506 PauseMusic; |
|
507 previousVolume:= Volume; |
|
508 ChangeVolume(-Volume); |
|
509 end; |
|
510 |
|
511 // isAudioMuted is updated in ChangeVolume |
473 end; |
512 end; |
474 |
513 |
475 procedure SetMusic(enabled: boolean); |
514 procedure SetMusic(enabled: boolean); |
476 begin |
515 begin |
477 isMusicEnabled:= enabled; |
516 isMusicEnabled:= enabled; |
532 if s[byte(s[0])]='"' then |
571 if s[byte(s[0])]='"' then |
533 Delete(s, byte(s[0]), 1); |
572 Delete(s, byte(s[0]), 1); |
534 CurrentTeam^.voicepack:= AskForVoicepack(s) |
573 CurrentTeam^.voicepack:= AskForVoicepack(s) |
535 end; |
574 end; |
536 |
575 |
|
576 procedure chMute(var s: shortstring); |
|
577 begin |
|
578 s:= s; // avoid compiler hint |
|
579 MuteAudio; |
|
580 end; |
|
581 |
537 procedure initModule; |
582 procedure initModule; |
538 var t: LongInt; |
583 var t: LongInt; |
539 i: TSound; |
584 i: TSound; |
540 begin |
585 begin |
541 RegisterVariable('voicepack', @chVoicepack, false); |
586 RegisterVariable('voicepack', @chVoicepack, false); |
|
587 RegisterVariable('mute' , @chMute , true ); |
542 |
588 |
543 MusicFN:=''; |
589 MusicFN:=''; |
544 isMusicEnabled:= true; |
590 isMusicEnabled:= true; |
545 isSoundEnabled:= true; |
591 isSoundEnabled:= true; |
|
592 isAudioMuted:= false; |
546 isSEBackup:= isSoundEnabled; |
593 isSEBackup:= isSoundEnabled; |
547 cInitVolume:= 100; |
594 cInitVolume:= 100; |
548 Volume:= 0; |
595 Volume:= 0; |
549 defVoicepack:= AskForVoicepack('Default'); |
596 defVoicepack:= AskForVoicepack('Default'); |
550 |
597 |