@@ -36,28 +36,51 @@ void GOSoundFader::Process(
36
36
externalVolume *= m_VelocityVolume;
37
37
38
38
float startTargetVolumePoint = m_LastTargetVolumePoint;
39
+
39
40
// Calculate new m_LastTargetVolumePoint
40
41
// the target volume will be changed from startTargetVolumePoint to
41
42
// m_LastTargetVolumePoint during the nFrames
42
- float targetVolumeDeltaPerFrame
43
- = m_IncreasingDeltaPerFrame + m_DecreasingDeltaPerFrame;
44
43
45
- if (targetVolumeDeltaPerFrame != 0 .0f ) {
46
- m_LastTargetVolumePoint = std::clamp (
47
- startTargetVolumePoint + targetVolumeDeltaPerFrame * nFrames,
48
- 0 .0f ,
49
- m_TargetVolume);
44
+ unsigned framesLeftAfterIncreasing = nFrames;
45
+
46
+ // increasing section
47
+ if (m_IncreasingDeltaPerFrame > 0 .0f ) {
48
+ // we are increasing now
49
+ float newTargetVolumePoint
50
+ = m_LastTargetVolumePoint + m_IncreasingDeltaPerFrame * nFrames;
51
+
52
+ if (newTargetVolumePoint < m_TargetVolume) {
53
+ framesLeftAfterIncreasing = 0 ; // we are increase during the whole period
54
+ m_LastTargetVolumePoint = newTargetVolumePoint;
55
+ } else {
56
+ // we reach m_TargetVolume inside this nFrames period
50
57
51
- if (m_LastTargetVolumePoint >= m_TargetVolume)
52
- // target volume is reached. Stop increasing
58
+ // stop increasing
53
59
m_IncreasingDeltaPerFrame = 0 .0f ;
54
- else if (m_LastTargetVolumePoint <= 0 .0f )
55
- // Decreasing is finished. Stop it.
56
- m_DecreasingDeltaPerFrame = 0 .0f ;
60
+
61
+ // calculate how many frames left after increasing
62
+ framesLeftAfterIncreasing = nFrames
63
+ - unsigned ((m_TargetVolume - m_LastTargetVolumePoint)
64
+ / m_IncreasingDeltaPerFrame);
65
+
66
+ m_LastTargetVolumePoint = m_TargetVolume;
67
+ }
57
68
}
58
69
59
- if (m_LastExternalVolumePoint < 0 .0f ) // The first Process() call
60
- m_LastExternalVolumePoint = externalVolume;
70
+ // decreasing section
71
+ if (framesLeftAfterIncreasing && m_DecreasingDeltaPerFrame > 0 .0f ) {
72
+ // decrease the volume
73
+ float newTargetVolumePoint = m_LastTargetVolumePoint
74
+ - m_DecreasingDeltaPerFrame * framesLeftAfterIncreasing;
75
+
76
+ if (newTargetVolumePoint > 0 .0f ) {
77
+ m_LastTargetVolumePoint = newTargetVolumePoint;
78
+ } else {
79
+ // stop decreasing
80
+ m_DecreasingDeltaPerFrame = 0 .0f ;
81
+ m_LastTargetVolumePoint = 0 .0f ;
82
+ }
83
+ }
61
84
62
85
float startExternalVolumePoint = m_LastExternalVolumePoint;
63
86
// Calculate new m_LastExternalVolumePoint
0 commit comments