VISR  0.11.1
Versatile Interactive Scene Renderer
array_configuration.hpp
Go to the documentation of this file.
1 /* Copyright Institute of Sound and Vibration Research - All rights reserved */
2 
3 #ifndef VISR_PML_ARRAY_CONFIGURATION_HPP_INCLUDED
4 #define VISR_PML_ARRAY_CONFIGURATION_HPP_INCLUDED
5 
6 #include "export_symbols.hpp"
7 
9 
10 #include <algorithm>
11 #include <array>
12 #include <initializer_list>
13 #include <stdexcept>
14 #include <set>
15 #include <string>
16 #include <vector>
17 
18 namespace visr
19 {
20 namespace efl
21 {
22 template< typename ValueType > class BasicVector;
23 }
24 
25 namespace pml
26 {
27 
28 class VISR_PML_LIBRARY_SYMBOL ArrayConfiguration
29 {
30 public:
31  struct Speaker
32  {
33  public:
34  explicit Speaker( std::size_t pId, double pGainAdjustment, double pDelayAdjustment )
35  : id( pId ), gainAdjustment( pGainAdjustment ), delayAdjustment( pDelayAdjustment )
36  {}
37 
38  std::size_t id;
41  };
42 
44  {
45  bool operator()(Speaker const & lhs, Speaker const & rhs) const
46  {
47  return lhs.id < rhs.id;
48  }
49  };
50 
51  using ArrayType = std::set<Speaker, CompareSpeakers>;
52 
54 
56 
57  using SubwooferList = std::vector<std::size_t>;
58 
63  std::size_t numberOfOutputs() const { return mArray.size(); }
64 
65  std::size_t numberOfLoudspeakers() const { return mArray.size() - mSubwoofers.size(); }
66 
67  std::size_t numberOfSubwoofers() const { return mSubwoofers.size(); }
68 
69  SubwooferList const & subwooferIndices() const { return mSubwoofers; }
70 
74  void loadXml( std::string const & filePath );
75 
76 // std::size_t numberOfSpeakers() const { return mArray.size(); }
77 
78  template< typename ValueType >
79  void getGains( efl::BasicVector<ValueType> & gains ) const
80  {
81  if( gains.size() != numberOfOutputs() )
82  {
83  throw std::invalid_argument( "ArrayConfiguration::getGains(): Size of outputMatrix does not match the array size." );
84  }
85  std::size_t outIdx( 0 );
86  for( ArrayType::const_iterator arrayIt( mArray.begin() ); arrayIt != mArray.end(); ++arrayIt, ++outIdx )
87  {
88  gains[outIdx] = static_cast<ValueType>(arrayIt->gainAdjustment);
89  }
90  }
91 
92  template< typename ValueType >
93  void getDelays( efl::BasicVector<ValueType> & delays ) const
94  {
95  if( delays.size() != numberOfOutputs() )
96  {
97  throw std::invalid_argument( "ArrayConfiguration::getDelays(): Size of outputMatrix does not match the array size." );
98  }
99  std::size_t outIdx( 0 );
100  for( ArrayType::const_iterator arrayIt( mArray.begin() ); arrayIt != mArray.end(); ++arrayIt, ++outIdx )
101  {
102  delays[outIdx] = static_cast<ValueType>(arrayIt->delayAdjustment);
103  }
104  }
105 
106 private:
107  ArrayType mArray;
108 
109  SubwooferList mSubwoofers;
110 };
111 
112 } // namespace pml
113 } // namespace visr
114 
115 
116 #endif // VISR_PML_ARRAY_CONFIGURATION_HPP_INCLUDED
Speaker(std::size_t pId, double pGainAdjustment, double pDelayAdjustment)
Definition: array_configuration.hpp:34
bool operator()(Speaker const &lhs, Speaker const &rhs) const
Definition: array_configuration.hpp:45
std::vector< std::size_t > SubwooferList
Definition: array_configuration.hpp:57
void getDelays(efl::BasicVector< ValueType > &delays) const
Definition: array_configuration.hpp:93
double gainAdjustment
Definition: array_configuration.hpp:39
std::size_t numberOfOutputs() const
Definition: array_configuration.hpp:63
std::size_t numberOfSubwoofers() const
Definition: array_configuration.hpp:67
std::set< Speaker, CompareSpeakers > ArrayType
Definition: array_configuration.hpp:51
Definition: options.cpp:10
std::size_t size() const
Definition: basic_vector.hpp:179
void getGains(efl::BasicVector< ValueType > &gains) const
Definition: array_configuration.hpp:79
Definition: array_configuration.hpp:31
double delayAdjustment
Definition: array_configuration.hpp:40
Definition: array_configuration.hpp:28
Definition: basic_vector.hpp:28
SubwooferList const & subwooferIndices() const
Definition: array_configuration.hpp:69
std::size_t id
Definition: array_configuration.hpp:38
Definition: array_configuration.hpp:43
std::size_t numberOfLoudspeakers() const
Definition: array_configuration.hpp:65