Skip to content

Commit

Permalink
Add fade in smooth transition for ambient sounds when start playing
Browse files Browse the repository at this point in the history
  • Loading branch information
Kolfering committed Jan 13, 2025
1 parent 2ab9440 commit 1874d2b
Show file tree
Hide file tree
Showing 4 changed files with 9 additions and 6 deletions.
3 changes: 2 additions & 1 deletion Source_Files/Sound/SoundManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -814,7 +814,7 @@ std::shared_ptr<SoundPlayer> SoundManager::ManageSound(const Sound& sound, const
return returnedPlayer;
}

std::shared_ptr<SoundPlayer> SoundManager::BufferSound(SoundParameters parameters)
std::shared_ptr<SoundPlayer> SoundManager::BufferSound(SoundParameters& parameters)
{
auto returnedPlayer = std::shared_ptr<SoundPlayer>();
SoundDefinition* definition = GetSoundDefinition(parameters.identifier);
Expand Down Expand Up @@ -1053,6 +1053,7 @@ void SoundManager::UpdateAmbientSoundSources()
SoundParameters parameters;
parameters.identifier = ambient_sounds[i].sound_index;
parameters.soft_rewind = true;
parameters.soft_start = true;
parameters.pitch = FIXED_ONE;
parameters.flags = ambient_sounds[i].flags;
parameters.stereo_parameters.is_panning = true;
Expand Down
2 changes: 1 addition & 1 deletion Source_Files/Sound/SoundManager.h
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,7 @@ class SoundManager
SoundManager();
void SetStatus(bool active);
SoundDefinition* GetSoundDefinition(short sound_index);
std::shared_ptr<SoundPlayer> BufferSound(SoundParameters parameters);
std::shared_ptr<SoundPlayer> BufferSound(SoundParameters& parameters);
float CalculatePitchModifier(short sound_index, _fixed pitch_modifier);
void AngleAndVolumeToStereoVolume(angle delta, short volume, short *right_volume, short *left_volume);
short GetRandomSoundPermutation(short sound_index);
Expand Down
7 changes: 4 additions & 3 deletions Source_Files/Sound/SoundPlayer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -185,8 +185,9 @@ SetupALResult SoundPlayer::SetUpALSourceIdle() {

if (soundParameters.is_2d) {

bool softStopSignal = soft_stop_signal.load();
float volume = softStopSignal ? 0 : 1;
const bool softStopSignal = soft_stop_signal.load();
const bool softStartBegin = !sound_transition.allow_transition && soundParameters.soft_start;
float volume = softStopSignal || softStartBegin ? 0 : 1;

if (soundParameters.stereo_parameters.is_panning) {
auto pan = (acosf(std::min(soundParameters.stereo_parameters.gain_left, 1.f)) + asinf(std::min(soundParameters.stereo_parameters.gain_right, 1.f))) / ((float)M_PI); // average angle in [0,1]
Expand All @@ -200,7 +201,7 @@ SetupALResult SoundPlayer::SetUpALSourceIdle() {
}

float finalVolume = ComputeVolumeForTransition(volume);
result.second = finalVolume == volume;
result.second = finalVolume == volume && !softStartBegin;

if (softStopSignal && finalVolume == 0) softStopDone = true;

Expand Down
3 changes: 2 additions & 1 deletion Source_Files/Sound/SoundPlayer.h
Original file line number Diff line number Diff line change
Expand Up @@ -46,12 +46,13 @@ struct SoundParameters {
bool loop = false;
bool is_2d = true; //if false it will use source_location3d to position sound (3D sounds)
bool soft_rewind = false; //if true the sound can only rewind after it's done playing
bool soft_start = false; //if true the sound will use transitions to fade in from silence to proper computed volume
uint16_t obstruction_flags = 0;
uint16_t flags = 0;
sound_behavior behavior = _sound_is_normal;
world_location3d source_location3d = {};
world_location3d* dynamic_source_location3d = nullptr;
SoundStereo stereo_parameters = {}; //2D panning
uint16_t flags = 0;
};

struct SoundBehavior {
Expand Down

0 comments on commit 1874d2b

Please sign in to comment.