@@ -139,6 +139,10 @@ static const FieldParse audioSettingsFieldParseTable[] =
139139// Singleton TheAudio /////////////////////////////////////////////////////////////////////////////
140140AudioManager *TheAudio = nullptr ;
141141
142+ const char *const AudioManager::MuteAudioReasonNames[] =
143+ {
144+ " MuteAudioReason_WindowFocus" ,
145+ };
142146
143147// AudioManager Device Independent functions //////////////////////////////////////////////////////
144148AudioManager::AudioManager () :
@@ -152,6 +156,8 @@ AudioManager::AudioManager() :
152156 m_hardwareAccel(FALSE ),
153157 m_musicPlayingFromCD(FALSE )
154158{
159+ static_assert (ARRAY_SIZE (AudioManager::MuteAudioReasonNames) == MuteAudioReason_Count, " Incorrect array size" );
160+
155161 m_adjustedVolumes.clear ();
156162 m_audioRequests.clear ();
157163 m_listenerPosition.zero ();
@@ -171,6 +177,7 @@ AudioManager::AudioManager() :
171177 m_miscAudio = NEW MiscAudio;
172178 m_silentAudioEvent = NEW AudioEventRTS;
173179 m_savedValues = nullptr ;
180+ m_muteReasonBits = 0 ;
174181 m_disallowSpeech = FALSE ;
175182}
176183
@@ -1103,12 +1110,17 @@ void AudioManager::releaseAudioEventRTS( AudioEventRTS *&eventToRelease )
11031110}
11041111
11051112// -------------------------------------------------------------------------------------------------
1106- void AudioManager::loseFocus ( void )
1113+ void AudioManager::muteAudio ( MuteAudioReason reason )
11071114{
1108- if (m_savedValues)
1115+ m_muteReasonBits |= 1u << reason;
1116+
1117+ DEBUG_LOG ((" AudioManager::muteAudio(%s): m_muteReason=%u muted=%d" ,
1118+ MuteAudioReasonNames[reason], m_muteReasonBits, (int )(m_muteReasonBits != 0 )));
1119+
1120+ if (m_muteReasonBits == 0 || m_savedValues)
11091121 return ;
11101122
1111- // In this case, make all the audio go silent.
1123+ // Make all the audio go silent.
11121124 m_savedValues = NEW Real[NUM_VOLUME_TYPES];
11131125 m_savedValues[VOLUME_TYPE_MUSIC] = m_systemMusicVolume;
11141126 m_savedValues[VOLUME_TYPE_SOUND] = m_systemSoundVolume;
@@ -1120,12 +1132,17 @@ void AudioManager::loseFocus( void )
11201132}
11211133
11221134// -------------------------------------------------------------------------------------------------
1123- void AudioManager::regainFocus ( void )
1135+ void AudioManager::unmuteAudio ( MuteAudioReason reason )
11241136{
1125- if (!m_savedValues)
1137+ m_muteReasonBits &= ~(1u << reason);
1138+
1139+ DEBUG_LOG ((" AudioManager::unmuteAudio(%s): m_muteReason=%u muted=%d" ,
1140+ MuteAudioReasonNames[reason], m_muteReasonBits, (int )(m_muteReasonBits != 0 )));
1141+
1142+ if (m_muteReasonBits != 0 || !m_savedValues)
11261143 return ;
11271144
1128- // We got focus back. Restore the previous audio values.
1145+ // Restore the previous audio values.
11291146 setVolume (m_savedValues[VOLUME_TYPE_MUSIC], (AudioAffect) (AudioAffect_Music | AudioAffect_SystemSetting));
11301147 setVolume (m_savedValues[VOLUME_TYPE_SOUND], (AudioAffect) (AudioAffect_Sound | AudioAffect_SystemSetting));
11311148 setVolume (m_savedValues[VOLUME_TYPE_SOUND3D], (AudioAffect) (AudioAffect_Sound3D | AudioAffect_SystemSetting));
0 commit comments