Add Music_LevelVolume, Music_ResetLevelVolume: change music volume from gameplay contexts

- Tunes opt into using this volume by setting
  Tune::use_level_volume to true
This commit is contained in:
James R 2024-01-15 16:28:59 -08:00
parent 14d6477aad
commit 1a0b927cf2
6 changed files with 57 additions and 1 deletions

View file

@ -31,6 +31,7 @@ void Music_Init(void)
tune.fade_out = 1500;
tune.fade_out_inclusive = false;
tune.resume_fade_in = 750;
tune.use_level_volume = true;
tune.sync = true;
tune.credit = true;
tune.vapes = true;
@ -417,3 +418,13 @@ void Music_BatchExempt(const char* id)
tune->resist_once = true;
}
}
void Music_LevelVolume(int volume)
{
g_tunes.level_volume(volume, false);
}
void Music_ResetLevelVolume(void)
{
g_tunes.level_volume(100, true);
}

View file

@ -103,6 +103,14 @@ void Music_Loop(const char *id, boolean loop);
// as Music_StopAll.
void Music_BatchExempt(const char *id);
// Set the volume for level context. TODO: this should be
// done on a more selective basis, rather than globally.
void Music_LevelVolume(int volume);
// Reset volume back to normal. This will fade it as if the
// music is resuming after another tune ended.
void Music_ResetLevelVolume(void);
//
// Query properties.

View file

@ -79,7 +79,13 @@ void TuneManager::tick()
{
if (load())
{
I_FadeInPlaySong(tune->resume ? tune->resume_fade_in : tune->fade_in, tune->loop);
I_PlaySong(tune->loop);
I_FadeSongFromVolume(
tune->use_level_volume ? level_volume_ : 100,
0,
tune->resume ? tune->resume_fade_in : tune->fade_in,
nullptr
);
seek(tune);
adjust_volume();
@ -116,6 +122,19 @@ void TuneManager::tick()
tune->ending = true;
}
}
if (level_volume_ != old_level_volume_ && tune->use_level_volume && tune->can_fade_out)
{
if (volume_fade_)
{
I_FadeSong(level_volume_, tune->resume_fade_in, nullptr);
}
else
{
I_SetInternalMusicVolume(level_volume_);
}
old_level_volume_ = level_volume_;
}
}
void TuneManager::pause_unpause() const

View file

@ -88,6 +88,15 @@ public:
}
}
void level_volume(int vol, bool fade)
{
if (vol != old_level_volume_)
{
level_volume_ = vol;
volume_fade_ = fade;
}
}
private:
std::unordered_map<std::string, Tune> map_;
std::string current_song_;
@ -99,6 +108,10 @@ private:
bool gme_; // hack
int level_volume_ = 100;
int old_level_volume_ = 100;
bool volume_fade_ = false;
decltype(map_)::const_iterator current_iterator() const
{
return std::max_element(

View file

@ -44,6 +44,9 @@ public:
// resumes.
int resume_fade_in = 0;
// Adjust volume based on level context.
bool use_level_volume = false;
// Sync this tune to game logic.
bool sync = false;

View file

@ -8205,6 +8205,8 @@ void P_LoadLevelMusic(void)
tic_t level_music_start = starttime + (TICRATE/2);
Music_Seek("level", (std::max(leveltime, level_music_start) - level_music_start) * 1000UL / TICRATE);
}
Music_ResetLevelVolume();
}
/** Loads a level from a lump or external wad.