AudioManager  7.5.11
Native Application Runtime Environment
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
CAmRouter.h
Go to the documentation of this file.
1 
25 #ifndef ROUTER_H_
26 #define ROUTER_H_
27 
28 #include <assert.h>
29 #include <vector>
30 #include <functional>
31 #include "audiomanagertypes.h"
32 #include "CAmGraph.h"
33 #include "IAmDatabaseHandler.h"
34 
35 
36 namespace am
37 {
38 #define ROUTING_BUILD_CONNECTIONS 1
39 
51 #if !defined(ROUTING_BUILD_CONNECTIONS)
52  #undef TRACE_GRAPH
53 #endif
54 
59 #if !defined(ROUTING_BUILD_CONNECTIONS)
60  #undef ROUTING_BUILD_CONNECTIONS
61 #endif
62 
63 #if defined(TRACE_GRAPH)
64 #if !defined(ROUTING_BUILD_CONNECTIONS)
65 #warning "You should define ROUTING_BUILD_CONNECTIONS in order to be able to see the connections in the trace."
66 #endif
67 #endif
68 
69 class CAmRouter;
70 
75 {
76  typedef enum:uint8_t {SINK, SOURCE, GATEWAY, CONVERTER} am_NodeDataType_e;
78  union
79  {
84  } data;
85 
87  {}
88 
89  bool operator==(const am_RoutingNodeData_s & anotherObject) const
90  {
91  bool result = false;
92  if(type==anotherObject.type)
93  {
94  result = true;
95  if(type==SINK)
96  result &= (data.sink->sinkID==anotherObject.data.sink->sinkID);
97  else if(type==SOURCE)
98  result &= (data.source->sourceID==anotherObject.data.source->sourceID);
99  else if(type==GATEWAY)
100  result &= (data.gateway->gatewayID==anotherObject.data.gateway->gatewayID);
101  else if(type==CONVERTER)
102  result &= (data.converter->converterID==anotherObject.data.converter->converterID);
103  }
104  return result;
105  };
106 
107 #ifdef TRACE_GRAPH
108  void trace() const
109  {
110  if(type==SINK)
111  std::cout << "[SINK:" << data.sink->sinkID << ":" << data.sink->name << "(" << data.sink->domainID << ")"
112  << "]";
113  else if(type==SOURCE)
114  std::cout << "[SOUR:" << data.source->sourceID << ":" << data.source->name << "(" << data.source->domainID << ")"
115  << "]";
116  else if(type==GATEWAY)
117  std::cout << "[GATE:" << data.gateway->gatewayID << ":" << data.gateway->name << "(" << data.gateway->controlDomainID << ")"
118  << "]";
119  else if(type==CONVERTER)
120  std::cout << "[CONV:" << data.converter->converterID << ":" << data.converter->name << "(" << data.converter->domainID << ")"
121  << "]";
122  };
123 #endif
124 
126  {
127  if(type==SINK)
128  return data.sink->domainID;
129  else if(type==SOURCE)
130  return data.source->domainID;
131  else if(type==GATEWAY)
132  return data.gateway->controlDomainID;
133  else if(type==CONVERTER)
134  return data.converter->domainID;
135  return 0;
136  };
137 };
138 
143 typedef std::list<CAmRoutingVertex> CAmRoutingListVertices;
144 typedef std::vector<CAmRoutingListVertices*> CAmRoutingVertexReferenceList;
145 
146 class CAmControlSender;
147 
148 
153 {
154  IAmDatabaseHandler* mpDatabaseHandler;
155  CAmControlSender* mpControlSender;
156  bool mOnlyFreeConversionNodes;
157  CAmRoutingGraph mRoutingGraph;
158  std::map<am_domainID_t,std::vector<CAmRoutingNode*>> mNodeListSources;
159  std::map<am_domainID_t,std::vector<CAmRoutingNode*>> mNodeListSinks;
160  std::map<am_domainID_t,std::vector<CAmRoutingNode*>> mNodeListGateways;
161  std::map<am_domainID_t,std::vector<CAmRoutingNode*>> mNodeListConverters;
162 
163  am_Error_e determineConnectionFormatsForPath(am_Route_s & routeObjects, std::vector<CAmRoutingNode*> & nodes);
164  am_Error_e doConnectionFormatsForPath(am_Route_s & routeObjects,
165  std::vector<CAmRoutingNode*> & route,
166  std::vector<am_RoutingElement_s>::iterator routingElementIterator,
167  std::vector<CAmRoutingNode*>::iterator routeIterator);
168 
169 
175  template <class Component> bool isComponentConnected(const Component & comp)
176  {
177  return mpDatabaseHandler->isComponentConnected(comp);
178  }
179  void generateAllPaths(const CAmRoutingNode & src,
180  const CAmRoutingNode & dst,
181  const bool includeCycles,
182  std::function<void(const std::vector<CAmRoutingNode*> & path)> cb);
183  void goThroughAllPaths(const CAmRoutingNode & dst,
184  std::vector<CAmRoutingNode*> & visited,
185  std::vector<am_domainID_t> & visitedDomains,
186  std::function<void(const std::vector<CAmRoutingNode*> & path)> cb);
187 
188 #ifdef ROUTING_BUILD_CONNECTIONS
189 
193  void constructConverterConnections();
194 
199  void constructGatewayConnections();
200 
205  void constructSourceSinkConnections();
206 #else
207 
210  void getVerticesForNode(const CAmRoutingNode & node, CAmRoutingListVertices & list);
211 
215  void getVerticesForSource(const CAmRoutingNode & node, CAmRoutingListVertices & list);
216 
220  void getVerticesForSink(const CAmRoutingNode & node, CAmRoutingListVertices & list);
221 
225  void getVerticesForConverter(const CAmRoutingNode & node, CAmRoutingListVertices & list);
226 
230  void getVerticesForGateway(const CAmRoutingNode & node, CAmRoutingListVertices & list);
231 #endif
232 
233 public:
234  CAmRouter(IAmDatabaseHandler* iDatabaseHandler, CAmControlSender* iSender);
235  ~CAmRouter();
236 
246  am_Error_e getRoute(const bool onlyfree, const am_sourceID_t sourceID, const am_sinkID_t sinkID, std::vector<am_Route_s>& returnList);
247  am_Error_e getRoute(const bool onlyfree, const am_Source_s & aSource, const am_Sink_s & aSink, std::vector<am_Route_s> & listRoutes);
248 
250  std::vector<am_Route_s> & resultPath, std::vector<std::vector<CAmRoutingNode*>> & resultNodesPath,
251 #if !defined(ROUTING_BUILD_CONNECTIONS)
252  __attribute__((unused))
253 #endif
254  const bool includeCycles = false);
255 #ifdef ROUTING_BUILD_CONNECTIONS
256  void getShortestPath(const CAmRoutingNode & source, const CAmRoutingNode & destination, std::vector<CAmRoutingNode*> & resultPath);
257  void getShortestPath(CAmRoutingNode & aSource, CAmRoutingNode & aSink, am_Route_s & resultPath, std::vector<CAmRoutingNode*> & resultNodesPath);
258 #endif
259 
260  static bool getAllowedFormatsFromConvMatrix( const std::vector<bool> & convertionMatrix,
261  const std::vector<am_CustomConnectionFormat_t> & listSourceFormats,
262  const std::vector<am_CustomConnectionFormat_t> & listSinkFormats,
263  std::vector<am_CustomConnectionFormat_t> & sourceFormats,
264  std::vector<am_CustomConnectionFormat_t> & sinkFormats);
265  static void listPossibleConnectionFormats(std::vector<am_CustomConnectionFormat_t> & inListSourceFormats,
266  std::vector<am_CustomConnectionFormat_t> & inListSinkFormats,
267  std::vector<am_CustomConnectionFormat_t> & outListFormats);
268  static bool getRestrictedOutputFormats(const std::vector<bool> & convertionMatrix,
269  const std::vector<am_CustomConnectionFormat_t> & listSourceFormats,
270  const std::vector<am_CustomConnectionFormat_t> & listSinkFormats,
271  const am_CustomConnectionFormat_t connectionFormat,
272  std::vector<am_CustomConnectionFormat_t> & listFormats);
273  static void getSourceSinkPossibleConnectionFormats(std::vector<CAmRoutingNode*>::iterator iteratorSource,
274  std::vector<CAmRoutingNode*>::iterator iteratorSink,
275  std::vector<am_CustomConnectionFormat_t> & outConnectionFormats);
276 
277  static bool shouldGoInDomain(const std::vector<am_domainID_t> & visitedDomains, const am_domainID_t nodeDomainID);
278 
286  CAmRoutingNode* sinkNodeWithID(const am_sinkID_t sinkID, const am_domainID_t domainID);
287 
295  CAmRoutingNode* sourceNodeWithID(const am_sourceID_t sourceID, const am_domainID_t domainID);
296 
304  CAmRoutingNode* converterNodeWithSinkID(const am_sinkID_t sinkID, const am_domainID_t domainID);
305 
313 
314  void load(const bool onlyFree);
315  void clear();
316 };
317 } /* namespace am */
318 #endif /* ROUTER_H_ */
319 
CAmRoutingNode * converterNodeWithSinkID(const am_sinkID_t sinkID, const am_domainID_t domainID)
Returns a converter node for given sinkID.
Definition: CAmRouter.cpp:248
CAmRoutingNode * sourceNodeWithID(const am_sourceID_t sourceID)
Returns a source node with given sourceID.
Definition: CAmRouter.cpp:224
std::vector< CAmRoutingListVertices * > CAmRoutingVertexReferenceList
Definition: CAmRouter.h:144
am_domainID_t domainID() const
Definition: CAmRouter.h:125
am_converterID_t converterID
This is the ID of the converter, it is unique in the system.
am_Error_e
the errors of the audiomanager.
This struct describes the attribiutes of a sink.
am_sinkID_t sinkID
This is the ID of the sink, it is unique in the system.
Implements an autorouting algorithm for connecting sinks and sources via different audio domains...
Definition: CAmRouter.h:152
am_NodeDataType_e type
data type:sink, source, gateway or converter
Definition: CAmRouter.h:77
virtual bool isComponentConnected(const am_Gateway_s &gateway) const =0
uint16_t am_CustomConnectionFormat_t
This type classifies the format in which data is exchanged within a connection.
union am::am_RoutingNodeData_s::@0 data
union pointer to sink, source, gateway or converter
static bool getRestrictedOutputFormats(const std::vector< bool > &convertionMatrix, const std::vector< am_CustomConnectionFormat_t > &listSourceFormats, const std::vector< am_CustomConnectionFormat_t > &listSinkFormats, const am_CustomConnectionFormat_t connectionFormat, std::vector< am_CustomConnectionFormat_t > &listFormats)
Definition: CAmRouter.cpp:837
am_Error_e getAllPaths(CAmRoutingNode &aSource, CAmRoutingNode &aSink, std::vector< am_Route_s > &resultPath, std::vector< std::vector< CAmRoutingNode * >> &resultNodesPath, const bool includeCycles=false)
Definition: CAmRouter.cpp:627
am_gatewayID_t gatewayID
This is the ID of the gateway, it is unique in the system.
am_Source_s * source
Definition: CAmRouter.h:80
CAmRoutingNode * sinkNodeWithID(const am_sinkID_t sinkID)
Returns a sink node with given sinkID.
Definition: CAmRouter.cpp:200
static void listPossibleConnectionFormats(std::vector< am_CustomConnectionFormat_t > &inListSourceFormats, std::vector< am_CustomConnectionFormat_t > &inListSinkFormats, std::vector< am_CustomConnectionFormat_t > &outListFormats)
Definition: CAmRouter.cpp:826
SPDX license identifier: MPL-2.0.
am_Gateway_s * gateway
Definition: CAmRouter.h:82
uint16_t am_sourceID_t
a source ID
CAmRouter(IAmDatabaseHandler *iDatabaseHandler, CAmControlSender *iSender)
Definition: CAmRouter.cpp:56
am_RoutingNodeData_s::am_NodeDataType_e CAmNodeDataType
Definition: CAmRouter.h:139
CAmGraph< am_RoutingNodeData_s, uint16_t > CAmRoutingGraph
Definition: CAmRouter.h:141
sends data to the commandInterface, takes the file of the library that needs to be loaded ...
static bool getAllowedFormatsFromConvMatrix(const std::vector< bool > &convertionMatrix, const std::vector< am_CustomConnectionFormat_t > &listSourceFormats, const std::vector< am_CustomConnectionFormat_t > &listSinkFormats, std::vector< am_CustomConnectionFormat_t > &sourceFormats, std::vector< am_CustomConnectionFormat_t > &sinkFormats)
Definition: CAmRouter.cpp:796
#define ROUTING_BUILD_CONNECTIONS
Definition: CAmRouter.h:38
This class handles and abstracts the database.
This struct describes the attributes of a converter.
CAmNode< am_RoutingNodeData_s > CAmRoutingNode
Definition: CAmRouter.h:140
a list of routing elements that lead from source to sink
CONVERTER am_NodeDataType_e
Definition: CAmRouter.h:76
am_sourceID_t sourceID
This is the ID of the source, it is unique in the system.
am_Converter_s * converter
Definition: CAmRouter.h:83
std::list< CAmRoutingVertex > CAmRoutingListVertices
Definition: CAmRouter.h:143
Copyright (C) 2012 - 2014, BMW AG.
SPDX license identifier: MPL-2.0.
This struct describes the attributes of a gateway.
CAmRoutingNode * gatewayNodeWithSinkID(const am_sinkID_t sinkID)
Returns a gateway node for given sinkID.
Definition: CAmRouter.cpp:260
uint16_t am_domainID_t
a domain ID
void getShortestPath(const CAmRoutingNode &source, const CAmRoutingNode &destination, std::vector< CAmRoutingNode * > &resultPath)
This struct describes the attribiutes of a source.
uint16_t am_sinkID_t
a sink ID
CAmVertex< am_RoutingNodeData_s, uint16_t > CAmRoutingVertex
Definition: CAmRouter.h:142
bool operator==(const am_RoutingNodeData_s &anotherObject) const
Definition: CAmRouter.h:89
static void getSourceSinkPossibleConnectionFormats(std::vector< CAmRoutingNode * >::iterator iteratorSource, std::vector< CAmRoutingNode * >::iterator iteratorSink, std::vector< am_CustomConnectionFormat_t > &outConnectionFormats)
Definition: CAmRouter.cpp:868
am_Error_e getRoute(const bool onlyfree, const am_sourceID_t sourceID, const am_sinkID_t sinkID, std::vector< am_Route_s > &returnList)
Finds all possible paths between given source and sink.
Definition: CAmRouter.cpp:82
static bool shouldGoInDomain(const std::vector< am_domainID_t > &visitedDomains, const am_domainID_t nodeDomainID)
Definition: CAmRouter.cpp:708
void load(const bool onlyFree)
Definition: CAmRouter.cpp:128
A structure used as user data in the graph nodes.
Definition: CAmRouter.h:74