00001 /******************************************************************************* 00002 The content of this file includes portions of the AUDIOKINETIC Wwise Technology 00003 released in source code form as part of the SDK installer package. 00004 00005 Commercial License Usage 00006 00007 Licensees holding valid commercial licenses to the AUDIOKINETIC Wwise Technology 00008 may use this file in accordance with the end user license agreement provided 00009 with the software or, alternatively, in accordance with the terms contained in a 00010 written agreement between you and Audiokinetic Inc. 00011 00012 Apache License Usage 00013 00014 Alternatively, this file may be used under the Apache License, Version 2.0 (the 00015 "Apache License"); you may not use this file except in compliance with the 00016 Apache License. You may obtain a copy of the Apache License at 00017 http://www.apache.org/licenses/LICENSE-2.0. 00018 00019 Unless required by applicable law or agreed to in writing, software distributed 00020 under the Apache License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES 00021 OR CONDITIONS OF ANY KIND, either express or implied. See the Apache License for 00022 the specific language governing permissions and limitations under the License. 00023 00024 Version: <VERSION> Build: <BUILDNUMBER> 00025 Copyright (c) <COPYRIGHTYEAR> Audiokinetic Inc. 00026 *******************************************************************************/ 00027 00028 // AkValueRamp.h 00029 00030 /// \file 00031 /// Linear interpolation services for plug-in parameters. 00032 00033 #ifndef _AK_VALUERAMP_H_ 00034 #define _AK_VALUERAMP_H_ 00035 00036 #include <AK/SoundEngine/Common/AkTypes.h> 00037 #include <AK/Tools/Common/AkAssert.h> 00038 #include <math.h> 00039 00040 namespace AK 00041 { 00042 00043 /// Platform-independent parameter interpolation service for software plug-ins. 00044 /// \aknote 00045 /// Algorithm performs linear interpolation. 00046 /// \endaknote 00047 /// \sa 00048 /// - \ref shared_parameter_interface 00049 class CAkValueRamp 00050 { 00051 public: 00052 00053 /// Constructor method. 00054 CAkValueRamp() : 00055 m_fStepIncrement( 0.f ), // Step increment sign 00056 m_fInc( 0.f ), // Signed increment 00057 m_fTarget( 0.f ), // Target gain for ramping 00058 m_fCurrent( 0.f ), // Current interpolated value 00059 m_uRampCount( 0 ), // Position in interpolation ramp 00060 m_uRampLength( 0 ) // Total duration of interpolation ramp 00061 { 00062 } 00063 00064 /// Destructor method. 00065 ~CAkValueRamp() 00066 { 00067 } 00068 00069 /// Initial parameter interpolation ramp setup. 00070 inline void RampSetup( 00071 AkReal32 fStepIncrement, ///< Increment to add to the parameter at every Tick() call 00072 AkReal32 fInitVal ///< Initial ramp value 00073 ) 00074 { 00075 AKASSERT( fStepIncrement > 0.f ); 00076 m_fStepIncrement = fStepIncrement; 00077 m_fCurrent = fInitVal; 00078 SetTarget( fInitVal ); 00079 } 00080 00081 /// Set the ramp's target value. 00082 AkForceInline void SetTarget( 00083 AkReal32 fTarget ///< Target ramp value 00084 ) 00085 { 00086 m_fTarget = fTarget; 00087 m_uRampCount = 0; 00088 AkReal32 fDiff = m_fTarget - m_fCurrent; 00089 m_uRampLength = static_cast<AkUInt32>( fabs(fDiff) / m_fStepIncrement ); 00090 m_fInc = fDiff > 0 ? m_fStepIncrement : -m_fStepIncrement; 00091 } 00092 00093 /// Process a single interpolation frame. 00094 /// \return The current interpolated value 00095 AkForceInline AkReal32 Tick() 00096 { 00097 if ( m_uRampCount >= m_uRampLength ) 00098 m_fCurrent = m_fTarget; 00099 else 00100 { 00101 ++m_uRampCount; 00102 m_fCurrent += m_fInc; 00103 } 00104 return m_fCurrent; 00105 } 00106 00107 /// Retrieve the current interpolated value. 00108 /// \return The current interpolated value 00109 AkReal32 GetCurrent() { return m_fCurrent; } 00110 00111 /// Set the current interpolated value. 00112 void SetCurrent(AkReal32 in_fCurrent) { m_fCurrent = in_fCurrent; } 00113 00114 /// Retrieve the current interpolation frame count. 00115 /// \return The current interpolation frame count 00116 AkUInt32 GetRampCount() { return m_uRampCount; } 00117 00118 /// Set the current interpolation frame count. 00119 void SetRampCount(AkUInt32 in_uRampCount) { m_uRampCount = in_uRampCount; } 00120 00121 /// The ramp is no longer necessary; set to target 00122 void StopRamp() 00123 { 00124 m_fCurrent = m_fTarget; 00125 m_uRampCount = m_uRampLength; 00126 } 00127 00128 private: 00129 00130 AkReal32 m_fStepIncrement; // Step increment size 00131 AkReal32 m_fInc; // Signed increment 00132 AkReal32 m_fTarget; // Target for interpolation ramp 00133 AkReal32 m_fCurrent; // Current interpolated value 00134 AkUInt32 m_uRampCount; // Position in interpolation ramp 00135 AkUInt32 m_uRampLength; // Total duration of interpolation ramp 00136 } AK_ALIGN_DMA; 00137 } 00138 00139 #endif //_AK_VALUERAMP_H_