Table of Contents

include/AK/Plugin/PluginServices/AkValueRamp.h

Go to the documentation of this file.
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_