diff --git a/GameSettings.cpp b/GameSettings.cpp index 5bf85996..0b28796a 100644 --- a/GameSettings.cpp +++ b/GameSettings.cpp @@ -1190,6 +1190,7 @@ void LoadGameExternalOptions() gGameExternalOptions.fDebugSSA = iniReader.ReadBoolean("Sound Settings", "DEBUG_SSA", false, false); gGameExternalOptions.ubVolumeSSA = iniReader.ReadInteger("Sound Settings", "VOLUME_SSA", 50, 1, 127); gGameExternalOptions.fNWSS = iniReader.ReadBoolean("Sound Settings", "NWSS", false, false); + gGameExternalOptions.fLimitSimultaneousSound = iniReader.ReadBoolean("Sound Settings", "LIMIT_SIMULTANEOUS_SOUND", true, false); //################# Tactical Interface Settings ################# diff --git a/GameSettings.h b/GameSettings.h index 856c62f2..1a4c0b09 100644 --- a/GameSettings.h +++ b/GameSettings.h @@ -529,6 +529,7 @@ typedef struct BOOLEAN fDebugSSA; UINT8 ubVolumeSSA; BOOLEAN fNWSS; + BOOLEAN fLimitSimultaneousSound; // WDS - Option to turn off stealing BOOLEAN fStealingDisabled; diff --git a/SaveLoadGame.cpp b/SaveLoadGame.cpp index e2c8ac5c..6811ac80 100644 --- a/SaveLoadGame.cpp +++ b/SaveLoadGame.cpp @@ -6843,6 +6843,9 @@ BOOLEAN LoadSavedGame( int ubSavedGameID ) RemoveLoadingScreenProgressBar(); + // sevenfm: reset sound map + ResetSoundMap(); + //if( SaveGameHeader.fWorldLoaded ) //{ #ifdef NEWMUSIC diff --git a/Standard Gaming Platform/soundman.cpp b/Standard Gaming Platform/soundman.cpp index 35ef9971..435e4f6e 100644 --- a/Standard Gaming Platform/soundman.cpp +++ b/Standard Gaming Platform/soundman.cpp @@ -25,6 +25,9 @@ // sevenfm #include "message.h" #include "Sound Control.h" + //#include "english.h" + //#include "input.h" + #include #endif // Uncomment this to disable the startup of sound hardware @@ -288,6 +291,8 @@ void ShutdownSoundManager(void) // //******************************************************************************* +std::map> gSoundMap; + UINT32 SoundPlay(STR pFilename, SOUNDPARMS *pParms) { UINT32 uiSample, uiChannel; @@ -296,6 +301,22 @@ UINT32 SoundPlay(STR pFilename, SOUNDPARMS *pParms) { if (!SoundPlayStreamed(pFilename)) { + // sevenfm: limit simultaneous sound playing + if (gGameExternalOptions.fLimitSimultaneousSound) + //!_KeyDown(SHIFT)) + { + std::time_t curtime = std::time(0); + std::string filename(pFilename); + + if (gSoundMap[filename] > curtime) + { + return 0; + } + + // set delay for this sound type + gSoundMap[filename] = curtime + 1; + } + if ((uiSample = SoundLoadSample(pFilename)) != NO_SAMPLE) { if ((uiChannel = SoundGetFreeChannel()) != SOUND_ERROR) @@ -328,6 +349,10 @@ UINT32 SoundPlay(STR pFilename, SOUNDPARMS *pParms) return(SOUND_ERROR); } +void ResetSoundMap(void) +{ + gSoundMap.clear(); +} //******************************************************************************* // SoundPlayStreamedFile diff --git a/Standard Gaming Platform/soundman.h b/Standard Gaming Platform/soundman.h index 0ab6ce76..be09f429 100644 --- a/Standard Gaming Platform/soundman.h +++ b/Standard Gaming Platform/soundman.h @@ -79,6 +79,9 @@ extern UINT32 SoundPlayRandom(STR pFilename, RANDOMPARMS *pParms); extern BOOLEAN SoundServiceStreams(void); extern BOOLEAN SoundServiceRandom(void); +// sevenfm +void ResetSoundMap(void); + // Sound instance manipulation functions extern BOOLEAN SoundStopAll(void); extern BOOLEAN SoundStopAllRandom(void);