author | Xeli |
Sun, 22 Apr 2012 15:13:17 +0200 | |
changeset 6909 | 2b9c1228d516 |
parent 6898 | 344b0dbd9690 |
child 6990 | 40e5af28d026 |
permissions | -rw-r--r-- |
4 | 1 |
(* |
1066 | 2 |
* Hedgewars, a free turn based strategy game |
6700 | 3 |
* Copyright (c) 2004-2012 Andrey Korotaev <unC0Rr@gmail.com> |
4 | 4 |
* |
183 | 5 |
* This program is free software; you can redistribute it and/or modify |
6 |
* it under the terms of the GNU General Public License as published by |
|
7 |
* the Free Software Foundation; version 2 of the License |
|
4 | 8 |
* |
183 | 9 |
* This program is distributed in the hope that it will be useful, |
10 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
11 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
12 |
* GNU General Public License for more details. |
|
4 | 13 |
* |
183 | 14 |
* You should have received a copy of the GNU General Public License |
15 |
* along with this program; if not, write to the Free Software |
|
16 |
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA |
|
4 | 17 |
*) |
18 |
||
2630 | 19 |
{$INCLUDE "options.inc"} |
20 |
||
4 | 21 |
unit uSound; |
5134 | 22 |
(* |
23 |
* This unit controls the sounds and music of the game. |
|
24 |
* Doesn't really do anything if isSoundEnabled = false. |
|
25 |
* |
|
26 |
* There are three basic types of sound controls: |
|
27 |
* Music - The background music of the game: |
|
28 |
* * will only be played if isMusicEnabled = true |
|
29 |
* * can be started, changed, paused and resumed |
|
30 |
* Sound - Can be started and stopped |
|
31 |
* Looped Sound - Subtype of sound: plays in a loop using a |
|
32 |
* "channel", of which the id is returned on start. |
|
33 |
* The channel id can be used to stop a specific sound loop. |
|
34 |
*) |
|
4 | 35 |
interface |
5107
d7fc678d78f4
Allow override of voicepack with a locale voicepack. Untested, but should mean that a Default voice should use the Ukranian version if that is their locale.
nemo
parents:
5052
diff
changeset
|
36 |
uses SDLh, uConsts, uTypes, sysutils; |
4 | 37 |
|
5134 | 38 |
var MusicFN: shortstring; // music file name |
6862 | 39 |
previousVolume: LongInt; // cached volume value |
2716
b9ca1bfca24f
complete the replacement of init/free wrappers for every unit
koda
parents:
2674
diff
changeset
|
40 |
|
3038 | 41 |
procedure initModule; |
42 |
procedure freeModule; |
|
2716
b9ca1bfca24f
complete the replacement of init/free wrappers for every unit
koda
parents:
2674
diff
changeset
|
43 |
|
5134 | 44 |
procedure InitSound; // Initiates sound-system if isSoundEnabled. |
6362
ceacd1b61833
modify ReleaseSound so that it performs a partial release of unused sounds, useful for responding to memory warnings
koda
parents:
6360
diff
changeset
|
45 |
procedure ReleaseSound(complete: boolean); // Releases sound-system and used resources. |
5134 | 46 |
procedure SoundLoad; // Preloads some sounds for performance reasons. |
47 |
||
48 |
||
49 |
// MUSIC |
|
50 |
||
51 |
// Obvious music commands for music track specified in MusicFN. |
|
52 |
procedure PlayMusic; |
|
53 |
procedure PauseMusic; |
|
54 |
procedure ResumeMusic; |
|
55 |
procedure ChangeMusic; // Replaces music track with current MusicFN and plays it. |
|
6472 | 56 |
procedure StopMusic; // Stops and releases the current track |
5134 | 57 |
|
58 |
||
59 |
// SOUNDS |
|
60 |
||
61 |
// Plays the sound snd [from a given voicepack], |
|
62 |
// if keepPlaying is given and true, |
|
63 |
// then the sound's playback won't be interrupted if asked to play again. |
|
2745 | 64 |
procedure PlaySound(snd: TSound); |
3202 | 65 |
procedure PlaySound(snd: TSound; keepPlaying: boolean); |
2745 | 66 |
procedure PlaySound(snd: TSound; voicepack: PVoicepack); |
3201 | 67 |
procedure PlaySound(snd: TSound; voicepack: PVoicepack; keepPlaying: boolean); |
5134 | 68 |
|
69 |
// Plays sound snd [of voicepack] in a loop, but starts with fadems milliseconds of fade-in. |
|
70 |
// Returns sound channel of the looped sound. |
|
3529 | 71 |
function LoopSound(snd: TSound): LongInt; |
4956
48e1f9a04c28
usound: added function for loops with fade in and out
koda
parents:
4948
diff
changeset
|
72 |
function LoopSound(snd: TSound; fadems: LongInt): LongInt; |
5134 | 73 |
function LoopSound(snd: TSound; voicepack: PVoicepack): LongInt; // WTF? |
4956
48e1f9a04c28
usound: added function for loops with fade in and out
koda
parents:
4948
diff
changeset
|
74 |
function LoopSound(snd: TSound; voicepack: PVoicepack; fadems: LongInt): LongInt; |
5134 | 75 |
|
76 |
// Stops the normal/looped sound of the given type/in the given channel |
|
77 |
// [with a fade-out effect for fadems milliseconds]. |
|
282 | 78 |
procedure StopSound(snd: TSound); |
2745 | 79 |
procedure StopSound(chn: LongInt); |
4966
fa612a614317
make defective mines explode if they take enough damage, add missing interface line for koda's new uSound fade
nemo
parents:
4956
diff
changeset
|
80 |
procedure StopSound(chn, fadems: LongInt); |
5134 | 81 |
|
5638
e35ba2a400d8
Try to avoid overlapping voices for major statements (not things like byebye or oof)
nemo
parents:
5239
diff
changeset
|
82 |
procedure AddVoice(snd: TSound; voicepack: PVoicepack); |
e35ba2a400d8
Try to avoid overlapping voices for major statements (not things like byebye or oof)
nemo
parents:
5239
diff
changeset
|
83 |
procedure PlayNextVoice; |
e35ba2a400d8
Try to avoid overlapping voices for major statements (not things like byebye or oof)
nemo
parents:
5239
diff
changeset
|
84 |
|
5134 | 85 |
|
86 |
// MISC |
|
87 |
||
88 |
// Modifies the sound volume of the game by voldelta and returns the new volume level. |
|
2515
51d3f4b6293a
revert audio to use SDL_mixer -- also frontend uses it, so it needs sdlmixer sources
koda
parents:
2501
diff
changeset
|
89 |
function ChangeVolume(voldelta: LongInt): LongInt; |
5134 | 90 |
|
91 |
// Returns a pointer to the voicepack with the given name. |
|
2515
51d3f4b6293a
revert audio to use SDL_mixer -- also frontend uses it, so it needs sdlmixer sources
koda
parents:
2501
diff
changeset
|
92 |
function AskForVoicepack(name: shortstring): Pointer; |
4 | 93 |
|
6862 | 94 |
// Drastically lower the volume when we lose focus (and restore the previous value) |
95 |
procedure DampenAudio; |
|
96 |
procedure UndampenAudio; |
|
1097 | 97 |
|
4 | 98 |
implementation |
4948 | 99 |
uses uVariables, uConsole, uUtils, uCommands, uDebug; |
564 | 100 |
|
3418 | 101 |
const chanTPU = 32; |
2515
51d3f4b6293a
revert audio to use SDL_mixer -- also frontend uses it, so it needs sdlmixer sources
koda
parents:
2501
diff
changeset
|
102 |
var Volume: LongInt; |
2716
b9ca1bfca24f
complete the replacement of init/free wrappers for every unit
koda
parents:
2674
diff
changeset
|
103 |
lastChan: array [TSound] of LongInt; |
b9ca1bfca24f
complete the replacement of init/free wrappers for every unit
koda
parents:
2674
diff
changeset
|
104 |
voicepacks: array[0..cMaxTeams] of TVoicepack; |
b9ca1bfca24f
complete the replacement of init/free wrappers for every unit
koda
parents:
2674
diff
changeset
|
105 |
defVoicepack: PVoicepack; |
b9ca1bfca24f
complete the replacement of init/free wrappers for every unit
koda
parents:
2674
diff
changeset
|
106 |
Mus: PMixMusic = nil; |
1654 | 107 |
|
2515
51d3f4b6293a
revert audio to use SDL_mixer -- also frontend uses it, so it needs sdlmixer sources
koda
parents:
2501
diff
changeset
|
108 |
function AskForVoicepack(name: shortstring): Pointer; |
1654 | 109 |
var i: Longword; |
5107
d7fc678d78f4
Allow override of voicepack with a locale voicepack. Untested, but should mean that a Default voice should use the Ukranian version if that is their locale.
nemo
parents:
5052
diff
changeset
|
110 |
locName, path: shortstring; |
1654 | 111 |
begin |
112 |
i:= 0; |
|
5107
d7fc678d78f4
Allow override of voicepack with a locale voicepack. Untested, but should mean that a Default voice should use the Ukranian version if that is their locale.
nemo
parents:
5052
diff
changeset
|
113 |
// First, attempt to locate a localised version of the voice |
d7fc678d78f4
Allow override of voicepack with a locale voicepack. Untested, but should mean that a Default voice should use the Ukranian version if that is their locale.
nemo
parents:
5052
diff
changeset
|
114 |
if cLocale <> 'en' then |
d7fc678d78f4
Allow override of voicepack with a locale voicepack. Untested, but should mean that a Default voice should use the Ukranian version if that is their locale.
nemo
parents:
5052
diff
changeset
|
115 |
begin |
d7fc678d78f4
Allow override of voicepack with a locale voicepack. Untested, but should mean that a Default voice should use the Ukranian version if that is their locale.
nemo
parents:
5052
diff
changeset
|
116 |
locName:= name+'_'+cLocale; |
5238
46ddaf14509d
Enable ~/.hedgewars/Data (or platform equivalent) to override/extend pretty much everything in system Data dir. Obviously desyncing can occur, so this is at user's own risk. Should simplify map etc install. Needs testing.
nemo
parents:
5134
diff
changeset
|
117 |
path:= UserPathz[ptVoices] + '/' + locName; |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6551
diff
changeset
|
118 |
if DirectoryExists(path) then |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6551
diff
changeset
|
119 |
name:= locName |
5238
46ddaf14509d
Enable ~/.hedgewars/Data (or platform equivalent) to override/extend pretty much everything in system Data dir. Obviously desyncing can occur, so this is at user's own risk. Should simplify map etc install. Needs testing.
nemo
parents:
5134
diff
changeset
|
120 |
else |
5107
d7fc678d78f4
Allow override of voicepack with a locale voicepack. Untested, but should mean that a Default voice should use the Ukranian version if that is their locale.
nemo
parents:
5052
diff
changeset
|
121 |
begin |
d7fc678d78f4
Allow override of voicepack with a locale voicepack. Untested, but should mean that a Default voice should use the Ukranian version if that is their locale.
nemo
parents:
5052
diff
changeset
|
122 |
path:= Pathz[ptVoices] + '/' + locName; |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6551
diff
changeset
|
123 |
if DirectoryExists(path) then |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6551
diff
changeset
|
124 |
name:= locName |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6551
diff
changeset
|
125 |
else if Length(cLocale) > 2 |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6551
diff
changeset
|
126 |
then |
5238
46ddaf14509d
Enable ~/.hedgewars/Data (or platform equivalent) to override/extend pretty much everything in system Data dir. Obviously desyncing can occur, so this is at user's own risk. Should simplify map etc install. Needs testing.
nemo
parents:
5134
diff
changeset
|
127 |
begin |
46ddaf14509d
Enable ~/.hedgewars/Data (or platform equivalent) to override/extend pretty much everything in system Data dir. Obviously desyncing can occur, so this is at user's own risk. Should simplify map etc install. Needs testing.
nemo
parents:
5134
diff
changeset
|
128 |
locName:= name+'_'+Copy(cLocale,1,2); |
46ddaf14509d
Enable ~/.hedgewars/Data (or platform equivalent) to override/extend pretty much everything in system Data dir. Obviously desyncing can occur, so this is at user's own risk. Should simplify map etc install. Needs testing.
nemo
parents:
5134
diff
changeset
|
129 |
path:= UserPathz[ptVoices] + '/' + locName; |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6551
diff
changeset
|
130 |
if DirectoryExists(path) then |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6551
diff
changeset
|
131 |
name:= locName |
5238
46ddaf14509d
Enable ~/.hedgewars/Data (or platform equivalent) to override/extend pretty much everything in system Data dir. Obviously desyncing can occur, so this is at user's own risk. Should simplify map etc install. Needs testing.
nemo
parents:
5134
diff
changeset
|
132 |
else |
46ddaf14509d
Enable ~/.hedgewars/Data (or platform equivalent) to override/extend pretty much everything in system Data dir. Obviously desyncing can occur, so this is at user's own risk. Should simplify map etc install. Needs testing.
nemo
parents:
5134
diff
changeset
|
133 |
begin |
46ddaf14509d
Enable ~/.hedgewars/Data (or platform equivalent) to override/extend pretty much everything in system Data dir. Obviously desyncing can occur, so this is at user's own risk. Should simplify map etc install. Needs testing.
nemo
parents:
5134
diff
changeset
|
134 |
path:= Pathz[ptVoices] + '/' + locName; |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6551
diff
changeset
|
135 |
if DirectoryExists(path) then |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6551
diff
changeset
|
136 |
name:= locName |
5238
46ddaf14509d
Enable ~/.hedgewars/Data (or platform equivalent) to override/extend pretty much everything in system Data dir. Obviously desyncing can occur, so this is at user's own risk. Should simplify map etc install. Needs testing.
nemo
parents:
5134
diff
changeset
|
137 |
end |
46ddaf14509d
Enable ~/.hedgewars/Data (or platform equivalent) to override/extend pretty much everything in system Data dir. Obviously desyncing can occur, so this is at user's own risk. Should simplify map etc install. Needs testing.
nemo
parents:
5134
diff
changeset
|
138 |
end |
5107
d7fc678d78f4
Allow override of voicepack with a locale voicepack. Untested, but should mean that a Default voice should use the Ukranian version if that is their locale.
nemo
parents:
5052
diff
changeset
|
139 |
end |
d7fc678d78f4
Allow override of voicepack with a locale voicepack. Untested, but should mean that a Default voice should use the Ukranian version if that is their locale.
nemo
parents:
5052
diff
changeset
|
140 |
end; |
d7fc678d78f4
Allow override of voicepack with a locale voicepack. Untested, but should mean that a Default voice should use the Ukranian version if that is their locale.
nemo
parents:
5052
diff
changeset
|
141 |
|
d7fc678d78f4
Allow override of voicepack with a locale voicepack. Untested, but should mean that a Default voice should use the Ukranian version if that is their locale.
nemo
parents:
5052
diff
changeset
|
142 |
// If that fails, use the unmodified one |
3529 | 143 |
while (voicepacks[i].name <> name) and (voicepacks[i].name <> '') do |
5107
d7fc678d78f4
Allow override of voicepack with a locale voicepack. Untested, but should mean that a Default voice should use the Ukranian version if that is their locale.
nemo
parents:
5052
diff
changeset
|
144 |
begin |
3529 | 145 |
inc(i); |
146 |
TryDo(i <= cMaxTeams, 'Engine bug: AskForVoicepack i > cMaxTeams', true) |
|
5107
d7fc678d78f4
Allow override of voicepack with a locale voicepack. Untested, but should mean that a Default voice should use the Ukranian version if that is their locale.
nemo
parents:
5052
diff
changeset
|
147 |
end; |
1654 | 148 |
|
3529 | 149 |
voicepacks[i].name:= name; |
150 |
AskForVoicepack:= @voicepacks[i] |
|
1654 | 151 |
end; |
4 | 152 |
|
153 |
procedure InitSound; |
|
2647 | 154 |
var i: TSound; |
3825 | 155 |
channels: LongInt; |
4 | 156 |
begin |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6551
diff
changeset
|
157 |
if not isSoundEnabled then |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6551
diff
changeset
|
158 |
exit; |
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
159 |
WriteToConsole('Init sound...'); |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
160 |
isSoundEnabled:= SDL_InitSubSystem(SDL_INIT_AUDIO) >= 0; |
2671
7e0f88013fe8
smaller patches, one missing Sky-lowres, IMG_Init and Mix_Init (might require newer libraries), updates to SDL bindings, code cleanup, new compile flags
koda
parents:
2647
diff
changeset
|
161 |
|
5635 | 162 |
{$IFDEF MOBILE} |
3825 | 163 |
channels:= 1; |
164 |
{$ELSE} |
|
165 |
channels:= 2; |
|
166 |
{$ENDIF} |
|
167 |
||
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
168 |
if isSoundEnabled then |
3825 | 169 |
isSoundEnabled:= Mix_OpenAudio(44100, $8010, channels, 1024) = 0; |
2327 | 170 |
|
3182 | 171 |
WriteToConsole('Init SDL_mixer... '); |
172 |
SDLTry(Mix_Init(MIX_INIT_OGG) <> 0, true); |
|
173 |
WriteLnToConsole(msgOK); |
|
174 |
||
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
175 |
if isSoundEnabled then |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
176 |
WriteLnToConsole(msgOK) |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
177 |
else |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
178 |
WriteLnToConsole(msgFailed); |
2647 | 179 |
|
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
180 |
Mix_AllocateChannels(Succ(chanTPU)); |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
181 |
if isMusicEnabled then |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
182 |
Mix_VolumeMusic(50); |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
183 |
for i:= Low(TSound) to High(TSound) do |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
184 |
lastChan[i]:= -1; |
2671
7e0f88013fe8
smaller patches, one missing Sky-lowres, IMG_Init and Mix_Init (might require newer libraries), updates to SDL bindings, code cleanup, new compile flags
koda
parents:
2647
diff
changeset
|
185 |
|
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
186 |
Volume:= 0; |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
187 |
ChangeVolume(cInitVolume) |
4 | 188 |
end; |
189 |
||
6362
ceacd1b61833
modify ReleaseSound so that it performs a partial release of unused sounds, useful for responding to memory warnings
koda
parents:
6360
diff
changeset
|
190 |
// when complete is false, this procedure just releases some of the chucks on inactive channels |
ceacd1b61833
modify ReleaseSound so that it performs a partial release of unused sounds, useful for responding to memory warnings
koda
parents:
6360
diff
changeset
|
191 |
// this way music is not stopped, nor are chucks currently being plauyed |
ceacd1b61833
modify ReleaseSound so that it performs a partial release of unused sounds, useful for responding to memory warnings
koda
parents:
6360
diff
changeset
|
192 |
procedure ReleaseSound(complete: boolean); |
2515
51d3f4b6293a
revert audio to use SDL_mixer -- also frontend uses it, so it needs sdlmixer sources
koda
parents:
2501
diff
changeset
|
193 |
var i: TSound; |
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
194 |
t: Longword; |
4 | 195 |
begin |
6362
ceacd1b61833
modify ReleaseSound so that it performs a partial release of unused sounds, useful for responding to memory warnings
koda
parents:
6360
diff
changeset
|
196 |
// release and nil all sounds |
3529 | 197 |
for t:= 0 to cMaxTeams do |
198 |
if voicepacks[t].name <> '' then |
|
199 |
for i:= Low(TSound) to High(TSound) do |
|
200 |
if voicepacks[t].chunks[i] <> nil then |
|
6362
ceacd1b61833
modify ReleaseSound so that it performs a partial release of unused sounds, useful for responding to memory warnings
koda
parents:
6360
diff
changeset
|
201 |
if complete or (Mix_Playing(lastChan[i]) = 0) then |
ceacd1b61833
modify ReleaseSound so that it performs a partial release of unused sounds, useful for responding to memory warnings
koda
parents:
6360
diff
changeset
|
202 |
begin |
ceacd1b61833
modify ReleaseSound so that it performs a partial release of unused sounds, useful for responding to memory warnings
koda
parents:
6360
diff
changeset
|
203 |
Mix_HaltChannel(lastChan[i]); |
ceacd1b61833
modify ReleaseSound so that it performs a partial release of unused sounds, useful for responding to memory warnings
koda
parents:
6360
diff
changeset
|
204 |
lastChan[i]:= -1; |
ceacd1b61833
modify ReleaseSound so that it performs a partial release of unused sounds, useful for responding to memory warnings
koda
parents:
6360
diff
changeset
|
205 |
Mix_FreeChunk(voicepacks[t].chunks[i]); |
ceacd1b61833
modify ReleaseSound so that it performs a partial release of unused sounds, useful for responding to memory warnings
koda
parents:
6360
diff
changeset
|
206 |
voicepacks[t].chunks[i]:= nil; |
ceacd1b61833
modify ReleaseSound so that it performs a partial release of unused sounds, useful for responding to memory warnings
koda
parents:
6360
diff
changeset
|
207 |
end; |
3182 | 208 |
|
6362
ceacd1b61833
modify ReleaseSound so that it performs a partial release of unused sounds, useful for responding to memory warnings
koda
parents:
6360
diff
changeset
|
209 |
// stop music |
ceacd1b61833
modify ReleaseSound so that it performs a partial release of unused sounds, useful for responding to memory warnings
koda
parents:
6360
diff
changeset
|
210 |
if complete then |
ceacd1b61833
modify ReleaseSound so that it performs a partial release of unused sounds, useful for responding to memory warnings
koda
parents:
6360
diff
changeset
|
211 |
begin |
ceacd1b61833
modify ReleaseSound so that it performs a partial release of unused sounds, useful for responding to memory warnings
koda
parents:
6360
diff
changeset
|
212 |
if Mus <> nil then |
ceacd1b61833
modify ReleaseSound so that it performs a partial release of unused sounds, useful for responding to memory warnings
koda
parents:
6360
diff
changeset
|
213 |
begin |
ceacd1b61833
modify ReleaseSound so that it performs a partial release of unused sounds, useful for responding to memory warnings
koda
parents:
6360
diff
changeset
|
214 |
Mix_HaltMusic(); |
ceacd1b61833
modify ReleaseSound so that it performs a partial release of unused sounds, useful for responding to memory warnings
koda
parents:
6360
diff
changeset
|
215 |
Mix_FreeMusic(Mus); |
ceacd1b61833
modify ReleaseSound so that it performs a partial release of unused sounds, useful for responding to memory warnings
koda
parents:
6360
diff
changeset
|
216 |
Mus:= nil; |
ceacd1b61833
modify ReleaseSound so that it performs a partial release of unused sounds, useful for responding to memory warnings
koda
parents:
6360
diff
changeset
|
217 |
end; |
3182 | 218 |
|
6362
ceacd1b61833
modify ReleaseSound so that it performs a partial release of unused sounds, useful for responding to memory warnings
koda
parents:
6360
diff
changeset
|
219 |
// make sure all instances of sdl_mixer are unloaded before continuing |
ceacd1b61833
modify ReleaseSound so that it performs a partial release of unused sounds, useful for responding to memory warnings
koda
parents:
6360
diff
changeset
|
220 |
while Mix_Init(0) <> 0 do |
ceacd1b61833
modify ReleaseSound so that it performs a partial release of unused sounds, useful for responding to memory warnings
koda
parents:
6360
diff
changeset
|
221 |
Mix_Quit(); |
ceacd1b61833
modify ReleaseSound so that it performs a partial release of unused sounds, useful for responding to memory warnings
koda
parents:
6360
diff
changeset
|
222 |
|
ceacd1b61833
modify ReleaseSound so that it performs a partial release of unused sounds, useful for responding to memory warnings
koda
parents:
6360
diff
changeset
|
223 |
Mix_CloseAudio(); |
ceacd1b61833
modify ReleaseSound so that it performs a partial release of unused sounds, useful for responding to memory warnings
koda
parents:
6360
diff
changeset
|
224 |
end; |
4 | 225 |
end; |
226 |
||
227 |
procedure SoundLoad; |
|
228 |
var i: TSound; |
|
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
229 |
t: Longword; |
4 | 230 |
begin |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6551
diff
changeset
|
231 |
if not isSoundEnabled then |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6551
diff
changeset
|
232 |
exit; |
1656
209cf0e2fc36
Finish voicepacks support in engine (not tested though)
unc0rr
parents:
1654
diff
changeset
|
233 |
|
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
234 |
defVoicepack:= AskForVoicepack('Default'); |
3697 | 235 |
|
6362
ceacd1b61833
modify ReleaseSound so that it performs a partial release of unused sounds, useful for responding to memory warnings
koda
parents:
6360
diff
changeset
|
236 |
// initialize all voices to nil so that they can be loaded when needed |
3529 | 237 |
for t:= 0 to cMaxTeams do |
238 |
if voicepacks[t].name <> '' then |
|
239 |
for i:= Low(TSound) to High(TSound) do |
|
3667 | 240 |
voicepacks[t].chunks[i]:= nil; |
3697 | 241 |
|
3667 | 242 |
for i:= Low(TSound) to High(TSound) do |
243 |
begin |
|
244 |
defVoicepack^.chunks[i]:= nil; |
|
6551
a2f39cb9af62
fix a couple of loose ends: sdl_mixer is informed of that OGG is provided by Tremor with its own macro, there is no more a segfault on Tremor cleanup, added new event type and timestamp entry for SDL, removed spurious characters from the japanese translation, uSound errors now are output with SDLTry, uSound doesn't need sound preloading any more
koda
parents:
6521
diff
changeset
|
245 |
(* this is not necessary when SDL_mixer is compiled with USE_OGG_TREMOR |
a2f39cb9af62
fix a couple of loose ends: sdl_mixer is informed of that OGG is provided by Tremor with its own macro, there is no more a segfault on Tremor cleanup, added new event type and timestamp entry for SDL, removed spurious characters from the japanese translation, uSound errors now are output with SDLTry, uSound doesn't need sound preloading any more
koda
parents:
6521
diff
changeset
|
246 |
// preload all the big sound files (>32k) that would otherwise lockup the game |
4461
2f4f5d649bcd
add a simple check to prevent loading sounds when device is muted
koda
parents:
4404
diff
changeset
|
247 |
if (i in [sndBeeWater, sndBee, sndCake, sndHellishImpact1, sndHellish, sndHomerun, |
2f4f5d649bcd
add a simple check to prevent loading sounds when device is muted
koda
parents:
4404
diff
changeset
|
248 |
sndMolotov, sndMortar, sndRideOfTheValkyries, sndYoohoo]) |
3667 | 249 |
and (Soundz[i].Path <> ptVoices) and (Soundz[i].FileName <> '') then |
250 |
begin |
|
5238
46ddaf14509d
Enable ~/.hedgewars/Data (or platform equivalent) to override/extend pretty much everything in system Data dir. Obviously desyncing can occur, so this is at user's own risk. Should simplify map etc install. Needs testing.
nemo
parents:
5134
diff
changeset
|
251 |
s:= UserPathz[Soundz[i].Path] + '/' + Soundz[i].FileName; |
46ddaf14509d
Enable ~/.hedgewars/Data (or platform equivalent) to override/extend pretty much everything in system Data dir. Obviously desyncing can occur, so this is at user's own risk. Should simplify map etc install. Needs testing.
nemo
parents:
5134
diff
changeset
|
252 |
if not FileExists(s) then s:= Pathz[Soundz[i].Path] + '/' + Soundz[i].FileName; |
3667 | 253 |
WriteToConsole(msgLoading + s + ' '); |
254 |
defVoicepack^.chunks[i]:= Mix_LoadWAV_RW(SDL_RWFromFile(Str2PChar(s), 'rb'), 1); |
|
6551
a2f39cb9af62
fix a couple of loose ends: sdl_mixer is informed of that OGG is provided by Tremor with its own macro, there is no more a segfault on Tremor cleanup, added new event type and timestamp entry for SDL, removed spurious characters from the japanese translation, uSound errors now are output with SDLTry, uSound doesn't need sound preloading any more
koda
parents:
6521
diff
changeset
|
255 |
SDLTry(defVoicepack^.chunks[i] <> nil, true); |
3667 | 256 |
WriteLnToConsole(msgOK); |
6551
a2f39cb9af62
fix a couple of loose ends: sdl_mixer is informed of that OGG is provided by Tremor with its own macro, there is no more a segfault on Tremor cleanup, added new event type and timestamp entry for SDL, removed spurious characters from the japanese translation, uSound errors now are output with SDLTry, uSound doesn't need sound preloading any more
koda
parents:
6521
diff
changeset
|
257 |
end;*) |
3667 | 258 |
end; |
3664 | 259 |
|
4 | 260 |
end; |
261 |
||
2745 | 262 |
procedure PlaySound(snd: TSound); |
263 |
begin |
|
3201 | 264 |
PlaySound(snd, nil, false); |
2745 | 265 |
end; |
266 |
||
3202 | 267 |
procedure PlaySound(snd: TSound; keepPlaying: boolean); |
268 |
begin |
|
269 |
PlaySound(snd, nil, keepPlaying); |
|
270 |
end; |
|
271 |
||
2745 | 272 |
procedure PlaySound(snd: TSound; voicepack: PVoicepack); |
4 | 273 |
begin |
3201 | 274 |
PlaySound(snd, voicepack, false); |
275 |
end; |
|
276 |
||
277 |
procedure PlaySound(snd: TSound; voicepack: PVoicepack; keepPlaying: boolean); |
|
3664 | 278 |
var s:shortstring; |
3201 | 279 |
begin |
4948 | 280 |
if (not isSoundEnabled) or fastUntilLag then |
3529 | 281 |
exit; |
3201 | 282 |
|
3529 | 283 |
if keepPlaying and (lastChan[snd] <> -1) and (Mix_Playing(lastChan[snd]) <> 0) then |
284 |
exit; |
|
285 |
||
3664 | 286 |
if (voicepack <> nil) then |
5638
e35ba2a400d8
Try to avoid overlapping voices for major statements (not things like byebye or oof)
nemo
parents:
5239
diff
changeset
|
287 |
begin |
3664 | 288 |
if (voicepack^.chunks[snd] = nil) and (Soundz[snd].Path = ptVoices) and (Soundz[snd].FileName <> '') then |
5638
e35ba2a400d8
Try to avoid overlapping voices for major statements (not things like byebye or oof)
nemo
parents:
5239
diff
changeset
|
289 |
begin |
5238
46ddaf14509d
Enable ~/.hedgewars/Data (or platform equivalent) to override/extend pretty much everything in system Data dir. Obviously desyncing can occur, so this is at user's own risk. Should simplify map etc install. Needs testing.
nemo
parents:
5134
diff
changeset
|
290 |
s:= UserPathz[Soundz[snd].Path] + '/' + voicepack^.name + '/' + Soundz[snd].FileName; |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6551
diff
changeset
|
291 |
if not FileExists(s) then |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6551
diff
changeset
|
292 |
s:= Pathz[Soundz[snd].Path] + '/' + voicepack^.name + '/' + Soundz[snd].FileName; |
3664 | 293 |
WriteToConsole(msgLoading + s + ' '); |
294 |
voicepack^.chunks[snd]:= Mix_LoadWAV_RW(SDL_RWFromFile(Str2PChar(s), 'rb'), 1); |
|
295 |
if voicepack^.chunks[snd] = nil then |
|
296 |
WriteLnToConsole(msgFailed) |
|
297 |
else |
|
298 |
WriteLnToConsole(msgOK) |
|
5638
e35ba2a400d8
Try to avoid overlapping voices for major statements (not things like byebye or oof)
nemo
parents:
5239
diff
changeset
|
299 |
end; |
3529 | 300 |
lastChan[snd]:= Mix_PlayChannelTimed(-1, voicepack^.chunks[snd], 0, -1) |
5638
e35ba2a400d8
Try to avoid overlapping voices for major statements (not things like byebye or oof)
nemo
parents:
5239
diff
changeset
|
301 |
end |
3529 | 302 |
else |
5638
e35ba2a400d8
Try to avoid overlapping voices for major statements (not things like byebye or oof)
nemo
parents:
5239
diff
changeset
|
303 |
begin |
3664 | 304 |
if (defVoicepack^.chunks[snd] = nil) and (Soundz[snd].Path <> ptVoices) and (Soundz[snd].FileName <> '') then |
5638
e35ba2a400d8
Try to avoid overlapping voices for major statements (not things like byebye or oof)
nemo
parents:
5239
diff
changeset
|
305 |
begin |
5238
46ddaf14509d
Enable ~/.hedgewars/Data (or platform equivalent) to override/extend pretty much everything in system Data dir. Obviously desyncing can occur, so this is at user's own risk. Should simplify map etc install. Needs testing.
nemo
parents:
5134
diff
changeset
|
306 |
s:= UserPathz[Soundz[snd].Path] + '/' + Soundz[snd].FileName; |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6551
diff
changeset
|
307 |
if not FileExists(s) then |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6551
diff
changeset
|
308 |
s:= Pathz[Soundz[snd].Path] + '/' + Soundz[snd].FileName; |
3664 | 309 |
WriteToConsole(msgLoading + s + ' '); |
310 |
defVoicepack^.chunks[snd]:= Mix_LoadWAV_RW(SDL_RWFromFile(Str2PChar(s), 'rb'), 1); |
|
6551
a2f39cb9af62
fix a couple of loose ends: sdl_mixer is informed of that OGG is provided by Tremor with its own macro, there is no more a segfault on Tremor cleanup, added new event type and timestamp entry for SDL, removed spurious characters from the japanese translation, uSound errors now are output with SDLTry, uSound doesn't need sound preloading any more
koda
parents:
6521
diff
changeset
|
311 |
SDLTry(defVoicepack^.chunks[snd] <> nil, true); |
3664 | 312 |
WriteLnToConsole(msgOK); |
5638
e35ba2a400d8
Try to avoid overlapping voices for major statements (not things like byebye or oof)
nemo
parents:
5239
diff
changeset
|
313 |
end; |
3529 | 314 |
lastChan[snd]:= Mix_PlayChannelTimed(-1, defVoicepack^.chunks[snd], 0, -1) |
5638
e35ba2a400d8
Try to avoid overlapping voices for major statements (not things like byebye or oof)
nemo
parents:
5239
diff
changeset
|
315 |
end; |
e35ba2a400d8
Try to avoid overlapping voices for major statements (not things like byebye or oof)
nemo
parents:
5239
diff
changeset
|
316 |
end; |
e35ba2a400d8
Try to avoid overlapping voices for major statements (not things like byebye or oof)
nemo
parents:
5239
diff
changeset
|
317 |
|
e35ba2a400d8
Try to avoid overlapping voices for major statements (not things like byebye or oof)
nemo
parents:
5239
diff
changeset
|
318 |
procedure AddVoice(snd: TSound; voicepack: PVoicepack); |
e35ba2a400d8
Try to avoid overlapping voices for major statements (not things like byebye or oof)
nemo
parents:
5239
diff
changeset
|
319 |
var i : LongInt; |
e35ba2a400d8
Try to avoid overlapping voices for major statements (not things like byebye or oof)
nemo
parents:
5239
diff
changeset
|
320 |
begin |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6551
diff
changeset
|
321 |
if (not isSoundEnabled) or fastUntilLag or ((LastVoice.snd = snd) and (LastVoice.voicepack = voicepack)) then |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6551
diff
changeset
|
322 |
exit; |
6360
eca20f8990e2
Clear all other sounds before playing flawless victory / victory
nemo
parents:
6072
diff
changeset
|
323 |
if (snd = sndVictory) or (snd = sndFlawless) then |
eca20f8990e2
Clear all other sounds before playing flawless victory / victory
nemo
parents:
6072
diff
changeset
|
324 |
begin |
6367
a7fbf18b2d55
be more gentle when you stop channels at the end of the game
koda
parents:
6363
diff
changeset
|
325 |
Mix_FadeOutChannel(-1, 800); |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6551
diff
changeset
|
326 |
for i:= 0 to 7 do |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6551
diff
changeset
|
327 |
VoiceList[i].snd:= sndNone; |
6360
eca20f8990e2
Clear all other sounds before playing flawless victory / victory
nemo
parents:
6072
diff
changeset
|
328 |
LastVoice.snd:= sndNone; |
eca20f8990e2
Clear all other sounds before playing flawless victory / victory
nemo
parents:
6072
diff
changeset
|
329 |
end; |
eca20f8990e2
Clear all other sounds before playing flawless victory / victory
nemo
parents:
6072
diff
changeset
|
330 |
|
5638
e35ba2a400d8
Try to avoid overlapping voices for major statements (not things like byebye or oof)
nemo
parents:
5239
diff
changeset
|
331 |
i:= 0; |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6551
diff
changeset
|
332 |
while (i<8) and (VoiceList[i].snd <> sndNone) do |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6551
diff
changeset
|
333 |
inc(i); |
5638
e35ba2a400d8
Try to avoid overlapping voices for major statements (not things like byebye or oof)
nemo
parents:
5239
diff
changeset
|
334 |
|
5921 | 335 |
// skip playing same sound for same hog twice |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6551
diff
changeset
|
336 |
if (i>0) and (VoiceList[i-1].snd = snd) and (VoiceList[i-1].voicepack = voicepack) then |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6551
diff
changeset
|
337 |
exit; |
5638
e35ba2a400d8
Try to avoid overlapping voices for major statements (not things like byebye or oof)
nemo
parents:
5239
diff
changeset
|
338 |
VoiceList[i].snd:= snd; |
e35ba2a400d8
Try to avoid overlapping voices for major statements (not things like byebye or oof)
nemo
parents:
5239
diff
changeset
|
339 |
VoiceList[i].voicepack:= voicepack; |
e35ba2a400d8
Try to avoid overlapping voices for major statements (not things like byebye or oof)
nemo
parents:
5239
diff
changeset
|
340 |
end; |
e35ba2a400d8
Try to avoid overlapping voices for major statements (not things like byebye or oof)
nemo
parents:
5239
diff
changeset
|
341 |
|
e35ba2a400d8
Try to avoid overlapping voices for major statements (not things like byebye or oof)
nemo
parents:
5239
diff
changeset
|
342 |
procedure PlayNextVoice; |
e35ba2a400d8
Try to avoid overlapping voices for major statements (not things like byebye or oof)
nemo
parents:
5239
diff
changeset
|
343 |
var i : LongInt; |
e35ba2a400d8
Try to avoid overlapping voices for major statements (not things like byebye or oof)
nemo
parents:
5239
diff
changeset
|
344 |
begin |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6551
diff
changeset
|
345 |
if (not isSoundEnabled) or fastUntilLag or ((LastVoice.snd <> sndNone) and (lastChan[LastVoice.snd] <> -1) and (Mix_Playing(lastChan[LastVoice.snd]) <> 0)) then |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6551
diff
changeset
|
346 |
exit; |
5638
e35ba2a400d8
Try to avoid overlapping voices for major statements (not things like byebye or oof)
nemo
parents:
5239
diff
changeset
|
347 |
i:= 0; |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6551
diff
changeset
|
348 |
while (i<8) and (VoiceList[i].snd = sndNone) do |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6551
diff
changeset
|
349 |
inc(i); |
5638
e35ba2a400d8
Try to avoid overlapping voices for major statements (not things like byebye or oof)
nemo
parents:
5239
diff
changeset
|
350 |
|
e35ba2a400d8
Try to avoid overlapping voices for major statements (not things like byebye or oof)
nemo
parents:
5239
diff
changeset
|
351 |
if (VoiceList[i].snd <> sndNone) then |
e35ba2a400d8
Try to avoid overlapping voices for major statements (not things like byebye or oof)
nemo
parents:
5239
diff
changeset
|
352 |
begin |
e35ba2a400d8
Try to avoid overlapping voices for major statements (not things like byebye or oof)
nemo
parents:
5239
diff
changeset
|
353 |
LastVoice.snd:= VoiceList[i].snd; |
e35ba2a400d8
Try to avoid overlapping voices for major statements (not things like byebye or oof)
nemo
parents:
5239
diff
changeset
|
354 |
LastVoice.voicepack:= VoiceList[i].voicepack; |
e35ba2a400d8
Try to avoid overlapping voices for major statements (not things like byebye or oof)
nemo
parents:
5239
diff
changeset
|
355 |
VoiceList[i].snd:= sndNone; |
e35ba2a400d8
Try to avoid overlapping voices for major statements (not things like byebye or oof)
nemo
parents:
5239
diff
changeset
|
356 |
PlaySound(LastVoice.snd, LastVoice.voicepack) |
e35ba2a400d8
Try to avoid overlapping voices for major statements (not things like byebye or oof)
nemo
parents:
5239
diff
changeset
|
357 |
end |
e35ba2a400d8
Try to avoid overlapping voices for major statements (not things like byebye or oof)
nemo
parents:
5239
diff
changeset
|
358 |
else LastVoice.snd:= sndNone; |
4 | 359 |
end; |
360 |
||
2745 | 361 |
function LoopSound(snd: TSound): LongInt; |
362 |
begin |
|
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
363 |
LoopSound:= LoopSound(snd, nil) |
2745 | 364 |
end; |
365 |
||
4956
48e1f9a04c28
usound: added function for loops with fade in and out
koda
parents:
4948
diff
changeset
|
366 |
function LoopSound(snd: TSound; fadems: LongInt): LongInt; |
48e1f9a04c28
usound: added function for loops with fade in and out
koda
parents:
4948
diff
changeset
|
367 |
begin |
48e1f9a04c28
usound: added function for loops with fade in and out
koda
parents:
4948
diff
changeset
|
368 |
LoopSound:= LoopSound(snd, nil, fadems) |
48e1f9a04c28
usound: added function for loops with fade in and out
koda
parents:
4948
diff
changeset
|
369 |
end; |
48e1f9a04c28
usound: added function for loops with fade in and out
koda
parents:
4948
diff
changeset
|
370 |
|
2745 | 371 |
function LoopSound(snd: TSound; voicepack: PVoicepack): LongInt; |
4956
48e1f9a04c28
usound: added function for loops with fade in and out
koda
parents:
4948
diff
changeset
|
372 |
begin |
5052 | 373 |
voicepack:= voicepack; // avoid compiler hint |
4956
48e1f9a04c28
usound: added function for loops with fade in and out
koda
parents:
4948
diff
changeset
|
374 |
LoopSound:= LoopSound(snd, nil, 0) |
48e1f9a04c28
usound: added function for loops with fade in and out
koda
parents:
4948
diff
changeset
|
375 |
end; |
48e1f9a04c28
usound: added function for loops with fade in and out
koda
parents:
4948
diff
changeset
|
376 |
|
48e1f9a04c28
usound: added function for loops with fade in and out
koda
parents:
4948
diff
changeset
|
377 |
function LoopSound(snd: TSound; voicepack: PVoicepack; fadems: LongInt): LongInt; |
3664 | 378 |
var s: shortstring; |
2647 | 379 |
begin |
4948 | 380 |
if (not isSoundEnabled) or fastUntilLag then |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6551
diff
changeset
|
381 |
begin |
3529 | 382 |
LoopSound:= -1; |
383 |
exit |
|
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6551
diff
changeset
|
384 |
end; |
2647 | 385 |
|
3664 | 386 |
if (voicepack <> nil) then |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6551
diff
changeset
|
387 |
begin |
3664 | 388 |
if (voicepack^.chunks[snd] = nil) and (Soundz[snd].Path = ptVoices) and (Soundz[snd].FileName <> '') then |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6551
diff
changeset
|
389 |
begin |
5238
46ddaf14509d
Enable ~/.hedgewars/Data (or platform equivalent) to override/extend pretty much everything in system Data dir. Obviously desyncing can occur, so this is at user's own risk. Should simplify map etc install. Needs testing.
nemo
parents:
5134
diff
changeset
|
390 |
s:= UserPathz[Soundz[snd].Path] + '/' + voicepack^.name + '/' + Soundz[snd].FileName; |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6551
diff
changeset
|
391 |
if not FileExists(s) then |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6551
diff
changeset
|
392 |
s:= Pathz[Soundz[snd].Path] + '/' + voicepack^.name + '/' + Soundz[snd].FileName; |
3664 | 393 |
WriteToConsole(msgLoading + s + ' '); |
394 |
voicepack^.chunks[snd]:= Mix_LoadWAV_RW(SDL_RWFromFile(Str2PChar(s), 'rb'), 1); |
|
395 |
if voicepack^.chunks[snd] = nil then |
|
396 |
WriteLnToConsole(msgFailed) |
|
397 |
else |
|
398 |
WriteLnToConsole(msgOK) |
|
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6551
diff
changeset
|
399 |
end; |
3529 | 400 |
LoopSound:= Mix_PlayChannelTimed(-1, voicepack^.chunks[snd], -1, -1) |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6551
diff
changeset
|
401 |
end |
3529 | 402 |
else |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6551
diff
changeset
|
403 |
begin |
3664 | 404 |
if (defVoicepack^.chunks[snd] = nil) and (Soundz[snd].Path <> ptVoices) and (Soundz[snd].FileName <> '') then |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6551
diff
changeset
|
405 |
begin |
5238
46ddaf14509d
Enable ~/.hedgewars/Data (or platform equivalent) to override/extend pretty much everything in system Data dir. Obviously desyncing can occur, so this is at user's own risk. Should simplify map etc install. Needs testing.
nemo
parents:
5134
diff
changeset
|
406 |
s:= UserPathz[Soundz[snd].Path] + '/' + Soundz[snd].FileName; |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6551
diff
changeset
|
407 |
if not FileExists(s) then |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6551
diff
changeset
|
408 |
s:= Pathz[Soundz[snd].Path] + '/' + Soundz[snd].FileName; |
3664 | 409 |
WriteToConsole(msgLoading + s + ' '); |
410 |
defVoicepack^.chunks[snd]:= Mix_LoadWAV_RW(SDL_RWFromFile(Str2PChar(s), 'rb'), 1); |
|
6551
a2f39cb9af62
fix a couple of loose ends: sdl_mixer is informed of that OGG is provided by Tremor with its own macro, there is no more a segfault on Tremor cleanup, added new event type and timestamp entry for SDL, removed spurious characters from the japanese translation, uSound errors now are output with SDLTry, uSound doesn't need sound preloading any more
koda
parents:
6521
diff
changeset
|
411 |
SDLTry(defVoicepack^.chunks[snd] <> nil, true); |
3664 | 412 |
WriteLnToConsole(msgOK); |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6551
diff
changeset
|
413 |
end; |
4956
48e1f9a04c28
usound: added function for loops with fade in and out
koda
parents:
4948
diff
changeset
|
414 |
if fadems > 0 then |
48e1f9a04c28
usound: added function for loops with fade in and out
koda
parents:
4948
diff
changeset
|
415 |
LoopSound:= Mix_FadeInChannelTimed(-1, defVoicepack^.chunks[snd], -1, fadems, -1) |
48e1f9a04c28
usound: added function for loops with fade in and out
koda
parents:
4948
diff
changeset
|
416 |
else |
48e1f9a04c28
usound: added function for loops with fade in and out
koda
parents:
4948
diff
changeset
|
417 |
LoopSound:= Mix_PlayChannelTimed(-1, defVoicepack^.chunks[snd], -1, -1); |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6551
diff
changeset
|
418 |
end; |
2647 | 419 |
end; |
420 |
||
282 | 421 |
procedure StopSound(snd: TSound); |
4 | 422 |
begin |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6551
diff
changeset
|
423 |
if not isSoundEnabled then |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6551
diff
changeset
|
424 |
exit; |
4956
48e1f9a04c28
usound: added function for loops with fade in and out
koda
parents:
4948
diff
changeset
|
425 |
|
3529 | 426 |
if (lastChan[snd] <> -1) and (Mix_Playing(lastChan[snd]) <> 0) then |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6551
diff
changeset
|
427 |
begin |
3529 | 428 |
Mix_HaltChannel(lastChan[snd]); |
429 |
lastChan[snd]:= -1; |
|
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6551
diff
changeset
|
430 |
end; |
4 | 431 |
end; |
432 |
||
2745 | 433 |
procedure StopSound(chn: LongInt); |
434 |
begin |
|
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6551
diff
changeset
|
435 |
if not isSoundEnabled then |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6551
diff
changeset
|
436 |
exit; |
3529 | 437 |
|
438 |
if (chn <> -1) and (Mix_Playing(chn) <> 0) then |
|
439 |
Mix_HaltChannel(chn); |
|
2745 | 440 |
end; |
441 |
||
4956
48e1f9a04c28
usound: added function for loops with fade in and out
koda
parents:
4948
diff
changeset
|
442 |
procedure StopSound(chn, fadems: LongInt); |
48e1f9a04c28
usound: added function for loops with fade in and out
koda
parents:
4948
diff
changeset
|
443 |
begin |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6551
diff
changeset
|
444 |
if not isSoundEnabled then |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6551
diff
changeset
|
445 |
exit; |
4956
48e1f9a04c28
usound: added function for loops with fade in and out
koda
parents:
4948
diff
changeset
|
446 |
|
48e1f9a04c28
usound: added function for loops with fade in and out
koda
parents:
4948
diff
changeset
|
447 |
if (chn <> -1) and (Mix_Playing(chn) <> 0) then |
48e1f9a04c28
usound: added function for loops with fade in and out
koda
parents:
4948
diff
changeset
|
448 |
Mix_FadeOutChannel(chn, fadems); |
48e1f9a04c28
usound: added function for loops with fade in and out
koda
parents:
4948
diff
changeset
|
449 |
end; |
48e1f9a04c28
usound: added function for loops with fade in and out
koda
parents:
4948
diff
changeset
|
450 |
|
4 | 451 |
procedure PlayMusic; |
2905 | 452 |
var s: shortstring; |
4 | 453 |
begin |
3529 | 454 |
if (not isSoundEnabled) or (MusicFN = '') or (not isMusicEnabled) then |
455 |
exit; |
|
456 |
||
5239 | 457 |
s:= UserPathPrefix + '/Data/Music/' + MusicFN; |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6551
diff
changeset
|
458 |
if not FileExists(s) then |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6551
diff
changeset
|
459 |
s:= PathPrefix + '/Music/' + MusicFN; |
3529 | 460 |
WriteToConsole(msgLoading + s + ' '); |
565 | 461 |
|
3529 | 462 |
Mus:= Mix_LoadMUS(Str2PChar(s)); |
6551
a2f39cb9af62
fix a couple of loose ends: sdl_mixer is informed of that OGG is provided by Tremor with its own macro, there is no more a segfault on Tremor cleanup, added new event type and timestamp entry for SDL, removed spurious characters from the japanese translation, uSound errors now are output with SDLTry, uSound doesn't need sound preloading any more
koda
parents:
6521
diff
changeset
|
463 |
SDLTry(Mus <> nil, false); |
3529 | 464 |
WriteLnToConsole(msgOK); |
565 | 465 |
|
3529 | 466 |
SDLTry(Mix_FadeInMusic(Mus, -1, 3000) <> -1, false) |
4 | 467 |
end; |
468 |
||
371 | 469 |
function ChangeVolume(voldelta: LongInt): LongInt; |
174 | 470 |
begin |
3529 | 471 |
if not isSoundEnabled then |
472 |
exit(0); |
|
2327 | 473 |
|
3529 | 474 |
inc(Volume, voldelta); |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6551
diff
changeset
|
475 |
if Volume < 0 then |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6551
diff
changeset
|
476 |
Volume:= 0; |
3529 | 477 |
Mix_Volume(-1, Volume); |
478 |
Volume:= Mix_Volume(-1, -1); |
|
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6551
diff
changeset
|
479 |
if isMusicEnabled then |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6551
diff
changeset
|
480 |
Mix_VolumeMusic(Volume * 4 div 8); |
3529 | 481 |
ChangeVolume:= Volume * 100 div MIX_MAX_VOLUME |
174 | 482 |
end; |
483 |
||
6862 | 484 |
procedure DampenAudio; |
485 |
begin |
|
486 |
previousVolume:= Volume; |
|
487 |
ChangeVolume(-Volume * 7 div 9); |
|
488 |
end; |
|
489 |
||
490 |
procedure UndampenAudio; |
|
491 |
begin |
|
492 |
ChangeVolume(previousVolume - Volume); |
|
493 |
end; |
|
494 |
||
1712 | 495 |
procedure PauseMusic; |
496 |
begin |
|
3529 | 497 |
if (MusicFN = '') or (not isMusicEnabled) then |
498 |
exit; |
|
2515
51d3f4b6293a
revert audio to use SDL_mixer -- also frontend uses it, so it needs sdlmixer sources
koda
parents:
2501
diff
changeset
|
499 |
|
6472 | 500 |
if Mus <> nil then |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6551
diff
changeset
|
501 |
Mix_PauseMusic(Mus); |
1712 | 502 |
end; |
503 |
||
504 |
procedure ResumeMusic; |
|
505 |
begin |
|
3529 | 506 |
if (MusicFN = '') or (not isMusicEnabled) then |
507 |
exit; |
|
2515
51d3f4b6293a
revert audio to use SDL_mixer -- also frontend uses it, so it needs sdlmixer sources
koda
parents:
2501
diff
changeset
|
508 |
|
6472 | 509 |
if Mus <> nil then |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6551
diff
changeset
|
510 |
Mix_ResumeMusic(Mus); |
1712 | 511 |
end; |
512 |
||
4748 | 513 |
procedure ChangeMusic; |
514 |
begin |
|
515 |
if (MusicFN = '') or (not isMusicEnabled) then |
|
516 |
exit; |
|
517 |
||
6472 | 518 |
StopMusic; |
519 |
PlayMusic; |
|
520 |
end; |
|
521 |
||
522 |
procedure StopMusic; |
|
523 |
begin |
|
524 |
if (MusicFN = '') or (not isMusicEnabled) then |
|
525 |
exit; |
|
526 |
||
4748 | 527 |
if Mus <> nil then |
6521 | 528 |
begin |
4748 | 529 |
Mix_FreeMusic(Mus); |
6521 | 530 |
Mus:= nil; |
531 |
end |
|
4748 | 532 |
end; |
533 |
||
4398
36d7e4b6ca81
Move some command handlers out of uCommands into more appropriate places, thus removing some dependencies. Ideally uCommands shouldn't depend on anything (except for uTypes and uConsts probably)
unc0rr
parents:
4377
diff
changeset
|
534 |
procedure chVoicepack(var s: shortstring); |
36d7e4b6ca81
Move some command handlers out of uCommands into more appropriate places, thus removing some dependencies. Ideally uCommands shouldn't depend on anything (except for uTypes and uConsts probably)
unc0rr
parents:
4377
diff
changeset
|
535 |
begin |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6551
diff
changeset
|
536 |
if CurrentTeam = nil then |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6551
diff
changeset
|
537 |
OutError(errmsgIncorrectUse + ' "/voicepack"', true); |
4398
36d7e4b6ca81
Move some command handlers out of uCommands into more appropriate places, thus removing some dependencies. Ideally uCommands shouldn't depend on anything (except for uTypes and uConsts probably)
unc0rr
parents:
4377
diff
changeset
|
538 |
if s[1]='"' then Delete(s, 1, 1); |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6551
diff
changeset
|
539 |
if s[byte(s[0])]='"' then |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6551
diff
changeset
|
540 |
Delete(s, byte(s[0]), 1); |
4398
36d7e4b6ca81
Move some command handlers out of uCommands into more appropriate places, thus removing some dependencies. Ideally uCommands shouldn't depend on anything (except for uTypes and uConsts probably)
unc0rr
parents:
4377
diff
changeset
|
541 |
CurrentTeam^.voicepack:= AskForVoicepack(s) |
36d7e4b6ca81
Move some command handlers out of uCommands into more appropriate places, thus removing some dependencies. Ideally uCommands shouldn't depend on anything (except for uTypes and uConsts probably)
unc0rr
parents:
4377
diff
changeset
|
542 |
end; |
36d7e4b6ca81
Move some command handlers out of uCommands into more appropriate places, thus removing some dependencies. Ideally uCommands shouldn't depend on anything (except for uTypes and uConsts probably)
unc0rr
parents:
4377
diff
changeset
|
543 |
|
3038 | 544 |
procedure initModule; |
2716
b9ca1bfca24f
complete the replacement of init/free wrappers for every unit
koda
parents:
2674
diff
changeset
|
545 |
begin |
6898 | 546 |
RegisterVariable('voicepack', @chVoicepack, false); |
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
547 |
MusicFN:=''; |
2716
b9ca1bfca24f
complete the replacement of init/free wrappers for every unit
koda
parents:
2674
diff
changeset
|
548 |
end; |
b9ca1bfca24f
complete the replacement of init/free wrappers for every unit
koda
parents:
2674
diff
changeset
|
549 |
|
3038 | 550 |
procedure freeModule; |
2716
b9ca1bfca24f
complete the replacement of init/free wrappers for every unit
koda
parents:
2674
diff
changeset
|
551 |
begin |
3615 | 552 |
if isSoundEnabled then |
6362
ceacd1b61833
modify ReleaseSound so that it performs a partial release of unused sounds, useful for responding to memory warnings
koda
parents:
6360
diff
changeset
|
553 |
ReleaseSound(true); |
2716
b9ca1bfca24f
complete the replacement of init/free wrappers for every unit
koda
parents:
2674
diff
changeset
|
554 |
end; |
b9ca1bfca24f
complete the replacement of init/free wrappers for every unit
koda
parents:
2674
diff
changeset
|
555 |
|
2515
51d3f4b6293a
revert audio to use SDL_mixer -- also frontend uses it, so it needs sdlmixer sources
koda
parents:
2501
diff
changeset
|
556 |
end. |
2192
4763a778c033
- Fix quickplay sound bug triggered by two faults: ttsmj's (passing voicepack with empty name in team config) and koda's (he changed fallback to default scheme condition)
unc0rr
parents:
2191
diff
changeset
|
557 |