# HG changeset patch # User koda # Date 1321209162 -3600 # Node ID ceacd1b61833d2715765b953ecfc25311363d704 # Parent bc157c3dac43f0a9724ec09177b94641e62eb5ed modify ReleaseSound so that it performs a partial release of unused sounds, useful for responding to memory warnings diff -r bc157c3dac43 -r ceacd1b61833 hedgewars/PascalExports.pas --- a/hedgewars/PascalExports.pas Sun Nov 13 13:27:04 2011 -0500 +++ b/hedgewars/PascalExports.pas Sun Nov 13 19:32:42 2011 +0100 @@ -355,6 +355,12 @@ begin exit(cMaxTeams); end; + +procedure HW_memoryWarningCallback; cdecl; export; +begin + ReleaseSound(false); +end; + {$ENDIF} end. diff -r bc157c3dac43 -r ceacd1b61833 hedgewars/SDLh.pas --- a/hedgewars/SDLh.pas Sun Nov 13 13:27:04 2011 -0500 +++ b/hedgewars/SDLh.pas Sun Nov 13 19:32:42 2011 +0100 @@ -956,6 +956,7 @@ function Mix_PauseMusic(music: PMixMusic): LongInt; cdecl; external SDL_MixerLibName; function Mix_ResumeMusic(music: PMixMusic): LongInt; cdecl; external SDL_MixerLibName; function Mix_HaltChannel(channel: LongInt): LongInt; cdecl; external SDL_MixerLibName; +function Mix_HaltMusic: LongInt; cdecl; external SDL_MixerLibName; function Mix_FadeInChannelTimed(channel: LongInt; chunk: PMixChunk; loops: LongInt; fadems: LongInt; ticks: LongInt): LongInt; cdecl; external SDL_MixerLibName; function Mix_FadeOutChannel(channel: LongInt; fadems: LongInt): LongInt; cdecl; external SDL_MixerLibName; diff -r bc157c3dac43 -r ceacd1b61833 hedgewars/uSound.pas --- a/hedgewars/uSound.pas Sun Nov 13 13:27:04 2011 -0500 +++ b/hedgewars/uSound.pas Sun Nov 13 19:32:42 2011 +0100 @@ -41,7 +41,7 @@ procedure freeModule; procedure InitSound; // Initiates sound-system if isSoundEnabled. -procedure ReleaseSound; // Releases sound-system and used resources. +procedure ReleaseSound(complete: boolean); // Releases sound-system and used resources. procedure SoundLoad; // Preloads some sounds for performance reasons. @@ -176,24 +176,41 @@ ChangeVolume(cInitVolume) end; -procedure ReleaseSound; +// when complete is false, this procedure just releases some of the chucks on inactive channels +// this way music is not stopped, nor are chucks currently being plauyed +procedure ReleaseSound(complete: boolean); var i: TSound; t: Longword; begin + // release and nil all sounds for t:= 0 to cMaxTeams do if voicepacks[t].name <> '' then for i:= Low(TSound) to High(TSound) do if voicepacks[t].chunks[i] <> nil then - Mix_FreeChunk(voicepacks[t].chunks[i]); - - if Mus <> nil then - Mix_FreeMusic(Mus); + if complete or (Mix_Playing(lastChan[i]) = 0) then + begin + Mix_HaltChannel(lastChan[i]); + lastChan[i]:= -1; + Mix_FreeChunk(voicepacks[t].chunks[i]); + voicepacks[t].chunks[i]:= nil; + end; - // make sure all instances of sdl_mixer are unloaded before continuing - while Mix_Init(0) <> 0 do - Mix_Quit(); + // stop music + if complete then + begin + if Mus <> nil then + begin + Mix_HaltMusic(); + Mix_FreeMusic(Mus); + Mus:= nil; + end; - Mix_CloseAudio(); + // make sure all instances of sdl_mixer are unloaded before continuing + while Mix_Init(0) <> 0 do + Mix_Quit(); + + Mix_CloseAudio(); + end; end; procedure SoundLoad; @@ -205,15 +222,16 @@ defVoicepack:= AskForVoicepack('Default'); + // initialize all voices to nil so that they can be loaded when needed for t:= 0 to cMaxTeams do if voicepacks[t].name <> '' then for i:= Low(TSound) to High(TSound) do voicepacks[t].chunks[i]:= nil; + // preload all the big sound files (>32k) that would otherwise lockup the game for i:= Low(TSound) to High(TSound) do begin defVoicepack^.chunks[i]:= nil; - // preload all the big sound files (>32k) that would otherwise lockup the game if (i in [sndBeeWater, sndBee, sndCake, sndHellishImpact1, sndHellish, sndHomerun, sndMolotov, sndMortar, sndRideOfTheValkyries, sndYoohoo]) and (Soundz[i].Path <> ptVoices) and (Soundz[i].FileName <> '') then @@ -480,7 +498,7 @@ procedure freeModule; begin if isSoundEnabled then - ReleaseSound(); + ReleaseSound(true); end; end. diff -r bc157c3dac43 -r ceacd1b61833 project_files/HedgewarsMobile/Classes/HedgewarsAppDelegate.m --- a/project_files/HedgewarsMobile/Classes/HedgewarsAppDelegate.m Sun Nov 13 13:27:04 2011 -0500 +++ b/project_files/HedgewarsMobile/Classes/HedgewarsAppDelegate.m Sun Nov 13 19:32:42 2011 +0100 @@ -88,6 +88,7 @@ // don't stop music if it is playing if ([HWUtils isGameLaunched]) { [AudioManagerController releaseCache]; + HW_memoryWarningCallback(); } MSG_MEMCLEAN(); // don't clean mainMenuViewController here!!! diff -r bc157c3dac43 -r ceacd1b61833 project_files/HedgewarsMobile/Classes/PascalImports.h --- a/project_files/HedgewarsMobile/Classes/PascalImports.h Sun Nov 13 13:27:04 2011 -0500 +++ b/project_files/HedgewarsMobile/Classes/PascalImports.h Sun Nov 13 19:32:42 2011 +0100 @@ -98,6 +98,8 @@ int HW_getTurnsForCurrentTeam(void); int HW_getMaxNumberOfHogs(void); int HW_getMaxNumberOfTeams(void); + + void HW_memoryWarningCallback(void); #ifdef __cplusplus }