VISR  0.11.1
Versatile Interactive Scene Renderer
audio_signal_flow.hpp
Go to the documentation of this file.
1 /* Copyright Institute of Sound and Vibration Research - All rights reserved */
2 
3 #ifndef VISR_LIBRRL_AUDIO_SIGNAL_FLOW_HPP_INCLUDED
4 #define VISR_LIBRRL_AUDIO_SIGNAL_FLOW_HPP_INCLUDED
5 
6 #include "export_symbols.hpp"
7 
10 #include <libvisr/constants.hpp>
12 
13 #include <iosfwd>
14 #include <map>
15 #include <memory>
16 #include <set>
17 #include <stdexcept>
18 #include <vector>
19 
20 namespace visr
21 {
22 // Forward declarations
23 class AtomicComponent;
24 class ParameterPortBase;
25 
26 namespace impl
27 {
28 class ComponentImplementation;
29 class CompositeComponentImplementation;
30 }
31 
32 namespace rrl
33 {
34 
35 // Forward declarations
36 class AudioSignalPool;
37 class AudioConnectionMap;
38 class ParameterConnectionMap;
39 
49 class VISR_RRL_LIBRARY_SYMBOL AudioSignalFlow
50 {
51 public:
52  using SignalIndexType = std::size_t; // TODO: Check whether to introduce a consistently used type alias for indices
53 
58  explicit AudioSignalFlow( Component & flow );
59 
63  ~AudioSignalFlow();
64 
71  bool process( SampleType const * const * captureSamples,
72  SampleType * const * playbackSamples );
73 
86  void process( SampleType const * captureSamples,
87  std::size_t captureChannelStride,
88  std::size_t captureSampleStride,
89  SampleType * playbackSamples,
90  std::size_t playbackChannelStride,
91  std::size_t playbackSampleStride );
92 
113  static void processFunction( void* userData,
114  SampleType const * const * captureSamples,
115  SampleType * const * playbackSamples,
116  bool & status );
117 
122 
127  std::size_t period() const;
128 
129  std::size_t numberOfAudioCapturePorts( ) const;
130 
131  std::size_t numberOfAudioPlaybackPorts( ) const;
132 
137  char const * audioCapturePortName( std::size_t idx ) const;
138 
143  char const * audioPlaybackPortName( std::size_t idx ) const;
144 
149  std::size_t numberOfCaptureChannels() const;
150 
155  std::size_t numberOfPlaybackChannels() const;
157 
162 
163  using ProtocolReceiveEndpoints = std::map<std::string, std::unique_ptr<CommunicationProtocolBase::Output> >;
164  using ProtocolSendEndpoints = std::map<std::string, std::unique_ptr<CommunicationProtocolBase::Input> >;
165 
167  {
168  return mProtocolReceiveEndpoints.size();
169  }
170 
172  {
173  return mProtocolSendEndpoints.size();
174  }
175 
177  {
178  return mProtocolReceiveEndpoints;
179  }
180 
182  {
183  return mProtocolSendEndpoints;
184  }
185 
190  CommunicationProtocolBase::Output & externalParameterReceivePort( char const * portName );
191 
196  CommunicationProtocolBase::Input & externalParameterSendPort( char const * portName );
197 
199 
200 private:
209  bool initialiseAudioConnections( std::ostream & messages, AudioConnectionMap const & originalConnections, AudioConnectionMap & finalConnections);
210 
219  bool initialiseParameterInfrastructure( std::ostream & messages, ParameterConnectionMap const & originalConnections, ParameterConnectionMap & finalConnections );
220 
229  bool initialiseSchedule( std::ostream & messages,
230  AudioConnectionMap const & audioConnections,
231  ParameterConnectionMap const & parameterConnections );
236  std::size_t numberCommunicationProtocols() const;
237 
241  void executeComponents( );
242 
248 
253 
254  using CommunicationProtocolContainer = std::vector<std::unique_ptr<CommunicationProtocolBase> >;
255 
256  CommunicationProtocolContainer mCommunicationProtocols;
258 
263 
264  std::vector<impl::AudioPortBaseImplementation *> mToplevelInputs;
265 
266  std::vector<impl::AudioPortBaseImplementation *> mToplevelOutputs;
268 
272  std::unique_ptr<AudioSignalPool> mAudioSignalPool;
273 
280  std::vector < impl::AudioPortBaseImplementation*> mTopLevelAudioInputs;
281  std::vector < impl::AudioPortBaseImplementation*> mTopLevelAudioOutputs;
283 
284  std::vector<char*> mCaptureChannels;
285  std::vector<char*> mPlaybackChannels;
286 
291  ProtocolReceiveEndpoints mProtocolReceiveEndpoints;
292 
293  ProtocolSendEndpoints mProtocolSendEndpoints;
294 
296 
297  using InternalComponentList = std::vector<std::unique_ptr<AtomicComponent> >;
298 
299  InternalComponentList mInfrastructureComponents;
300 
301  using ProcessingSchedule = std::vector<AtomicComponent * >;
302 
303  ProcessingSchedule mProcessingSchedule;
304 };
305 
306 } // namespace rrl
307 } // namespace visr
308 
309 #endif // #ifndef VISR_LIBRRL_AUDIO_SIGNAL_FLOW_HPP_INCLUDED
std::size_t numberExternalParameterSendPorts() const
Definition: audio_signal_flow.hpp:171
Definition: communication_protocol_base.hpp:94
std::size_t SignalIndexType
Definition: audio_signal_flow.hpp:52
std::map< std::string, std::unique_ptr< CommunicationProtocolBase::Input > > ProtocolSendEndpoints
Definition: audio_signal_flow.hpp:164
Definition: audio_signal_flow.hpp:49
Definition: component_implementation.hpp:34
ProtocolReceiveEndpoints const & externalParameterReceiveEndpoints() const
Definition: audio_signal_flow.hpp:176
Definition: component.hpp:38
Definition: options.cpp:10
Definition: audio_connection_map.hpp:64
ProtocolSendEndpoints const & externalParameterSendEndpoints() const
Definition: audio_signal_flow.hpp:181
Definition: parameter_connection_map.hpp:28
std::size_t numberExternalParameterReceivePorts() const
Definition: audio_signal_flow.hpp:166
float SampleType
Definition: constants.hpp:14
std::map< std::string, std::unique_ptr< CommunicationProtocolBase::Output > > ProtocolReceiveEndpoints
Definition: audio_signal_flow.hpp:163
Definition: communication_protocol_base.hpp:131