summaryrefslogtreecommitdiff
path: root/audiomanagercomponentspage.html
blob: 2ec96ecde0f45776a52b0f848be54b05635e5414 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.6"/>
<title>AudioManager: AudioManager Components</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<script type="text/javascript">
  $(document).ready(initResizable);
  $(window).load(resizeHeight);
</script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/search.js"></script>
<script type="text/javascript">
  $(document).ready(function() { searchBox.OnSelectItem(0); });
</script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
 <tbody>
 <tr style="height: 56px;">
  <td style="padding-left: 0.5em;">
   <div id="projectname">AudioManager
   &#160;<span id="projectnumber">7.5.11</span>
   </div>
   <div id="projectbrief">Native Application Runtime Environment</div>
  </td>
 </tr>
 </tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.6 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
  <div id="navrow1" class="tabs">
    <ul class="tablist">
      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
      <li class="current"><a href="pages.html"><span>Related&#160;Pages</span></a></li>
      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
      <li><a href="annotated.html"><span>Classes</span></a></li>
      <li><a href="files.html"><span>Files</span></a></li>
      <li>
        <div id="MSearchBox" class="MSearchBoxInactive">
        <span class="left">
          <img id="MSearchSelect" src="search/mag_sel.png"
               onmouseover="return searchBox.OnSearchSelectShow()"
               onmouseout="return searchBox.OnSearchSelectHide()"
               alt=""/>
          <input type="text" id="MSearchField" value="Search" accesskey="S"
               onfocus="searchBox.OnSearchFieldFocus(true)" 
               onblur="searchBox.OnSearchFieldFocus(false)" 
               onkeyup="searchBox.OnSearchFieldChange(event)"/>
          </span><span class="right">
            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
          </span>
        </div>
      </li>
    </ul>
  </div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
  <div id="nav-tree">
    <div id="nav-tree-contents">
      <div id="nav-sync" class="sync"></div>
    </div>
  </div>
  <div id="splitbar" style="-moz-user-select:none;" 
       class="ui-resizable-handle">
  </div>
</div>
<script type="text/javascript">
$(document).ready(function(){initNavTree('audiomanagercomponentspage.html','');});
</script>
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
     onmouseover="return searchBox.OnSearchSelectShow()"
     onmouseout="return searchBox.OnSearchSelectHide()"
     onkeydown="return searchBox.OnSearchSelectKey(event)">
<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Typedefs</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(7)"><span class="SelectionMark">&#160;</span>Enumerations</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(8)"><span class="SelectionMark">&#160;</span>Enumerator</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(9)"><span class="SelectionMark">&#160;</span>Macros</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(10)"><span class="SelectionMark">&#160;</span>Pages</a></div>

<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0" 
        name="MSearchResults" id="MSearchResults">
</iframe>
</div>

<div class="header">
  <div class="headertitle">
<div class="title">AudioManager Components </div>  </div>
</div><!--header-->
<div class="contents">
<div class="textblock"><div class="image">
<img src="AudioManagement.png" alt="AudioManagement.png"/>
</div>
<p>The AudioManager is the central managing instance of the Audio architecture. It is designed as an OwnedComponent, this means that the software is maintained within GENIVI as open source component. The AudioManager consists of 4 central components.<br/>
</p>
<h1><a class="anchor" id="audiomanagercomponents"></a>
AudioManagerDaemon</h1>
<p>This component is owned and maintained by Genivi. It is the central audio framework component. There can be only one daemon in a system (singleton).<br/>
The AudioManagerDaemon is subject to this documentation. </p>
<h2><a class="anchor" id="daemonover"></a>
Daemon Overview</h2>
<p>Here is an class overview of the AudioManagerDaemon: </p>
<div class="image">
<img src="daemon_insight.png" alt="daemon_insight.png"/>
</div>
<h1><a class="anchor" id="commander"></a>
AudioManagerCommandPlugin</h1>
<p>This describes the interface towards the Commanding Instances of the AudioManagerDaemon. This is the HMI and interrupt sources that use this interface to start their interrupt and stop it again. The interface shall be asynchronous. Via this interface all user interactions are handled. This component is designed to be a dynamic linked library that will be loaded on the startup of the AudioManager. There can be more than one CommandPlugin at a time. Since the implementation of this component is project specific, only examples are included.<br/>
An example Dbus Implementation can be found in the folder PluginCommandInterfaceDbus.</p>
<h2><a class="anchor" id="commandIface"></a>
Interfaces</h2>
<p>All commands that must be fulfilled by an AudioManagerCommandPlugin are described in <a class="el" href="classam_1_1IAmCommandSend.html" title="This interface handles all communication from the AudioManagerDaemon towards the system. ">am::IAmCommandSend</a>.<br/>
All commands that are presented to AudioManagerCommandPlugin by the AudioManagerDaemon are described in <a class="el" href="classam_1_1IAmCommandReceive.html" title="The interface towards the Controlling Instance (e.g HMI). ">am::IAmCommandReceive</a>.<br/>
 </p>
<h1><a class="anchor" id="controller"></a>
AudioManagerController</h1>
<p>The controller is the intelligent "heart" of the AudioManager and it is project specific. In principle, the controller gets commands from the command interface or events from outside and reacts to them. For this purpose, some basic commands are in the "toolbox" of the Controller that he can use to interact with the rest of the system.<br/>
Among this there are commands to read/write the database and to perform actions on the Audiodomains like connect or disconnect. There must be only one Controller in the system at a time, like the AudioManagerCommandPlugins, the Controller is loaded at startup by the daemon<br/>
A simple example Implementation can be found in the folder PluginControlInterface.</p>
<h2><a class="anchor" id="controlIface"></a>
Interfaces</h2>
<p>All commands that must be fulfilled by an AudioManagerController are described in <a class="el" href="classam_1_1IAmControlSend.html" title="This interface is presented by the AudioManager controller. ">am::IAmControlSend</a>.<br/>
All commands that are presented to AudioManagerController by the AudioManagerDaemon are described in <a class="el" href="classam_1_1IAmControlReceive.html" title="This interface gives access to all important functions of the audiomanager that are used by the Audio...">am::IAmControlReceive</a>.<br/>
 </p>
<h1><a class="anchor" id="router"></a>
Routing AudioManagerRoutingPlugin</h1>
<p>The AudioManagerRoutingPlugins are used to abstract the actual Hard- and Software that does the routing. There can be more than one plugins at a time, they are loaded at startup time like the commandplugins. <br/>
The AudioManager expects a bus-like structure behind each plug-in, so that a plug-in can implement a bus interface and proxy the messages to the routing adapters - the AudioManager is capable of addressing more than one adapter one each plug-in. The AudioManagerController does not have to know anything about the real system plugins - he sends his commands to sources and sinks. The daemon does the dispatching of these commands. The interface is mainly asynchronous.\ Sample plugins can be found in the directory, for example PluginRoutingInterfaceAsync.<br/>
 </p>
<h2><a class="anchor" id="routingIface"></a>
Interfaces</h2>
<p>All commands that must be fulfilled by an AudioManagerRoutingPlugin are described in <a class="el" href="classam_1_1IAmRoutingSend.html" title="This class implements everything from Audiomanager -&gt; RoutingAdapter There are two rules that have to...">am::IAmRoutingSend</a>.<br/>
All commands that are presented to AudioManagerRoutingPlugins by the AudioManagerDaemon are described in <a class="el" href="classam_1_1IAmRoutingReceive.html" title="Routing Receive sendInterface description. ">am::IAmRoutingReceive</a>.<br/>
 </p>
<h2><a class="anchor" id="subrouter"></a>
Bus topology</h2>
<p>The AudioManagerDaemon expects a bus behind each of the plugins. On one of these buses there can be several domains. In order to reflect this, a domain has always a bus(plugin) and a node that it belongs to. So if a message needs to be transmitted to a domain, it will always be sent to a node on a bus. Here is a diagram showing the topology from the view of the AudioManagerDaemon: </p>
<div class="image">
<img src="bus_topology.png" alt="bus_topology.png"/>
</div>
 <h2><a class="anchor" id="busname"></a>
Busname</h2>
<p>Since a plugin represents a bus for the AudioManagerDaemon, each plugin it has its unique name, the busname that is returned by <a class="el" href="classam_1_1IAmRoutingSend.html#ad4761b14565a6dd9ea24fa21cafdf540" title="this method is used to retrieve the busname during startup of the plugin. ">am::IAmRoutingSend::returnBusName</a>. The AudioManagerDaemon used this information to link a plugin with a domain. All other elements like sinks, sources etc are linked to domains. This is how the hierarchy looks like that is used: </p>
<div class="image">
<img src="routing_hierarchy.png" alt="routing_hierarchy.png"/>
</div>
<h2><a class="anchor" id="CAPIplugins"></a>
CommonAPI plugins</h2>
<p>As "sample code" with MIT license, PluginCommandInterfaceCAPI and PluginRoutingInterfaceCAPI are provided with the source code. The FRANCA fidls have been generated out of the Enterprise architect model, so they might be used to draw project specific behavior in sequences. The sources in src-gen have been generated out of the provided fidl files.</p>
<div class="image">
<img src="PluginCommandInterfaceCAPI.png" alt="PluginCommandInterfaceCAPI.png"/>
</div>
<div class="image">
<img src="PluginRoutingInterfaceCAPI.png" alt="PluginRoutingInterfaceCAPI.png"/>
</div>
<p>There is no fixed domain associated with this plugin. So you have to implement the interface org::genivi::am::RoutingControlStub and report busname and path to the routingplugin on the interface org::genivi::am::RoutingControlObserverStub like this:</p>
<div class="image">
<img src="Register_Domain.png" alt="Register_Domain.png"/>
</div>
 </div></div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
  <ul>
    <li class="footer">Generated on Fri Sep 30 2016 14:27:22 for AudioManager by
    <a href="http://www.doxygen.org/index.html">
    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.6 </li>
  </ul>
</div>
</body>
</html>