summaryrefslogtreecommitdiff
path: root/docs/mainl.html
blob: f11e1f6bd697c0b64cde83ba6af52c76d8b7dac4 (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
<!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.11"/>
<title>AudioManager: Mainloop concept</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="navtreedata.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/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<script type="text/javascript">
  $(document).ready(function() { init_search(); });
</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 id="projectalign" style="padding-left: 0.5em;">
   <div id="projectname">AudioManager
   &#160;<span id="projectnumber">7.6.6</span>
   </div>
   <div id="projectbrief">Native Application Runtime Environment</div>
  </td>
 </tr>
 </tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.11 -->
<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="modules.html"><span>Modules</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('mainl.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)">
</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">Mainloop concept </div>  </div>
</div><!--header-->
<div class="contents">
<div class="textblock"><h1><a class="anchor" id="mconcept"></a>
Mainloop</h1>
<p>The AudioManager comes with a build in mainloop that can be utilized by the plug-ins to serve their needs of communication and thread-safe calling. The mainloop, implemented in CAmSocketHandler works like this:<br />
</p><div class="image">
<img src="Mainloop.png" alt="Mainloop.png"/>
</div>
<h1><a class="anchor" id="sec"></a>
Using the Mainloop</h1>
<p>Adding and removing callbacks and timers work via the <a class="el" href="classam_1_1CAmSocketHandler.html" title="The am::CAmSocketHandler implements a mainloop for the AudioManager. ">am::CAmSocketHandler</a>.<br />
To add a callback, use <a class="el" href="classam_1_1CAmSocketHandler.html#a8ee49d4fbc44291bc6b99fa49fc0350a" title="Adds a filedescriptor to the polling loop. ">am::CAmSocketHandler::addFDPoll</a>, to remove one, use <a class="el" href="classam_1_1CAmSocketHandler.html#a57c40a25d4bff6f88ed4ce5e597a5712" title="removes a filedescriptor from the poll loop ">am::CAmSocketHandler::removeFDPoll</a>.<br />
To add a timer callback, use <a class="el" href="classam_1_1CAmSocketHandler.html#afe4e4806d91f9a4b3b1eb8a278f64cc9">am::CAmSocketHandler::addTimer</a>, use <a class="el" href="classam_1_1CAmSocketHandler.html#a7627416d3b2fd93baa84599b52691bec" title="removes a timer from the list of timers ">am::CAmSocketHandler::removeTimer</a> and <a class="el" href="classam_1_1CAmSocketHandler.html#a34f5a3d01d54f25eae224d5ca84f5a2a" title="restarts a timer with the original value ">am::CAmSocketHandler::restartTimer</a> and <a class="el" href="classam_1_1CAmSocketHandler.html#af3b4d566129e9d9dc9dae13d5a51afdf" title="stops a timer ">am::CAmSocketHandler::stopTimer</a>.<br />
The mainloop is started via <a class="el" href="classam_1_1CAmSocketHandler.html#ac4d61b623aedd44ea1fd075aee7851b1" title="start the block listening for filedescriptors. ">am::CAmSocketHandler::start_listenting</a> and stopped via <a class="el" href="classam_1_1CAmSocketHandler.html#ade03cab4d0ee59386c13688949ec942a" title="exits the loop ">am::CAmSocketHandler::stop_listening</a>. Example code can be found in <a class="el" href="classam_1_1CAmDbusWrapper.html" title="This wraps dbus and provides everything needed to anyone who wants to use dbus (including plugins)...">am::CAmDbusWrapper</a>.</p>
<h1><a class="anchor" id="util"></a>
Utilizing The Mainloop as Threadsafe Call Method</h1>
<p>The AudioManager itself is singlethreaded, so any calls from other threads inside the plugins directly to the interfaces is forbidden, the behavior is undefined. The reason for this is that communication and routing plugins are often only communication interfaces that can are ideally used with the <a class="el" href="classam_1_1CAmSocketHandler.html" title="The am::CAmSocketHandler implements a mainloop for the AudioManager. ">am::CAmSocketHandler</a>.<br />
am::CAmSerializer creates an intermediate object on the heap holding all informations of the function to be called and a pointer to the object to be called. After that, the class writes to a pipe witch triggers the mainloop to call the callback am::CAmSerializer::receiverCallback from the maincontext. The callback uses the intermediate object to do the actual call. <br />
</p><dl class="section warning"><dt>Warning</dt><dd>asynchronous calls can be used within the main thread, but synchronous not -&gt; the call would block forever !<br />
For each thread that needs to use synchronous calls independent an own instance of am::CAmSerializer needs to be used. </dd></dl>
<h2><a class="anchor" id="async"></a>
Asynchronous calls</h2>
<div class="image">
<img src="Deferred_Call_async.png" alt="Deferred_Call_async.png"/>
</div>
 <h2><a class="anchor" id="sync"></a>
Synchronous calls</h2>
<div class="image">
<img src="Deferred_Call_sync.png" alt="Deferred_Call_sync.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 Feb 9 2018 14:50:30 for AudioManager by
    <a href="http://www.doxygen.org/index.html">
    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.11 </li>
  </ul>
</div>
</body>
</html>