VISR  0.12.0
Versatile Interactive Scene Renderer
multichannel_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_MULTICHANNEL_CONVOLVER_UNIFORM_HPP_INCLUDED
4 #define VISR_LIBRBBL_MULTICHANNEL_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 MultichannelConvolverUniform
32 {
33 public:
49  explicit MultichannelConvolverUniform( std::size_t numberOfInputs,
50  std::size_t numberOfOutputs,
51  std::size_t blockLength,
52  std::size_t maxFilterLength,
53  std::size_t maxRoutingPoints,
54  std::size_t maxFilterEntries,
55  FilterRoutingList const & initialRoutings = FilterRoutingList(),
57  std::size_t alignment = 0,
58  char const * fftImplementation = "default" );
59 
64 
65  std::size_t numberOfInputs() const { return mCoreConvolver.numberOfInputs(); }
66 
67  std::size_t numberOfOutputs() const { return mCoreConvolver.numberOfOutputs(); }
68 
69  std::size_t blockLength() const { return mCoreConvolver.blockLength(); }
70 
71  std::size_t maxNumberOfRoutingPoints() const { return mMaxNumberOfRoutingPoints; }
72 
73  std::size_t maxNumberOfFilterEntries() const { return mCoreConvolver.maxNumberOfFilterEntries(); }
74 
75  std::size_t maxFilterLength() const { return mCoreConvolver.maxFilterLength(); }
76 
77  std::size_t numberOfRoutingPoints( ) const { return mRoutingTable.size(); }
78 
79  void process( SampleType const * const input, std::size_t inputStride,
80  SampleType * const output, std::size_t outputStride,
81  std::size_t alignment = 0 );
82 
90  void clearRoutingTable( );
91 
99  void initRoutingTable( FilterRoutingList const & routings );
100 
106  void setRoutingEntry( FilterRouting const & routing );
107 
113  void setRoutingEntry( std::size_t inputIdx, std::size_t outputIdx, std::size_t filterIdx, SampleType gain );
114 
118  bool removeRoutingEntry( std::size_t inputIdx, std::size_t outputIdx );
119 
123 // std::size_t numberOfRoutings( ) const { return mCoreConvolver.numberOfRoutings(); }
125 
133  void clearFilters( );
134 
144  void initFilters( efl::BasicMatrix<SampleType> const & newFilters );
145 
146  void setImpulseResponse( SampleType const * ir, std::size_t filterLength, std::size_t filterIdx, std::size_t alignment = 0 );
147 
148 private:
152  void processOutputs( SampleType * const output, std::size_t outputChannelStride,
153  std::size_t alignment );
154 
155  CoreConvolverUniform<SampleType> mCoreConvolver;
156 
157  struct RoutingEntry
158  {
159  explicit RoutingEntry( std::size_t in, std::size_t out, std::size_t filter, SampleType gain = 1.0f )
160  : inputIdx( in ), outputIdx( out ), filterIdx( filter ), gainLinear( gain )
161  {
162  }
163  std::size_t inputIdx;
164  std::size_t outputIdx;
165  std::size_t filterIdx;
166  SampleType gainLinear;
167  };
173  struct CompareRoutings
174  {
175  bool operator()( RoutingEntry const & lhs, RoutingEntry const & rhs ) const
176  {
177  if( lhs.outputIdx == rhs.outputIdx )
178  {
179  return lhs.inputIdx < rhs.inputIdx;
180  }
181  else
182  {
183  return lhs.outputIdx < rhs.outputIdx;
184  }
185  }
186  };
187 
188  using RoutingTable = std::multiset<RoutingEntry, CompareRoutings>;
189 
190  RoutingTable mRoutingTable;
191 
192  std::size_t const mMaxNumberOfRoutingPoints;
193 
194  efl::BasicMatrix< typename CoreConvolverUniform<SampleType>::FrequencyDomainType > mFrequencyDomainOutput;
195 };
196 
197 } // namespace rbbl
198 } // namespace visr
199 
200 #endif // #ifndef VISR_LIBRBBL_MULTICHANNEL_CONVOLVER_UNIFORM_HPP_INCLUDED
std::size_t numberOfRoutingPoints() const
Definition: multichannel_convolver_uniform.hpp:77
Definition: filter_routing.hpp:22
Definition: multichannel_convolver_uniform.hpp:31
std::size_t maxNumberOfRoutingPoints() const
Definition: multichannel_convolver_uniform.hpp:71
std::size_t maxFilterLength() const
Definition: multichannel_convolver_uniform.hpp:75
Definition: options.cpp:10
std::size_t maxNumberOfFilterEntries() const
Definition: multichannel_convolver_uniform.hpp:73
std::size_t numberOfOutputs() const
Definition: multichannel_convolver_uniform.hpp:67
std::size_t blockLength() const
Definition: multichannel_convolver_uniform.hpp:69
float SampleType
Definition: constants.hpp:14
Definition: core_convolver_uniform.hpp:33
std::size_t numberOfInputs() const
Definition: multichannel_convolver_uniform.hpp:65
Definition: filter_routing.hpp:81