blob: 4167acc74a4b17cb6cbe1c285eb5f1c95405ade3 [file] [log] [blame]
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://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.15"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>Oboe: oboe::LatencyTuner Class Reference</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="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>
<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">Oboe
&#160;<span id="projectnumber">1.5</span>
</div>
<div id="projectbrief">A library for creating real-time audio apps on Android</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.15 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
var searchBox = new SearchBox("searchBox", "search",false,'Search');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
/* @license-end */</script>
<div id="main-nav"></div>
<!-- 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 id="nav-path" class="navpath">
<ul>
<li class="navelem"><a class="el" href="namespaceoboe.html">oboe</a></li><li class="navelem"><a class="el" href="classoboe_1_1_latency_tuner.html">LatencyTuner</a></li> </ul>
</div>
</div><!-- top -->
<div class="header">
<div class="summary">
<a href="#pub-methods">Public Member Functions</a> &#124;
<a href="classoboe_1_1_latency_tuner-members.html">List of all members</a> </div>
<div class="headertitle">
<div class="title">oboe::LatencyTuner Class Reference</div> </div>
</div><!--header-->
<div class="contents">
<p><code>#include &lt;<a class="el" href="_latency_tuner_8h_source.html">LatencyTuner.h</a>&gt;</code></p>
<table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
Public Member Functions</h2></td></tr>
<tr class="memitem:a0263b9a55825c0a403653b2b508073ea"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classoboe_1_1_latency_tuner.html#a0263b9a55825c0a403653b2b508073ea">LatencyTuner</a> (<a class="el" href="classoboe_1_1_audio_stream.html">AudioStream</a> &amp;stream)</td></tr>
<tr class="separator:a0263b9a55825c0a403653b2b508073ea"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ab437bd10605af9e5733d043f8adc0b43"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classoboe_1_1_latency_tuner.html#ab437bd10605af9e5733d043f8adc0b43">LatencyTuner</a> (<a class="el" href="classoboe_1_1_audio_stream.html">AudioStream</a> &amp;stream, int32_t maximumBufferSize)</td></tr>
<tr class="separator:ab437bd10605af9e5733d043f8adc0b43"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ad2be756965e6a9af3114008eda892174"><td class="memItemLeft" align="right" valign="top"><a class="el" href="namespaceoboe.html#a486512e787b609c80ba4436f23929af1">Result</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classoboe_1_1_latency_tuner.html#ad2be756965e6a9af3114008eda892174">tune</a> ()</td></tr>
<tr class="separator:ad2be756965e6a9af3114008eda892174"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a6c0142e08dc65eda8f758b4794450867"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classoboe_1_1_latency_tuner.html#a6c0142e08dc65eda8f758b4794450867">requestReset</a> ()</td></tr>
<tr class="separator:a6c0142e08dc65eda8f758b4794450867"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a45c013fd6787ad09d328385d6314c4d4"><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classoboe_1_1_latency_tuner.html#a45c013fd6787ad09d328385d6314c4d4">isAtMaximumBufferSize</a> ()</td></tr>
<tr class="separator:a45c013fd6787ad09d328385d6314c4d4"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:adc96aa53b18a051b6ccdacb838139bf8"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classoboe_1_1_latency_tuner.html#adc96aa53b18a051b6ccdacb838139bf8">setMinimumBufferSize</a> (int32_t bufferSize)</td></tr>
<tr class="separator:adc96aa53b18a051b6ccdacb838139bf8"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:aaba4b3f075ed8d7c7ad4cad392545c08"><td class="memItemLeft" align="right" valign="top"><a id="aaba4b3f075ed8d7c7ad4cad392545c08"></a>
int32_t&#160;</td><td class="memItemRight" valign="bottom"><b>getMinimumBufferSize</b> () const</td></tr>
<tr class="separator:aaba4b3f075ed8d7c7ad4cad392545c08"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a2684b30205126c8acd2f75d01cce05db"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classoboe_1_1_latency_tuner.html#a2684b30205126c8acd2f75d01cce05db">setBufferSizeIncrement</a> (int32_t sizeIncrement)</td></tr>
<tr class="separator:a2684b30205126c8acd2f75d01cce05db"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a5ea6114ac4f78f3e050d405168905123"><td class="memItemLeft" align="right" valign="top"><a id="a5ea6114ac4f78f3e050d405168905123"></a>
int32_t&#160;</td><td class="memItemRight" valign="bottom"><b>getBufferSizeIncrement</b> () const</td></tr>
<tr class="separator:a5ea6114ac4f78f3e050d405168905123"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
<div class="textblock"><p><a class="el" href="classoboe_1_1_latency_tuner.html">LatencyTuner</a> can be used to dynamically tune the latency of an output stream. It adjusts the stream's bufferSize by monitoring the number of underruns.</p>
<p>This only affects the latency associated with the first level of buffering that is closest to the application. It does not affect low latency in the HAL, or touch latency in the UI.</p>
<p>Call <a class="el" href="classoboe_1_1_latency_tuner.html#ad2be756965e6a9af3114008eda892174">tune()</a> right before returning from your data callback function if using callbacks. Call <a class="el" href="classoboe_1_1_latency_tuner.html#ad2be756965e6a9af3114008eda892174">tune()</a> right before calling write() if using blocking writes.</p>
<p>If you want to see the ongoing results of this tuning process then call stream-&gt;getBufferSize() periodically. </p>
</div><h2 class="groupheader">Constructor &amp; Destructor Documentation</h2>
<a id="a0263b9a55825c0a403653b2b508073ea"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a0263b9a55825c0a403653b2b508073ea">&#9670;&nbsp;</a></span>LatencyTuner() <span class="overload">[1/2]</span></h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">oboe::LatencyTuner::LatencyTuner </td>
<td>(</td>
<td class="paramtype"><a class="el" href="classoboe_1_1_audio_stream.html">AudioStream</a> &amp;&#160;</td>
<td class="paramname"><em>stream</em></td><td>)</td>
<td></td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">explicit</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p>Construct a new <a class="el" href="classoboe_1_1_latency_tuner.html">LatencyTuner</a> object which will act on the given audio stream</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">stream</td><td>the stream who's latency will be tuned </td></tr>
</table>
</dd>
</dl>
</div>
</div>
<a id="ab437bd10605af9e5733d043f8adc0b43"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ab437bd10605af9e5733d043f8adc0b43">&#9670;&nbsp;</a></span>LatencyTuner() <span class="overload">[2/2]</span></h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">oboe::LatencyTuner::LatencyTuner </td>
<td>(</td>
<td class="paramtype"><a class="el" href="classoboe_1_1_audio_stream.html">AudioStream</a> &amp;&#160;</td>
<td class="paramname"><em>stream</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int32_t&#160;</td>
<td class="paramname"><em>maximumBufferSize</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">explicit</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p>Construct a new <a class="el" href="classoboe_1_1_latency_tuner.html">LatencyTuner</a> object which will act on the given audio stream.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">stream</td><td>the stream who's latency will be tuned </td></tr>
<tr><td class="paramname">the</td><td>maximum buffer size which the <a class="el" href="classoboe_1_1_latency_tuner.html#ad2be756965e6a9af3114008eda892174">tune()</a> operation will set the buffer size to </td></tr>
</table>
</dd>
</dl>
</div>
</div>
<h2 class="groupheader">Member Function Documentation</h2>
<a id="a45c013fd6787ad09d328385d6314c4d4"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a45c013fd6787ad09d328385d6314c4d4">&#9670;&nbsp;</a></span>isAtMaximumBufferSize()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">bool oboe::LatencyTuner::isAtMaximumBufferSize </td>
<td>(</td>
<td class="paramname"></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<dl class="section return"><dt>Returns</dt><dd>true if the audio stream's buffer size is at the maximum value. If no maximum value was specified when constructing the <a class="el" href="classoboe_1_1_latency_tuner.html">LatencyTuner</a> then the value of stream-&gt;getBufferCapacityInFrames is used </dd></dl>
</div>
</div>
<a id="a6c0142e08dc65eda8f758b4794450867"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a6c0142e08dc65eda8f758b4794450867">&#9670;&nbsp;</a></span>requestReset()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void oboe::LatencyTuner::requestReset </td>
<td>(</td>
<td class="paramname"></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p>This may be called from another thread. Then <a class="el" href="classoboe_1_1_latency_tuner.html#ad2be756965e6a9af3114008eda892174">tune()</a> will call reset(), which will lower the latency to the minimum and then allow it to rise back up if there are glitches.</p>
<p>This is typically called in response to a user decision to minimize latency. In other words, call this from a button handler. </p>
</div>
</div>
<a id="a2684b30205126c8acd2f75d01cce05db"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a2684b30205126c8acd2f75d01cce05db">&#9670;&nbsp;</a></span>setBufferSizeIncrement()</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">void oboe::LatencyTuner::setBufferSizeIncrement </td>
<td>(</td>
<td class="paramtype">int32_t&#160;</td>
<td class="paramname"><em>sizeIncrement</em></td><td>)</td>
<td></td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">inline</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p>Set the amount the bufferSize will be incremented while tuning. By default, this will be one burst.</p>
<p>Note that AAudio will quantize the buffer size to a multiple of the burstSize. So the final buffer sizes may not be a multiple of this increment.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">sizeIncrement</td><td></td></tr>
</table>
</dd>
</dl>
</div>
</div>
<a id="adc96aa53b18a051b6ccdacb838139bf8"></a>
<h2 class="memtitle"><span class="permalink"><a href="#adc96aa53b18a051b6ccdacb838139bf8">&#9670;&nbsp;</a></span>setMinimumBufferSize()</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">void oboe::LatencyTuner::setMinimumBufferSize </td>
<td>(</td>
<td class="paramtype">int32_t&#160;</td>
<td class="paramname"><em>bufferSize</em></td><td>)</td>
<td></td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">inline</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p>Set the minimum bufferSize in frames that is used when the tuner is reset. You may wish to call <a class="el" href="classoboe_1_1_latency_tuner.html#a6c0142e08dc65eda8f758b4794450867">requestReset()</a> after calling this. </p><dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">bufferSize</td><td></td></tr>
</table>
</dd>
</dl>
</div>
</div>
<a id="ad2be756965e6a9af3114008eda892174"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ad2be756965e6a9af3114008eda892174">&#9670;&nbsp;</a></span>tune()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="namespaceoboe.html#a486512e787b609c80ba4436f23929af1">Result</a> oboe::LatencyTuner::tune </td>
<td>(</td>
<td class="paramname"></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Adjust the bufferSizeInFrames to optimize latency. It will start with a low latency and then raise it if an underrun occurs.</p>
<p>Latency tuning is only supported for AAudio.</p>
<dl class="section return"><dt>Returns</dt><dd>OK or negative error, ErrorUnimplemented for OpenSL ES </dd></dl>
</div>
</div>
<hr/>The documentation for this class was generated from the following file:<ul>
<li>include/oboe/<a class="el" href="_latency_tuner_8h_source.html">LatencyTuner.h</a></li>
</ul>
</div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.8.15
</small></address>
</body>
</html>