VISR  0.11.8
Versatile Interactive Scene Renderer
crossfading_convolver_uniform.hpp
Go to the documentation of this file.
1 /* Copyright Institute of Sound and Vibration Research - All rights reserved */
2 
3 #ifndef VISR_LIBRBBL_CROSSFADING_CONVOLVER_UNIFORM_HPP_INCLUDED
4 #define VISR_LIBRBBL_CROSSFADING_CONVOLVER_UNIFORM_HPP_INCLUDED
5 
7 #include "export_symbols.hpp"
8 #include "filter_routing.hpp"
9 
10 #include <libefl/basic_matrix.hpp>
11 
12 #include <cassert>
13 #include <complex>
14 #include <initializer_list>
15 #include <map>
16 #include <memory>
17 #include <vector>
18 
19 namespace visr
20 {
21 namespace rbbl
22 {
23 
30 template< typename SampleType >
31 class VISR_RBBL_LIBRARY_SYMBOL CrossfadingConvolverUniform
32 {
33 public:
35 
52  explicit CrossfadingConvolverUniform( std::size_t numberOfInputs,
53  std::size_t numberOfOutputs,
54  std::size_t blockLength,
55  std::size_t maxFilterLength,
56  std::size_t maxRoutingPoints,
57  std::size_t maxFilterEntries,
58  std::size_t transitionSamples,
59  FilterRoutingList const & initialRoutings = FilterRoutingList(),
61  std::size_t alignment = 0,
62  char const * fftImplementation = "default" );
63 
68 
69  std::size_t numberOfInputs() const { return mCoreConvolver.numberOfInputs(); }
70 
71  std::size_t numberOfOutputs() const { return mCoreConvolver.numberOfOutputs(); }
72 
73  std::size_t blockLength() const { return mCoreConvolver.blockLength(); }
74 
75  std::size_t dftBlockRepresentationSize() const { return mCoreConvolver.dftBlockRepresentationSize(); }
76 
77  std::size_t dftFilterRepresentationSize() const { return mCoreConvolver.dftFilterRepresentationSize(); }
78 
79  std::size_t alignment() const { return mCoreConvolver.alignment(); }
80 
81  std::size_t complexAlignment() const { return mCoreConvolver.complexAlignment(); }
82 
83  std::size_t maxNumberOfRoutingPoints() const { return mMaxNumberOfRoutingPoints; }
84 
85  std::size_t maxNumberOfFilterEntries() const { return mCoreConvolver.maxNumberOfFilterEntries(); }
86 
87  std::size_t maxFilterLength() const { return mCoreConvolver.maxFilterLength(); }
88 
89  std::size_t numberOfRoutingPoints( ) const { return mRoutingTable.size(); }
90 
91  void process( SampleType const * const input, std::size_t inputStride,
92  SampleType * const output, std::size_t outputStride,
93  std::size_t alignment = 0 );
94 
102  void clearRoutingTable( );
103 
111  void initRoutingTable( FilterRoutingList const & routings );
112 
118  void setRoutingEntry( FilterRouting const & routing );
119 
125  void setRoutingEntry( std::size_t inputIdx, std::size_t outputIdx, std::size_t filterIdx, SampleType gain );
126 
130  bool removeRoutingEntry( std::size_t inputIdx, std::size_t outputIdx );
131 
135 // std::size_t numberOfRoutings( ) const { return mCoreConvolver.numberOfRoutings(); }
137 
146  void transformImpulseResponse( SampleType const * ir, std::size_t irLength, FrequencyDomainType * result, std::size_t alignment = 0 ) const;
147 
153  void clearFilters( );
154 
165  void initFilters( efl::BasicMatrix<SampleType> const & newImpulseResponses );
166 
169  void setImpulseResponse( SampleType const * ir, std::size_t filterLength, std::size_t filterIdx, std::size_t alignment = 0 );
170 
176  void setTransformedFilter( FrequencyDomainType const * fdFilter, std::size_t filterIdx, std::size_t alignment );
177 private:
181  void processOutputs( SampleType * const output, std::size_t outputChannelStride,
182  std::size_t alignment );
183 
184  CoreConvolverUniform<SampleType> mCoreConvolver;
185 
186  struct RoutingEntry
187  {
188  explicit RoutingEntry( std::size_t in, std::size_t out, std::size_t filter, SampleType gain = 1.0f )
189  : inputIdx( in ), outputIdx( out ), filterIdx( filter ), gainLinear( gain )
190  {
191  }
192  std::size_t inputIdx;
193  std::size_t outputIdx;
194  std::size_t filterIdx;
195  SampleType gainLinear;
196  };
202  struct CompareRoutings
203  {
204  bool operator()( RoutingEntry const & lhs, RoutingEntry const & rhs ) const
205  {
206  if( lhs.outputIdx == rhs.outputIdx )
207  {
208  return lhs.inputIdx < rhs.inputIdx;
209  }
210  else
211  {
212  return lhs.outputIdx < rhs.outputIdx;
213  }
214  }
215  };
216 
217  using RoutingTable = std::multiset<RoutingEntry, CompareRoutings>;
218 
219  RoutingTable mRoutingTable;
220 
221  std::size_t const mMaxNumberOfRoutingPoints;
222 
227 
228  efl::BasicMatrix<SampleType> mTimeDomainTempOutput;
229 
234 
238  std::size_t const mMaxNumFilters;
239 
240  std::size_t const mNumRampBlocks;
241 
242  std::vector<std::size_t> mCurrentFilterOutput;
243 
244  std::vector<std::size_t> mCurrentRampBlock;
245 
246  efl::BasicMatrix<SampleType> mCrossoverRamps;
248 };
249 } // namespace rbbl
250 } // namespace visr
251 
252 #endif // #ifndef VISR_LIBRBBL_CROSSFADING_CONVOLVER_UNIFORM_HPP_INCLUDED
std::size_t dftFilterRepresentationSize() const
Definition: crossfading_convolver_uniform.hpp:77
std::size_t complexAlignment() const
Definition: crossfading_convolver_uniform.hpp:81
Definition: filter_routing.hpp:22
std::size_t dftBlockRepresentationSize() const
Definition: crossfading_convolver_uniform.hpp:75
std::size_t maxNumberOfFilterEntries() const
Definition: crossfading_convolver_uniform.hpp:85
Definition: crossfading_convolver_uniform.hpp:31
std::size_t maxNumberOfRoutingPoints() const
Definition: crossfading_convolver_uniform.hpp:83
std::size_t numberOfOutputs() const
Definition: crossfading_convolver_uniform.hpp:71
Definition: options.cpp:10
std::size_t alignment() const
Definition: crossfading_convolver_uniform.hpp:79
typename FftWrapperBase< SampleType >::FrequencyDomainType FrequencyDomainType
Definition: core_convolver_uniform.hpp:43
std::size_t numberOfRoutingPoints() const
Definition: crossfading_convolver_uniform.hpp:89
std::size_t numberOfInputs() const
Definition: crossfading_convolver_uniform.hpp:69
std::size_t blockLength() const
Definition: crossfading_convolver_uniform.hpp:73
typename CoreConvolverUniform< SampleType >::FrequencyDomainType FrequencyDomainType
Definition: crossfading_convolver_uniform.hpp:34
std::size_t maxFilterLength() const
Definition: crossfading_convolver_uniform.hpp:87
float SampleType
Definition: constants.hpp:14
Definition: core_convolver_uniform.hpp:33
Definition: filter_routing.hpp:81