LCOV - code coverage report
Current view: top level - Dynamic - AttackReleaseFilter.cpp (source / functions) Hit Total Coverage
Test: coverage.info.cleaned Lines: 31 32 96.9 %
Date: 2021-02-18 20:07:22 Functions: 6 6 100.0 %

          Line data    Source code
       1             : /**
       2             :  * \file AttackReleaseFilter.cpp
       3             :  */
       4             : 
       5             : #include "AttackReleaseFilter.h"
       6             : #include <ATK/Core/Utilities.h>
       7             : 
       8             : #include <cassert>
       9             : #include <cstdint>
      10             : 
      11             : namespace ATK
      12             : {
      13             :   template<typename DataType_>
      14           7 :   AttackReleaseFilter<DataType_>::AttackReleaseFilter(gsl::index nb_channels)
      15           7 :   :Parent(nb_channels, nb_channels)
      16             :   {
      17           7 :     output_delay = 1;
      18           7 :   }
      19             : 
      20             :   template<typename DataType_>
      21           4 :   void AttackReleaseFilter<DataType_>::set_attack(DataType_ attack)
      22             :   {
      23           4 :     if(attack < 0)
      24             :     {
      25           1 :       throw ATK::RuntimeError("Attack factor must be positive value");
      26             :     }
      27           3 :     if(attack > 1)
      28             :     {
      29           1 :       throw ATK::RuntimeError("Attack factor must be less than 1");
      30             :     }
      31           2 :     this->attack = attack;
      32           2 :   }
      33             :   
      34             :   template<typename DataType_>
      35           1 :   DataType_ AttackReleaseFilter<DataType_>::get_attack() const
      36             :   {
      37           1 :     return attack;
      38             :   }
      39             : 
      40             :   template<typename DataType_>
      41           4 :   void AttackReleaseFilter<DataType_>::set_release(DataType_ release)
      42             :   {
      43           4 :     if(release < 0)
      44             :     {
      45           1 :       throw ATK::RuntimeError("Release factor must be positive value");
      46             :     }
      47           3 :     if(release > 1)
      48             :     {
      49           1 :       throw ATK::RuntimeError("Release factor must be less than 1");
      50             :     }
      51           2 :     this->release = release;
      52           2 :   }
      53             : 
      54             :   template<typename DataType_>
      55           1 :   DataType_ AttackReleaseFilter<DataType_>::get_release() const
      56             :   {
      57           1 :     return release;
      58             :   }
      59             : 
      60             :   template<typename DataType_>
      61           1 :   void AttackReleaseFilter<DataType_>::process_impl(gsl::index size) const
      62             :   {
      63           1 :     assert(nb_input_ports == nb_output_ports);
      64           2 :     for(gsl::index channel = 0; channel < nb_input_ports; ++channel)
      65             :     {
      66           1 :       const DataType* ATK_RESTRICT input = converted_inputs[channel];
      67           1 :       DataType* ATK_RESTRICT output = outputs[channel];
      68       65537 :       for(gsl::index i = 0; i < size; ++i)
      69             :       {
      70       65536 :         if(output[i-1] > input[i])
      71             :         {
      72           0 :           output[i] = (1 - release) * input[i] + release * output[i-1];//release phase
      73             :         }
      74             :         else
      75             :         {
      76       65536 :           output[i] = (1 - attack) * input[i] + attack * output[i-1];//attack phase
      77             :         }
      78             :       }
      79             :     }
      80           1 :   }
      81             :   
      82             : #if ATK_ENABLE_INSTANTIATION
      83             :   template class AttackReleaseFilter<float>;
      84             : #endif
      85             :   template class AttackReleaseFilter<double>;
      86             : }

Generated by: LCOV version TK-3.3.0-4-gdba42eea