Browse Source

Detect window focus state to mute automatically when starting audio

pull/3964/head
staphen 4 years ago committed by Anders Jenbo
parent
commit
6418d7a2f0
  1. 9
      Source/diablo.cpp
  2. 1
      Source/diablo.h
  3. 2
      Source/sound.cpp
  4. 2
      Source/storm/storm_svid.cpp

9
Source/diablo.cpp

@ -1828,6 +1828,15 @@ void diablo_pause_game()
bool GameWasAlreadyPaused = false;
bool MinimizePaused = false;
bool diablo_is_focused()
{
#ifndef USE_SDL1
return SDL_GetKeyboardFocus() == ghMainWnd;
#else
return true;
#endif
}
void diablo_focus_pause()
{
if (!movie_playing && (gbIsMultiplayer || MinimizePaused)) {

1
Source/diablo.h

@ -87,6 +87,7 @@ bool StartGame(bool bNewGame, bool bSinglePlayer);
int DiabloMain(int argc, char **argv);
bool TryIconCurs();
void diablo_pause_game();
bool diablo_is_focused();
void diablo_focus_pause();
void diablo_focus_unpause();
bool PressEscKey();

2
Source/sound.cpp

@ -255,6 +255,8 @@ void music_start(uint8_t nTrack)
}
music->setVolume(VolumeLogToLinear(sgOptions.Audio.nMusicVolume, VOLUME_MIN, VOLUME_MAX));
if (!diablo_is_focused())
music_mute();
if (!music->play(/*iterations=*/0)) {
LogError(LogCategory::Audio, "Aulib::Stream::play (from music_start): {}", SDL_GetError());
CleanupMusic();

2
Source/storm/storm_svid.cpp

@ -266,6 +266,8 @@ bool SVidPlayBegin(const char *filename, int flags)
std::make_unique<Aulib::ResamplerSpeex>(*sgOptions.Audio.resamplingQuality), /*closeRw=*/false);
const float volume = static_cast<float>(sgOptions.Audio.nSoundVolume - VOLUME_MIN) / -VOLUME_MIN;
SVidAudioStream->setVolume(volume);
if (!diablo_is_focused())
SVidMute();
if (!SVidAudioStream->open()) {
LogError(LogCategory::Audio, "Aulib::Stream::open (from SVidPlayBegin): {}", SDL_GetError());
SVidAudioStream = std::nullopt;

Loading…
Cancel
Save