Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 14 additions & 3 deletions Core/GameEngine/Include/Common/GameAudio.h
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,17 @@ enum
class AudioManager : public SubsystemInterface
{
public:
typedef UnsignedInt MuteAudioReasonInt;

enum MuteAudioReason CPP_11(: UnsignedInt)
{
MuteAudioReason_WindowFocus,

MuteAudioReason_Count
};
Comment thread
Caball009 marked this conversation as resolved.

static const char *const MuteAudioReasonNames[];

AudioManager();
virtual ~AudioManager();
#if defined(RTS_DEBUG)
Expand All @@ -149,9 +160,8 @@ class AudioManager : public SubsystemInterface
virtual void resumeAudio( AudioAffect which ) = 0;
virtual void pauseAmbient( Bool shouldPause ) = 0;

// for focus issues
virtual void loseFocus( void );
virtual void regainFocus( void );
void muteAudio( MuteAudioReason reason );
void unmuteAudio( MuteAudioReason reason );

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

// Group of 8
Bool m_speechOn : 1;
Expand Down
29 changes: 23 additions & 6 deletions Core/GameEngine/Source/Common/Audio/GameAudio.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,10 @@ static const FieldParse audioSettingsFieldParseTable[] =
// Singleton TheAudio /////////////////////////////////////////////////////////////////////////////
AudioManager *TheAudio = nullptr;

const char *const AudioManager::MuteAudioReasonNames[] =
{
"MuteAudioReason_WindowFocus",
};
Comment thread
Caball009 marked this conversation as resolved.

// AudioManager Device Independent functions //////////////////////////////////////////////////////
AudioManager::AudioManager() :
Expand All @@ -152,6 +156,8 @@ AudioManager::AudioManager() :
m_hardwareAccel(FALSE),
m_musicPlayingFromCD(FALSE)
{
static_assert(ARRAY_SIZE(AudioManager::MuteAudioReasonNames) == MuteAudioReason_Count, "Incorrect array size");

m_adjustedVolumes.clear();
m_audioRequests.clear();
m_listenerPosition.zero();
Expand All @@ -171,6 +177,7 @@ AudioManager::AudioManager() :
m_miscAudio = NEW MiscAudio;
m_silentAudioEvent = NEW AudioEventRTS;
m_savedValues = nullptr;
m_muteReasonBits = 0;
m_disallowSpeech = FALSE;
}

Expand Down Expand Up @@ -1103,12 +1110,17 @@ void AudioManager::releaseAudioEventRTS( AudioEventRTS *&eventToRelease )
}

//-------------------------------------------------------------------------------------------------
void AudioManager::loseFocus( void )
void AudioManager::muteAudio( MuteAudioReason reason )
{
if (m_savedValues)
m_muteReasonBits |= 1u << reason;
Comment thread
xezon marked this conversation as resolved.

DEBUG_LOG(("AudioManager::muteAudio(%s): m_muteReason=%u muted=%d",
MuteAudioReasonNames[reason], m_muteReasonBits, (int)(m_muteReasonBits != 0)));

if (m_muteReasonBits == 0 || m_savedValues)
Comment thread
stephanmeesters marked this conversation as resolved.
return;

// In this case, make all the audio go silent.
// Make all the audio go silent.
m_savedValues = NEW Real[NUM_VOLUME_TYPES];
m_savedValues[VOLUME_TYPE_MUSIC] = m_systemMusicVolume;
m_savedValues[VOLUME_TYPE_SOUND] = m_systemSoundVolume;
Expand All @@ -1120,12 +1132,17 @@ void AudioManager::loseFocus( void )
}

//-------------------------------------------------------------------------------------------------
void AudioManager::regainFocus( void )
void AudioManager::unmuteAudio( MuteAudioReason reason )
{
if (!m_savedValues)
m_muteReasonBits &= ~(1u << reason);

DEBUG_LOG(("AudioManager::unmuteAudio(%s): m_muteReason=%u muted=%d",
MuteAudioReasonNames[reason], m_muteReasonBits, (int)(m_muteReasonBits != 0)));

if (m_muteReasonBits != 0 || !m_savedValues)
return;

// We got focus back. Restore the previous audio values.
// Restore the previous audio values.
setVolume(m_savedValues[VOLUME_TYPE_MUSIC], (AudioAffect) (AudioAffect_Music | AudioAffect_SystemSetting));
setVolume(m_savedValues[VOLUME_TYPE_SOUND], (AudioAffect) (AudioAffect_Sound | AudioAffect_SystemSetting));
setVolume(m_savedValues[VOLUME_TYPE_SOUND3D], (AudioAffect) (AudioAffect_Sound3D | AudioAffect_SystemSetting));
Expand Down
4 changes: 2 additions & 2 deletions Generals/Code/Main/WinMain.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -464,12 +464,12 @@ LRESULT CALLBACK WndProc( HWND hWnd, UINT message,
if( active == WA_INACTIVE )
{
if (TheAudio)
TheAudio->loseFocus();
TheAudio->muteAudio(AudioManager::MuteAudioReason_WindowFocus);
}
else
{
if (TheAudio)
TheAudio->regainFocus();
TheAudio->unmuteAudio(AudioManager::MuteAudioReason_WindowFocus);

// Cursor can only be captured after one of the activation events.
if (TheMouse)
Expand Down
4 changes: 2 additions & 2 deletions GeneralsMD/Code/Main/WinMain.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -486,12 +486,12 @@ LRESULT CALLBACK WndProc( HWND hWnd, UINT message,
if( active == WA_INACTIVE )
{
if (TheAudio)
TheAudio->loseFocus();
TheAudio->muteAudio(AudioManager::MuteAudioReason_WindowFocus);
}
else
{
if (TheAudio)
TheAudio->regainFocus();
TheAudio->unmuteAudio(AudioManager::MuteAudioReason_WindowFocus);

// Cursor can only be captured after one of the activation events.
if (TheMouse)
Expand Down
Loading