VISR  0.11.6
Versatile Interactive Scene Renderer
panning_calculator.hpp
Go to the documentation of this file.
1 /* Copyright Institute of Sound and Vibration Research - All rights reserved */
2 
3 #ifndef VISR_LIBRCL_PANNING_CALCULATOR_HPP_INCLUDED
4 #define VISR_LIBRCL_PANNING_CALCULATOR_HPP_INCLUDED
5 
6 #include "export_symbols.hpp"
7 
9 #include <libvisr/constants.hpp>
12 
13 #include <libefl/basic_matrix.hpp>
14 #include <libefl/basic_vector.hpp>
15 
16 #include <libobjectmodel/object.hpp> // needed basically for type definitions
17 
19 
21 #include <libpanning/VBAP.h>
22 #include <libpanning/XYZ.h>
23 
24 #include <memory>
25 #include <valarray>
26 #include <vector>
27 
28 namespace visr
29 {
30 
31 namespace panning
32 {
33  class LoudspeakerArray;
34 }
35 
36 namespace pml
37 {
38 // class ListenerPosition;
39 class ObjectVector;
40 template< typename ElementType > class MatrixParameter;
41 class SharedDataProtocol;
42 class DoubleBufferingProtocol;
43 }
44 
45 namespace rcl
46 {
47 
51 class VISR_RCL_LIBRARY_SYMBOL PanningCalculator: public AtomicComponent
52 {
53 public:
54  enum class PanningMode
55  {
56  Nothing = 0,
57  LF = 1,
58  HF = 2,
59  Diffuse = 4,
60  Dualband = LF | HF,
61  All = Dualband | Diffuse
62  };
63 
64  enum class Normalisation
65  {
66  Default = 0,
67  Amplitude = 1,
68  Energy = 2
69  };
70 
76 
87  explicit PanningCalculator( SignalFlowContext const & context,
88  char const * name,
89  CompositeComponent * parent,
90  std::size_t numberOfObjects,
91  panning::LoudspeakerArray const & arrayConfig,
92  bool adaptiveListenerPosition = false,
93  bool separateLowpassPanning = false );
94 
95 
112  explicit PanningCalculator( SignalFlowContext const & context,
113  char const * name,
114  CompositeComponent * parent,
115  std::size_t numberOfObjects,
116  panning::LoudspeakerArray const & arrayConfig,
117  bool adaptiveListenerPosition,
118  PanningMode panningMode = PanningMode::LF,
119  Normalisation lfNormalisation = Normalisation::Default,
120  Normalisation hfNormalisation = Normalisation::Default,
121  Normalisation diffuseNormalisation = Normalisation::Default,
122  pml::ListenerPosition const & listenerPosition = pml::ListenerPosition(0.0f, 0.0f, 0.0f )
123  );
124 
128  PanningCalculator( PanningCalculator const & ) = delete;
129 
130 
135 
140  void process();
141 
142 
143 private:
144  bool separateLowpassPanning() const { return bool(mLowFrequencyGainOutput); }
145 
146 
147  using LoudspeakerIndexType = std::size_t;
148 
149 
153  bool isTwoD() const { return mVectorDimension == 2; }
154 
155 
166  void setListenerPosition( CoefficientType x, CoefficientType y, CoefficientType z );
167 
176  void setListenerPosition( pml::ListenerPosition const & pos );
177 
181  std::size_t const mNumberOfObjects;
182 
187  std::size_t const mNumberOfRegularLoudspeakers;
188 
193  std::size_t const mNumberOfAllLoudspeakers;
194 
195 
200  std::size_t const mVectorDimension;
201 
202  efl::BasicMatrix<CoefficientType> mLoudspeakerPositions;
203 
207  std::unique_ptr<panning::VBAP> mVbapCalculator;
208 
213  mutable efl::BasicVector<SampleType> mTmpGains;
214 
218  mutable efl::BasicVector<CoefficientType> mTmpHfGains;
219 
220  mutable efl::BasicVector<SampleType> mTmpDiffuseGains;
221 
222  Normalisation const mLfNormalisation;
223 
224  Normalisation const mHfNormalisation;
225 
226  Normalisation const mDiffuseNormalisation;
227 
228  using ChannelLabelLookup = std::map< std::string, std::size_t >;
229 
230  ChannelLabelLookup const mLabelLookup;
231 
235  static ChannelLabelLookup fillLabelLookup( panning::LoudspeakerArray const & config );
236 
243 
244  std::unique_ptr<ObjectPort> mObjectVectorInput;
245 
246  std::unique_ptr<ListenerPositionPort> mListenerPositionInput;
247 
251  std::unique_ptr<MatrixPort> mLowFrequencyGainOutput;
252 
256  std::unique_ptr<MatrixPort> mHighFrequencyGainOutput;
257 
261  std::unique_ptr<MatrixPort> mDiffuseGainOutput;
262 };
263 
269 
275 
276 
277 } // namespace rcl
278 } // namespace visr
279 
280 #endif // #ifndef VISR_LIBRCL_PANNING_CALCULATOR_HPP_INCLUDED
Definition: parameter_output.hpp:45
CrossfadingFirFilterMatrix::ControlPortConfig operator &(CrossfadingFirFilterMatrix::ControlPortConfig lhs, CrossfadingFirFilterMatrix::ControlPortConfig rhs)
Definition: crossfading_fir_filter_matrix.cpp:16
Normalisation
Definition: panning_calculator.hpp:64
PanningMode
Definition: panning_calculator.hpp:54
Definition: options.cpp:10
Definition: atomic_component.hpp:21
SampleType CoefficientType
Definition: panning_calculator.hpp:75
Definition: parameter_input.hpp:45
Definition: composite_component.hpp:29
Definition: LoudspeakerArray.h:42
Definition: signal_flow_context.hpp:15
CrossfadingFirFilterMatrix::ControlPortConfig operator|(CrossfadingFirFilterMatrix::ControlPortConfig lhs, CrossfadingFirFilterMatrix::ControlPortConfig rhs)
Definition: crossfading_fir_filter_matrix.cpp:23
Definition: listener_position.hpp:31
float SampleType
Definition: constants.hpp:14
Definition: panning_calculator.hpp:51