Skip to content

Commit 1b8382e

Browse files
stephanmeestersChapter5780
authored andcommitted
refactor(audio): Replace AudioManager's loseFocus/regainFocus with reason-based mute/unmute functions (TheSuperHackers#2236)
1 parent c9e25d3 commit 1b8382e

File tree

4 files changed

+41
-13
lines changed

4 files changed

+41
-13
lines changed

Core/GameEngine/Include/Common/GameAudio.h

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,17 @@ enum
131131
class AudioManager : public SubsystemInterface
132132
{
133133
public:
134+
typedef UnsignedInt MuteAudioReasonInt;
135+
136+
enum MuteAudioReason CPP_11(: UnsignedInt)
137+
{
138+
MuteAudioReason_WindowFocus,
139+
140+
MuteAudioReason_Count
141+
};
142+
143+
static const char *const MuteAudioReasonNames[];
144+
134145
AudioManager();
135146
virtual ~AudioManager();
136147
#if defined(RTS_DEBUG)
@@ -149,9 +160,8 @@ class AudioManager : public SubsystemInterface
149160
virtual void resumeAudio( AudioAffect which ) = 0;
150161
virtual void pauseAmbient( Bool shouldPause ) = 0;
151162

152-
// for focus issues
153-
virtual void loseFocus( void );
154-
virtual void regainFocus( void );
163+
void muteAudio( MuteAudioReason reason );
164+
void unmuteAudio( MuteAudioReason reason );
155165

156166
// control for AudioEventsRTS
157167
virtual AudioHandle addAudioEvent( const AudioEventRTS *eventToAdd ); ///< Add an audio event (event must be declared in an INI file)
@@ -361,6 +371,7 @@ class AudioManager : public SubsystemInterface
361371
NUM_VOLUME_TYPES
362372
};
363373
Real *m_savedValues;
374+
MuteAudioReasonInt m_muteReasonBits;
364375

365376
// Group of 8
366377
Bool m_speechOn : 1;

Core/GameEngine/Source/Common/Audio/GameAudio.cpp

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,10 @@ static const FieldParse audioSettingsFieldParseTable[] =
139139
// Singleton TheAudio /////////////////////////////////////////////////////////////////////////////
140140
AudioManager *TheAudio = nullptr;
141141

142+
const char *const AudioManager::MuteAudioReasonNames[] =
143+
{
144+
"MuteAudioReason_WindowFocus",
145+
};
142146

143147
// AudioManager Device Independent functions //////////////////////////////////////////////////////
144148
AudioManager::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));

Generals/Code/Main/WinMain.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -464,12 +464,12 @@ LRESULT CALLBACK WndProc( HWND hWnd, UINT message,
464464
if( active == WA_INACTIVE )
465465
{
466466
if (TheAudio)
467-
TheAudio->loseFocus();
467+
TheAudio->muteAudio(AudioManager::MuteAudioReason_WindowFocus);
468468
}
469469
else
470470
{
471471
if (TheAudio)
472-
TheAudio->regainFocus();
472+
TheAudio->unmuteAudio(AudioManager::MuteAudioReason_WindowFocus);
473473

474474
// Cursor can only be captured after one of the activation events.
475475
if (TheMouse)

GeneralsMD/Code/Main/WinMain.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -486,12 +486,12 @@ LRESULT CALLBACK WndProc( HWND hWnd, UINT message,
486486
if( active == WA_INACTIVE )
487487
{
488488
if (TheAudio)
489-
TheAudio->loseFocus();
489+
TheAudio->muteAudio(AudioManager::MuteAudioReason_WindowFocus);
490490
}
491491
else
492492
{
493493
if (TheAudio)
494-
TheAudio->regainFocus();
494+
TheAudio->unmuteAudio(AudioManager::MuteAudioReason_WindowFocus);
495495

496496
// Cursor can only be captured after one of the activation events.
497497
if (TheMouse)

0 commit comments

Comments
 (0)