Sophie

Sophie

distrib > Fedora > 14 > x86_64 > media > updates > by-pkgid > 0b420d0fce195cf4115dc6a3be5c2da2 > files > 90

sphinxbase-devel-0.7-1.fc14.i686.rpm

<!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"/>
<title>SphinxBase: src/libsphinxad/cont_ad_base.c Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript">
$(document).ready(initResizable);
</script>
<link href="doxygen.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<!-- Generated by Doxygen 1.7.3 -->
<div id="top">
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
 <tbody>
 <tr style="height: 56px;">
  <td style="padding-left: 0.5em;">
   <div id="projectname">SphinxBase&#160;<span id="projectnumber">0.6</span></div>
  </td>
 </tr>
 </tbody>
</table>
</div>
  <div id="navrow1" class="tabs">
    <ul class="tablist">
      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
      <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
      <li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
      <li class="current"><a href="files.html"><span>Files</span></a></li>
    </ul>
  </div>
  <div id="navrow2" class="tabs2">
    <ul class="tablist">
      <li><a href="files.html"><span>File&#160;List</span></a></li>
      <li><a href="globals.html"><span>Globals</span></a></li>
    </ul>
  </div>
</div>
<div id="side-nav" class="ui-resizable side-nav-resizable">
  <div id="nav-tree">
    <div id="nav-tree-contents">
    </div>
  </div>
  <div id="splitbar" style="-moz-user-select:none;" 
       class="ui-resizable-handle">
  </div>
</div>
<script type="text/javascript">
  initNavTree('cont__ad__base_8c.html','');
</script>
<div id="doc-content">
<div class="header">
  <div class="headertitle">
<h1>src/libsphinxad/cont_ad_base.c</h1>  </div>
</div>
<div class="contents">
<div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */</span>
<a name="l00002"></a>00002 <span class="comment">/* ====================================================================</span>
<a name="l00003"></a>00003 <span class="comment"> * Copyright (c) 1999-2001 Carnegie Mellon University.  All rights</span>
<a name="l00004"></a>00004 <span class="comment"> * reserved.</span>
<a name="l00005"></a>00005 <span class="comment"> *</span>
<a name="l00006"></a>00006 <span class="comment"> * Redistribution and use in source and binary forms, with or without</span>
<a name="l00007"></a>00007 <span class="comment"> * modification, are permitted provided that the following conditions</span>
<a name="l00008"></a>00008 <span class="comment"> * are met:</span>
<a name="l00009"></a>00009 <span class="comment"> *</span>
<a name="l00010"></a>00010 <span class="comment"> * 1. Redistributions of source code must retain the above copyright</span>
<a name="l00011"></a>00011 <span class="comment"> *    notice, this list of conditions and the following disclaimer. </span>
<a name="l00012"></a>00012 <span class="comment"> *</span>
<a name="l00013"></a>00013 <span class="comment"> * 2. Redistributions in binary form must reproduce the above copyright</span>
<a name="l00014"></a>00014 <span class="comment"> *    notice, this list of conditions and the following disclaimer in</span>
<a name="l00015"></a>00015 <span class="comment"> *    the documentation and/or other materials provided with the</span>
<a name="l00016"></a>00016 <span class="comment"> *    distribution.</span>
<a name="l00017"></a>00017 <span class="comment"> *</span>
<a name="l00018"></a>00018 <span class="comment"> * This work was supported in part by funding from the Defense Advanced </span>
<a name="l00019"></a>00019 <span class="comment"> * Research Projects Agency and the National Science Foundation of the </span>
<a name="l00020"></a>00020 <span class="comment"> * United States of America, and the CMU Sphinx Speech Consortium.</span>
<a name="l00021"></a>00021 <span class="comment"> *</span>
<a name="l00022"></a>00022 <span class="comment"> * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS&#39;&#39; AND </span>
<a name="l00023"></a>00023 <span class="comment"> * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, </span>
<a name="l00024"></a>00024 <span class="comment"> * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR</span>
<a name="l00025"></a>00025 <span class="comment"> * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY</span>
<a name="l00026"></a>00026 <span class="comment"> * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,</span>
<a name="l00027"></a>00027 <span class="comment"> * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT </span>
<a name="l00028"></a>00028 <span class="comment"> * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, </span>
<a name="l00029"></a>00029 <span class="comment"> * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY </span>
<a name="l00030"></a>00030 <span class="comment"> * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT </span>
<a name="l00031"></a>00031 <span class="comment"> * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE </span>
<a name="l00032"></a>00032 <span class="comment"> * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</span>
<a name="l00033"></a>00033 <span class="comment"> *</span>
<a name="l00034"></a>00034 <span class="comment"> * ====================================================================</span>
<a name="l00035"></a>00035 <span class="comment"> *</span>
<a name="l00036"></a>00036 <span class="comment"> */</span>
<a name="l00037"></a>00037 <span class="comment">/*</span>
<a name="l00038"></a>00038 <span class="comment"> * cont_ad.c -- Continuous A/D listening and silence filtering module.</span>
<a name="l00039"></a>00039 <span class="comment"> * </span>
<a name="l00040"></a>00040 <span class="comment"> * HISTORY</span>
<a name="l00041"></a>00041 <span class="comment"> * </span>
<a name="l00042"></a>00042 <span class="comment"> * $Log: cont_ad_base.c,v $</span>
<a name="l00043"></a>00043 <span class="comment"> * Revision 1.14  2005/07/02 03:51:32  rkm</span>
<a name="l00044"></a>00044 <span class="comment"> * Slowed down power histogram decay rate</span>
<a name="l00045"></a>00045 <span class="comment"> *</span>
<a name="l00046"></a>00046 <span class="comment"> * Revision 1.13  2005/06/30 00:27:17  rkm</span>
<a name="l00047"></a>00047 <span class="comment"> * Fixed silence handling in rawmode; added extra state variables</span>
<a name="l00048"></a>00048 <span class="comment"> *</span>
<a name="l00049"></a>00049 <span class="comment"> * </span>
<a name="l00050"></a>00050 <span class="comment"> * 28-Jun-2005  M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University.</span>
<a name="l00051"></a>00051 <span class="comment"> *              - Changed rawmode handling to simply copy data even for silence</span>
<a name="l00052"></a>00052 <span class="comment"> *              segments.</span>
<a name="l00053"></a>00053 <span class="comment"> *              - Moved definitions of CONT_AD_STATE_{SIL,SPEECH} from .c to .h.</span>
<a name="l00054"></a>00054 <span class="comment"> * </span>
<a name="l00055"></a>00055 <span class="comment"> * Revision 1.12  2005/06/29 23:48:04  egouvea</span>
<a name="l00056"></a>00056 <span class="comment"> * Revert changes: variables defined in cont_ad_base.c should not be accessible by the application</span>
<a name="l00057"></a>00057 <span class="comment"> *</span>
<a name="l00058"></a>00058 <span class="comment"> * Revision 1.10  2005/02/13 01:29:48  rkm</span>
<a name="l00059"></a>00059 <span class="comment"> * Fixed cont_ad_read to never cross sil/speech boundary, and rawmode</span>
<a name="l00060"></a>00060 <span class="comment"> *</span>
<a name="l00061"></a>00061 <span class="comment"> * Revision 1.9  2005/02/01 22:21:19  rkm</span>
<a name="l00062"></a>00062 <span class="comment"> * Added raw data logging, and raw data pass-through mode to cont_ad</span>
<a name="l00063"></a>00063 <span class="comment"> *</span>
<a name="l00064"></a>00064 <span class="comment"> * Revision 1.8  2004/07/23 23:36:34  egouvea</span>
<a name="l00065"></a>00065 <span class="comment"> * Ravi&#39;s merge, with the latest fixes in the FSG code, and making the log files generated by FSG, LM, and allphone have the same &#39;look and feel&#39;, with the backtrace information presented consistently</span>
<a name="l00066"></a>00066 <span class="comment"> *</span>
<a name="l00067"></a>00067 <span class="comment"> * 23-Jul-2004  M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University</span>
<a name="l00068"></a>00068 <span class="comment"> *              Changed default adapt_rate from 0.5 to 0.2.</span>
<a name="l00069"></a>00069 <span class="comment"> *</span>
<a name="l00070"></a>00070 <span class="comment"> * Revision 1.7  2004/07/16 00:57:12  egouvea</span>
<a name="l00071"></a>00071 <span class="comment"> * Added Ravi&#39;s implementation of FSG support.</span>
<a name="l00072"></a>00072 <span class="comment"> *</span>
<a name="l00073"></a>00073 <span class="comment"> * Revision 1.2  2004/06/23 20:31:18  rkm</span>
<a name="l00074"></a>00074 <span class="comment"> * Added adapt_rate parameter; restructured frame processing to include threshold update</span>
<a name="l00075"></a>00075 <span class="comment"> *</span>
<a name="l00076"></a>00076 <span class="comment"> * </span>
<a name="l00077"></a>00077 <span class="comment"> * 23-Oct-98    M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University</span>
<a name="l00078"></a>00078 <span class="comment"> *              Small change in the way the noiselevel is updated in find_thresh().</span>
<a name="l00079"></a>00079 <span class="comment"> * </span>
<a name="l00080"></a>00080 <span class="comment"> * 26-Aug-98    M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University</span>
<a name="l00081"></a>00081 <span class="comment"> *              Separated computation of &quot;frame power&quot; into a separate low-level</span>
<a name="l00082"></a>00082 <span class="comment"> *              function.</span>
<a name="l00083"></a>00083 <span class="comment"> * </span>
<a name="l00084"></a>00084 <span class="comment"> * 13-Jul-98    M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University</span>
<a name="l00085"></a>00085 <span class="comment"> *              Modified to allow frame size to depend on audio sampling rate.</span>
<a name="l00086"></a>00086 <span class="comment"> * </span>
<a name="l00087"></a>00087 <span class="comment"> * 01-Jul-98    M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University</span>
<a name="l00088"></a>00088 <span class="comment"> *              Changed CONT_AD_DELTA_SPEECH back to 20.</span>
<a name="l00089"></a>00089 <span class="comment"> * </span>
<a name="l00090"></a>00090 <span class="comment"> * 30-Jun-98    M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University</span>
<a name="l00091"></a>00091 <span class="comment"> *              Changed CONT_AD_DELTA_SPEECH from 10 to 15.</span>
<a name="l00092"></a>00092 <span class="comment"> *              Added FILE* argument to cont_ad_powhist_dump().</span>
<a name="l00093"></a>00093 <span class="comment"> * </span>
<a name="l00094"></a>00094 <span class="comment"> * 19-Jun-98    M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University</span>
<a name="l00095"></a>00095 <span class="comment"> *              Changed CONT_AD_DELTA_SPEECH from 20 to 10, to increase sensitivity</span>
<a name="l00096"></a>00096 <span class="comment"> *              to very short utterances.</span>
<a name="l00097"></a>00097 <span class="comment"> * </span>
<a name="l00098"></a>00098 <span class="comment"> * 16-Jan-98    Paul Placeway (pwp@cs.cmu.edu) at Carnegie Mellon University</span>
<a name="l00099"></a>00099 <span class="comment"> *              Changed to use dB instead of the weird power measure.</span>
<a name="l00100"></a>00100 <span class="comment"> *              Changed analysis window size, tuned default settings of most</span>
<a name="l00101"></a>00101 <span class="comment"> *              parameters to make the system less sensitive to noise, changed</span>
<a name="l00102"></a>00102 <span class="comment"> *              the histogram update frequency and decay to make the system</span>
<a name="l00103"></a>00103 <span class="comment"> *              adapt more rapidly to changes in the environment.</span>
<a name="l00104"></a>00104 <span class="comment"> *              Added cont_ad_set_params() and cont_ad_get_params().</span>
<a name="l00105"></a>00105 <span class="comment"> * </span>
<a name="l00106"></a>00106 <span class="comment"> * 28-Jul-96    M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University</span>
<a name="l00107"></a>00107 <span class="comment"> *              Added FRMPOW2SIGLVL, max_siglvl(), and cont_ad_t.siglvl.</span>
<a name="l00108"></a>00108 <span class="comment"> *              Changed min signal energy/frame to CONT_AD_SPF.</span>
<a name="l00109"></a>00109 <span class="comment"> * </span>
<a name="l00110"></a>00110 <span class="comment"> * 27-Jun-96    M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University</span>
<a name="l00111"></a>00111 <span class="comment"> *              Added the option for cont_ad_read to return -1 on EOF.</span>
<a name="l00112"></a>00112 <span class="comment"> * </span>
<a name="l00113"></a>00113 <span class="comment"> * 21-Jun-96    M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University</span>
<a name="l00114"></a>00114 <span class="comment"> *              Added cont_ad_set_thresh().</span>
<a name="l00115"></a>00115 <span class="comment"> *              Bugfix: n_other is recomputed after updating thresholds.</span>
<a name="l00116"></a>00116 <span class="comment"> * </span>
<a name="l00117"></a>00117 <span class="comment"> * 20-Jun-96    M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University</span>
<a name="l00118"></a>00118 <span class="comment"> *              Separated thresholds for speech and silence.</span>
<a name="l00119"></a>00119 <span class="comment"> *              Fixed bug in moving analysis window upon transition to speech state.</span>
<a name="l00120"></a>00120 <span class="comment"> * </span>
<a name="l00121"></a>00121 <span class="comment"> * 17-Jun-96    M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University</span>
<a name="l00122"></a>00122 <span class="comment"> *              Created, based loosely on Steve Reed&#39;s original implementation.</span>
<a name="l00123"></a>00123 <span class="comment"> */</span>
<a name="l00124"></a>00124 
<a name="l00125"></a>00125 <span class="comment">/*</span>
<a name="l00126"></a>00126 <span class="comment"> * This module is intended to be interposed as a filter between any raw A/D source and the</span>
<a name="l00127"></a>00127 <span class="comment"> * application to remove silence regions.  It is initialized with a raw A/D source function</span>
<a name="l00128"></a>00128 <span class="comment"> * (during the cont_ad_init call).  Filtered A/D data can be read by the application using</span>
<a name="l00129"></a>00129 <span class="comment"> * the cont_ad_read function.  This module assumes that the A/D source function supplies an</span>
<a name="l00130"></a>00130 <span class="comment"> * endless stream of data.  The application is responsible for setting up the A/D source,</span>
<a name="l00131"></a>00131 <span class="comment"> * turning recording on and off as it desires.  It is also responsible for invoking the</span>
<a name="l00132"></a>00132 <span class="comment"> * cont_ad_read function frequently enough to avoid buffer overruns and dropping A/D data.</span>
<a name="l00133"></a>00133 <span class="comment"> * This continuous listening module has an internal buffer of about 4 sec.</span>
<a name="l00134"></a>00134 <span class="comment"> * </span>
<a name="l00135"></a>00135 <span class="comment"> * This module must be initialized and calibrated at first (cont_ad_init and cont_ad_calib</span>
<a name="l00136"></a>00136 <span class="comment"> * functions).  Raw samples are grouped into frames, the signal power in each frame is</span>
<a name="l00137"></a>00137 <span class="comment"> * computed and accumulated in a histogram.  The module is always in one of two states:</span>
<a name="l00138"></a>00138 <span class="comment"> * SILENCE or SPEECH.  Transitions between the two states are detected by looking for a</span>
<a name="l00139"></a>00139 <span class="comment"> * contiguous window of several frames that is predominantly of the other type.  The type</span>
<a name="l00140"></a>00140 <span class="comment"> * is determined by comparing frame power to either of two thresholds, thresh_sil and</span>
<a name="l00141"></a>00141 <span class="comment"> * thresh_speech, as appropriate for the current state.  These thresholds are set from the</span>
<a name="l00142"></a>00142 <span class="comment"> * first peak in the low-end of the power histogram, and are updated every few seconds.</span>
<a name="l00143"></a>00143 <span class="comment"> * Separate thresholds are used to provide some hysteresis.</span>
<a name="l00144"></a>00144 <span class="comment"> * </span>
<a name="l00145"></a>00145 <span class="comment"> * The module maintains a linked list of speech (non-silence) segments not yet read by the</span>
<a name="l00146"></a>00146 <span class="comment"> * application.  The cont_ad_read function returns speech data, if any available, by</span>
<a name="l00147"></a>00147 <span class="comment"> * following this list.  It also updates an &quot;absolute&quot; timestamp at the end of the</span>
<a name="l00148"></a>00148 <span class="comment"> * cont_ad_read operation.  The timestamp indicates the total #samples of A/D data read</span>
<a name="l00149"></a>00149 <span class="comment"> * until this point, including data discarded as silence frames.  The application is</span>
<a name="l00150"></a>00150 <span class="comment"> * responsible for using this timestamp to make any policy decisions regarding utterance</span>
<a name="l00151"></a>00151 <span class="comment"> * boundaries or whatever.</span>
<a name="l00152"></a>00152 <span class="comment"> */</span>
<a name="l00153"></a>00153 
<a name="l00154"></a>00154 <span class="preprocessor">#include &lt;stdio.h&gt;</span>
<a name="l00155"></a>00155 <span class="preprocessor">#include &lt;stdlib.h&gt;</span>
<a name="l00156"></a>00156 <span class="preprocessor">#include &lt;string.h&gt;</span>
<a name="l00157"></a>00157 <span class="preprocessor">#include &lt;assert.h&gt;</span>
<a name="l00158"></a>00158 <span class="preprocessor">#include &lt;math.h&gt;</span>
<a name="l00159"></a>00159 
<a name="l00160"></a>00160 <span class="preprocessor">#ifdef HAVE_CONFIG_H</span>
<a name="l00161"></a>00161 <span class="preprocessor"></span><span class="preprocessor">#include &lt;config.h&gt;</span>
<a name="l00162"></a>00162 <span class="preprocessor">#endif</span>
<a name="l00163"></a>00163 <span class="preprocessor"></span>
<a name="l00164"></a>00164 <span class="preprocessor">#ifdef _MSC_VER</span>
<a name="l00165"></a>00165 <span class="preprocessor"></span><span class="preprocessor">#pragma warning (disable: 4305)</span>
<a name="l00166"></a>00166 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
<a name="l00167"></a>00167 <span class="preprocessor"></span>
<a name="l00168"></a>00168 <span class="preprocessor">#include &quot;sphinxbase/prim_type.h&quot;</span>
<a name="l00169"></a>00169 <span class="preprocessor">#include &quot;sphinxbase/ad.h&quot;</span>
<a name="l00170"></a>00170 <span class="preprocessor">#include &quot;sphinxbase/cont_ad.h&quot;</span>
<a name="l00171"></a>00171 <span class="preprocessor">#include &quot;sphinxbase/err.h&quot;</span>
<a name="l00172"></a>00172 
<a name="l00173"></a>00173 
<a name="l00174"></a>00174 <span class="preprocessor">#ifndef _ABS</span>
<a name="l00175"></a>00175 <span class="preprocessor"></span><span class="preprocessor">#define _ABS(x) ((x) &gt;= 0 ? (x) : -(x))</span>
<a name="l00176"></a>00176 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
<a name="l00177"></a>00177 <span class="preprocessor"></span>
<a name="l00178"></a>00178 
<a name="l00179"></a>00179 <span class="comment">/* Various parameters, including defaults for many cont_ad_t member variables */</span>
<a name="l00180"></a>00180 
<a name="l00181"></a>00181 <span class="preprocessor">#define CONT_AD_ADFRMSIZE       256     </span><span class="comment">/* #Frames of internal A/D buffer maintained */</span>
<a name="l00182"></a>00182 
<a name="l00183"></a>00183 <span class="preprocessor">#define CONT_AD_POWHISTSIZE     98      </span><span class="comment">/* #Powhist bins: ~ FRMPOW(65536^2*CONT_AD_SPF) */</span>
<a name="l00184"></a>00184 <span class="comment">/* Maximum level is 96.3 dB full-scale; 97 for safety, plus 1 for zero-based */</span>
<a name="l00185"></a>00185 
<a name="l00186"></a>00186 <span class="preprocessor">#define CONT_AD_CALIB_FRAMES    (CONT_AD_POWHISTSIZE * 2)</span>
<a name="l00187"></a>00187 <span class="preprocessor"></span>
<a name="l00188"></a>00188 <span class="preprocessor">#define CONT_AD_THRESH_UPDATE   100     </span><span class="comment">/* Update thresholds approx every so many frames */</span>
<a name="l00189"></a>00189         <span class="comment">/* PWP: update was 200 frames, or 3.2 seconds.  Now about every 1.6 sec. */</span>
<a name="l00190"></a>00190 
<a name="l00191"></a>00191 <span class="preprocessor">#define CONT_AD_ADAPT_RATE      0.2     </span><span class="comment">/* Interpolation of new and old noiselevel */</span>
<a name="l00192"></a>00192 
<a name="l00193"></a>00193 <span class="preprocessor">#define CONT_AD_SPS             16000</span>
<a name="l00194"></a>00194 <span class="preprocessor"></span>
<a name="l00195"></a>00195 <span class="preprocessor">#define CONT_AD_DEFAULT_NOISE   30      </span><span class="comment">/* Default background noise power level */</span>
<a name="l00196"></a>00196 <span class="preprocessor">#define CONT_AD_DELTA_SIL       10      </span><span class="comment">/* Initial default for cont_ad_t.delta_sil */</span>
<a name="l00197"></a>00197 <span class="preprocessor">#define CONT_AD_DELTA_SPEECH    17      </span><span class="comment">/* Initial default for cont_ad_t.delta_speech */</span>
<a name="l00198"></a>00198 <span class="preprocessor">#define CONT_AD_MIN_NOISE       2       </span><span class="comment">/* Expected minimum background noise level */</span>
<a name="l00199"></a>00199 <span class="preprocessor">#define CONT_AD_MAX_NOISE       70      </span><span class="comment">/* Maximum background noise level */</span>
<a name="l00200"></a>00200 
<a name="l00201"></a>00201 <span class="preprocessor">#define CONT_AD_HIST_INERTIA    3       </span><span class="comment">/* Used in decaying the power histogram */</span>
<a name="l00202"></a>00202 
<a name="l00203"></a>00203 <span class="preprocessor">#define CONT_AD_WINSIZE         21      </span><span class="comment">/* Analysis window for state transitions */</span>
<a name="l00204"></a>00204                                 <span class="comment">/* rkm had 16 */</span>
<a name="l00205"></a>00205 
<a name="l00206"></a>00206 <span class="preprocessor">#define CONT_AD_SPEECH_ONSET    9       </span><span class="comment">/* Min #speech frames in analysis window for</span>
<a name="l00207"></a>00207 <span class="comment">                                           SILENCE -&gt; SPEECH state transition */</span>
<a name="l00208"></a>00208 <span class="comment">/*</span>
<a name="l00209"></a>00209 <span class="comment"> * SReed had 100 ms == 6.25 fr contiguous; rkm had 9 (out of 16+10) with a</span>
<a name="l00210"></a>00210 <span class="comment"> * lower threshold.</span>
<a name="l00211"></a>00211 <span class="comment"> */</span>
<a name="l00212"></a>00212 
<a name="l00213"></a>00213 <span class="preprocessor">#define CONT_AD_SIL_ONSET       18      </span><span class="comment">/* Min #silence frames in analysis window for</span>
<a name="l00214"></a>00214 <span class="comment">                                           SPEECH -&gt; SILENCE state transition</span>
<a name="l00215"></a>00215 <span class="comment">                                           MUST BE &lt;= CONT_AD_WINSIZE */</span>
<a name="l00216"></a>00216 <span class="comment">/*</span>
<a name="l00217"></a>00217 <span class="comment"> * SReed had 400 ms == 25 fr contiguous; rkm had 14 out of 16</span>
<a name="l00218"></a>00218 <span class="comment"> */</span>
<a name="l00219"></a>00219 
<a name="l00220"></a>00220 <span class="preprocessor">#define CONT_AD_LEADER          5       </span><span class="comment">/* On transition to SPEECH state, so many frames</span>
<a name="l00221"></a>00221 <span class="comment">                                           BEFORE window included in speech data (&gt;0) */</span>
<a name="l00222"></a>00222                                 <span class="comment">/* SReed had 200 ms == 12.5 fr; rkm had 5 */</span>
<a name="l00223"></a>00223 
<a name="l00224"></a>00224 <span class="preprocessor">#define CONT_AD_TRAILER         10      </span><span class="comment">/* On transition to SILENCE state, so many frames</span>
<a name="l00225"></a>00225 <span class="comment">                                           of silence included in speech data (&gt;0).</span>
<a name="l00226"></a>00226 <span class="comment">                                           NOTE: Ensure (0 &lt; TRAILER+LEADER &lt;= WINSIZE) */</span>
<a name="l00227"></a>00227                                 <span class="comment">/* SReed had 100 ms == 6.25 fr; rkm had 10 */</span>
<a name="l00228"></a>00228 
<a name="l00229"></a>00229 
<a name="l00230"></a>00230 <span class="keywordtype">void</span>
<a name="l00231"></a><a class="code" href="cont__ad_8h.html#a288394cd94a4992bec9d3911cc875767">00231</a> <a class="code" href="cont__ad_8h.html#a288394cd94a4992bec9d3911cc875767" title="Dump the power histogram.">cont_ad_powhist_dump</a>(FILE * fp, <a class="code" href="structcont__ad__t.html" title="Continuous listening module or object Continuous listening module or object.">cont_ad_t</a> * r)
<a name="l00232"></a>00232 {
<a name="l00233"></a>00233     int32 i, j;
<a name="l00234"></a>00234 
<a name="l00235"></a>00235     fprintf(fp, <span class="stringliteral">&quot;PowHist:\n&quot;</span>);
<a name="l00236"></a>00236     <span class="keywordflow">for</span> (i = 0, j = 0; i &lt; CONT_AD_POWHISTSIZE; i++) {
<a name="l00237"></a>00237         <span class="keywordflow">if</span> (r-&gt;<a class="code" href="structcont__ad__t.html#a01f61a105019bea12533db84351d07b9" title="Histogram of frame power, moving window, decayed.">pow_hist</a>[i] &gt; 0) {
<a name="l00238"></a>00238             fprintf(fp, <span class="stringliteral">&quot;\t%3d %6d\n&quot;</span>, i, r-&gt;<a class="code" href="structcont__ad__t.html#a01f61a105019bea12533db84351d07b9" title="Histogram of frame power, moving window, decayed.">pow_hist</a>[i]);
<a name="l00239"></a>00239             j = i;
<a name="l00240"></a>00240         }
<a name="l00241"></a>00241     }
<a name="l00242"></a>00242 
<a name="l00243"></a>00243     fprintf(fp, <span class="stringliteral">&quot;PH[%7.2f]:&quot;</span>,
<a name="l00244"></a>00244             (<span class="keywordtype">double</span>) (r-&gt;<a class="code" href="structcont__ad__t.html#a4ed32427e6a785b571b1346c85481899" title="Total number of frames of A/D data read, including consumed ones.">tot_frm</a> * r-&gt;<a class="code" href="structcont__ad__t.html#a55f701abf33b5f68f9ef4cbf95dfaf73" title="Samples/frame; audio level is analyzed within frames.">spf</a>) / (<span class="keywordtype">double</span>) (r-&gt;<a class="code" href="structcont__ad__t.html#a11a4bb48870007b39f8fa46e4b8f111a" title="Samples/sec; moved from ad-&amp;gt;sps to break dependence on ad by N.">sps</a>));
<a name="l00245"></a>00245     <span class="keywordflow">for</span> (i = 0; i &lt;= j; i++)
<a name="l00246"></a>00246         fprintf(fp, <span class="stringliteral">&quot; %2d&quot;</span>, r-&gt;<a class="code" href="structcont__ad__t.html#a01f61a105019bea12533db84351d07b9" title="Histogram of frame power, moving window, decayed.">pow_hist</a>[i]);
<a name="l00247"></a>00247     fprintf(fp, <span class="stringliteral">&quot;\n&quot;</span>);
<a name="l00248"></a>00248 
<a name="l00249"></a>00249     fflush(fp);
<a name="l00250"></a>00250 }
<a name="l00251"></a>00251 
<a name="l00252"></a>00252 
<a name="l00253"></a>00253 <span class="comment">/*</span>
<a name="l00254"></a>00254 <span class="comment"> * Compute frame power.  Interface deliberately kept low level to allow arbitrary</span>
<a name="l00255"></a>00255 <span class="comment"> * users to call this function with appropriate data.</span>
<a name="l00256"></a>00256 <span class="comment"> */</span>
<a name="l00257"></a>00257 int32
<a name="l00258"></a>00258 cont_ad_frame_pow(int16 * buf, int32 * prev, int32 spf)
<a name="l00259"></a>00259 {
<a name="l00260"></a>00260     <span class="keywordtype">double</span> sumsq, v;
<a name="l00261"></a>00261     int32 i;
<a name="l00262"></a>00262     int32 p;
<a name="l00263"></a>00263 
<a name="l00264"></a>00264     sumsq = 0.0;
<a name="l00265"></a>00265     p = *prev;
<a name="l00266"></a>00266     <span class="keywordflow">for</span> (i = 0; i &lt; spf; i++) {
<a name="l00267"></a>00267         <span class="comment">/* Note: pre-emphasis done to remove low-frequency noise. */</span>
<a name="l00268"></a>00268         v = (double) (buf[i] - p);
<a name="l00269"></a>00269         sumsq += v * v;
<a name="l00270"></a>00270         p = buf[i];
<a name="l00271"></a>00271     }
<a name="l00272"></a>00272     *prev = p;
<a name="l00273"></a>00273 
<a name="l00274"></a>00274     <span class="keywordflow">if</span> (sumsq &lt; spf)            <span class="comment">/* Make sure FRMPOW(sumsq) &gt;= 0 */</span>
<a name="l00275"></a>00275         sumsq = spf;
<a name="l00276"></a>00276 
<a name="l00277"></a>00277     <span class="comment">/*</span>
<a name="l00278"></a>00278 <span class="comment">     * PWP: Units changed to dB</span>
<a name="l00279"></a>00279 <span class="comment">     *</span>
<a name="l00280"></a>00280 <span class="comment">     * Now the units of measurement of an input sample are volts (really!),</span>
<a name="l00281"></a>00281 <span class="comment">     * so the power in dB is p = 20*log10(samp).  Further, we want the RMS</span>
<a name="l00282"></a>00282 <span class="comment">     * (root-mean-squared) average power across the frame.</span>
<a name="l00283"></a>00283 <span class="comment">     *</span>
<a name="l00284"></a>00284 <span class="comment">     * &quot;sumsq&quot; is the sum of the sum of the squares, so we want</span>
<a name="l00285"></a>00285 <span class="comment">     *</span>
<a name="l00286"></a>00286 <span class="comment">     *   i = 20 * log10( sqrt ( sumsq / n_samps) )</span>
<a name="l00287"></a>00287 <span class="comment">     *</span>
<a name="l00288"></a>00288 <span class="comment">     * (Stephen Reed&#39;s code actually had </span>
<a name="l00289"></a>00289 <span class="comment">     *    i = 20 * log10( sqrt (sumsq) / n_samps )</span>
<a name="l00290"></a>00290 <span class="comment">     *  but this only produced an additive error.)</span>
<a name="l00291"></a>00291 <span class="comment">     *</span>
<a name="l00292"></a>00292 <span class="comment">     * i = 20 * log10( sqrt ( sumsq / n_samps) )</span>
<a name="l00293"></a>00293 <span class="comment">     *   = 20 * log10( ( sumsq / n_samps) ^ 0.5 )</span>
<a name="l00294"></a>00294 <span class="comment">     *   = 20 * log10( ( sumsq / n_samps) ) * 0.5 )</span>
<a name="l00295"></a>00295 <span class="comment">     *   = 10 * log10( ( sumsq / n_samps) )</span>
<a name="l00296"></a>00296 <span class="comment">     *   = 10 * ( log10( sumsq) - log10(n_samps) )</span>
<a name="l00297"></a>00297 <span class="comment">     */</span>
<a name="l00298"></a>00298     i = (int32) ((10.0 * (log10(sumsq) - log10((<span class="keywordtype">double</span>) spf))) + 0.5);
<a name="l00299"></a>00299     <span class="keywordflow">if</span> (i &lt; 0)
<a name="l00300"></a>00300         i = 0;                  <span class="comment">/* trim lower bound again to be safe. */</span>
<a name="l00301"></a>00301     assert(i &lt; 97);
<a name="l00302"></a>00302 
<a name="l00303"></a>00303     <span class="keywordflow">return</span> (i);
<a name="l00304"></a>00304 }
<a name="l00305"></a>00305 
<a name="l00306"></a>00306 
<a name="l00307"></a>00307 <span class="comment">/*</span>
<a name="l00308"></a>00308 <span class="comment"> * Classify frame (id=frm, starting at sample position s) as sil/nonsil.  Classification</span>
<a name="l00309"></a>00309 <span class="comment"> * done in isolation, independent of any other frame, based only on power histogram.</span>
<a name="l00310"></a>00310 <span class="comment"> */</span>
<a name="l00311"></a>00311 <span class="keyword">static</span> <span class="keywordtype">void</span>
<a name="l00312"></a>00312 compute_frame_pow(<a class="code" href="structcont__ad__t.html" title="Continuous listening module or object Continuous listening module or object.">cont_ad_t</a> * r, int32 frm)
<a name="l00313"></a>00313 {
<a name="l00314"></a>00314     int32 i;
<a name="l00315"></a>00315 
<a name="l00316"></a>00316     i = cont_ad_frame_pow(r-&gt;<a class="code" href="structcont__ad__t.html#a719f5c6816cd0da0a31930a2e572b933" title="Circular buffer for maintaining A/D data read until consumed.">adbuf</a> + (frm * r-&gt;<a class="code" href="structcont__ad__t.html#a55f701abf33b5f68f9ef4cbf95dfaf73" title="Samples/frame; audio level is analyzed within frames.">spf</a>), &amp;(r-&gt;<a class="code" href="structcont__ad__t.html#a54e2013d9634ec473aaf79a606fb2e0f" title="For pre-emphasis filter.">prev_sample</a>),
<a name="l00317"></a>00317                           r-&gt;<a class="code" href="structcont__ad__t.html#a55f701abf33b5f68f9ef4cbf95dfaf73" title="Samples/frame; audio level is analyzed within frames.">spf</a>);
<a name="l00318"></a>00318 
<a name="l00319"></a>00319     r-&gt;<a class="code" href="structcont__ad__t.html#a18f146239c77ff4ca6157261acdf4083" title="Frame power.">frm_pow</a>[frm] = (char) i;
<a name="l00320"></a>00320     (r-&gt;<a class="code" href="structcont__ad__t.html#a01f61a105019bea12533db84351d07b9" title="Histogram of frame power, moving window, decayed.">pow_hist</a>[i])++;
<a name="l00321"></a>00321     r-&gt;<a class="code" href="structcont__ad__t.html#a2168183b25add085cf3aa29ddab1c8ce" title="Number of frames before next update to pow_hist/thresholds.">thresh_update</a>--;
<a name="l00322"></a>00322 }
<a name="l00323"></a>00323 
<a name="l00324"></a>00324 
<a name="l00325"></a>00325 <span class="comment">/* PWP: $$$ check this */</span>
<a name="l00326"></a>00326 <span class="comment">/*</span>
<a name="l00327"></a>00327 <span class="comment"> * PWP: in SReed&#39;s code, decay was done by zeroing the histogram,</span>
<a name="l00328"></a>00328 <span class="comment"> * i.e. no history.</span>
<a name="l00329"></a>00329 <span class="comment"> */</span>
<a name="l00330"></a>00330 <span class="keyword">static</span> <span class="keywordtype">void</span>
<a name="l00331"></a>00331 decay_hist(<a class="code" href="structcont__ad__t.html" title="Continuous listening module or object Continuous listening module or object.">cont_ad_t</a> * r)
<a name="l00332"></a>00332 {
<a name="l00333"></a>00333     int32 i;
<a name="l00334"></a>00334 
<a name="l00335"></a>00335     <span class="keywordflow">for</span> (i = 0; i &lt; CONT_AD_POWHISTSIZE; i++)
<a name="l00336"></a>00336         r-&gt;<a class="code" href="structcont__ad__t.html#a01f61a105019bea12533db84351d07b9" title="Histogram of frame power, moving window, decayed.">pow_hist</a>[i] -= (r-&gt;<a class="code" href="structcont__ad__t.html#a01f61a105019bea12533db84351d07b9" title="Histogram of frame power, moving window, decayed.">pow_hist</a>[i] &gt;&gt; CONT_AD_HIST_INERTIA);
<a name="l00337"></a>00337 }
<a name="l00338"></a>00338 
<a name="l00339"></a>00339 
<a name="l00340"></a>00340 <span class="comment">/*</span>
<a name="l00341"></a>00341 <span class="comment"> * Find silence threshold from power histogram.</span>
<a name="l00342"></a>00342 <span class="comment"> */</span>
<a name="l00343"></a>00343 <span class="keyword">static</span> int32
<a name="l00344"></a>00344 find_thresh(<a class="code" href="structcont__ad__t.html" title="Continuous listening module or object Continuous listening module or object.">cont_ad_t</a> * r)
<a name="l00345"></a>00345 {
<a name="l00346"></a>00346     int32 i, j, max, th;
<a name="l00347"></a>00347     int32 old_noise_level, old_thresh_sil, old_thresh_speech;
<a name="l00348"></a>00348 
<a name="l00349"></a>00349     <span class="keywordflow">if</span> (!r-&gt;<a class="code" href="structcont__ad__t.html#a9e23379bf649ee06ece20133316253e5" title="Do automatic threshold adjustment or not.">auto_thresh</a>)
<a name="l00350"></a>00350         <span class="keywordflow">return</span> 0;
<a name="l00351"></a>00351 
<a name="l00352"></a>00352     <span class="comment">/*</span>
<a name="l00353"></a>00353 <span class="comment">     * Find smallest non-zero histogram entry, but starting at some minimum power.</span>
<a name="l00354"></a>00354 <span class="comment">     * Power lower than CONT_AD_MIN_NOISE indicates bad A/D input (eg, mic off...).</span>
<a name="l00355"></a>00355 <span class="comment">     * Too high a minimum power is also bad.</span>
<a name="l00356"></a>00356 <span class="comment">     */</span>
<a name="l00357"></a>00357     <span class="keywordflow">for</span> (i = r-&gt;<a class="code" href="structcont__ad__t.html#ac301114b24356aef2edccba155e3cf33" title="noise lower than this we ignore">min_noise</a>;
<a name="l00358"></a>00358          (i &lt; CONT_AD_POWHISTSIZE) &amp;&amp; (r-&gt;<a class="code" href="structcont__ad__t.html#a01f61a105019bea12533db84351d07b9" title="Histogram of frame power, moving window, decayed.">pow_hist</a>[i] == 0); i++);
<a name="l00359"></a>00359     <span class="keywordflow">if</span> (i &gt; r-&gt;<a class="code" href="structcont__ad__t.html#af3b50663565964bb18ebb9f9e0002421" title="noise higher than this signals an error">max_noise</a>)       <span class="comment">/* Bad signal? */</span>
<a name="l00360"></a>00360         <span class="keywordflow">return</span> -1;
<a name="l00361"></a>00361 
<a name="l00362"></a>00362     <span class="comment">/* PWP: Hmmmmm.... SReed&#39;s code looks over the lower 20 dB */</span>
<a name="l00363"></a>00363     <span class="comment">/* PWP: 1/14/98  Made to work like Stephen Reed&#39;s code */</span>
<a name="l00364"></a>00364 
<a name="l00365"></a>00365     <span class="comment">/* This method of detecting the noise level is VERY unsatisfactory */</span>
<a name="l00366"></a>00366     max = 0;
<a name="l00367"></a>00367     <span class="keywordflow">for</span> (j = i, th = i; (j &lt; CONT_AD_POWHISTSIZE) &amp;&amp; (j &lt; i + 20); j++) {       <span class="comment">/* PWP: was i+6, which was 9 dB */</span>
<a name="l00368"></a>00368         <span class="keywordflow">if</span> (max &lt; r-&gt;pow_hist[j]) {
<a name="l00369"></a>00369             max = r-&gt;<a class="code" href="structcont__ad__t.html#a01f61a105019bea12533db84351d07b9" title="Histogram of frame power, moving window, decayed.">pow_hist</a>[j];
<a name="l00370"></a>00370             th = j;
<a name="l00371"></a>00371         }
<a name="l00372"></a>00372     }
<a name="l00373"></a>00373 
<a name="l00374"></a>00374     <span class="comment">/* &quot;Don&#39;t change the threshold too fast&quot; */</span>
<a name="l00375"></a>00375     old_noise_level = r-&gt;<a class="code" href="structcont__ad__t.html#af60b0f78f9959a25cf7e7bf4c4aab4d7" title="PWP: what we claim as the &amp;quot;current&amp;quot; noise level.">noise_level</a>;
<a name="l00376"></a>00376     old_thresh_sil = r-&gt;<a class="code" href="structcont__ad__t.html#adbbe28dca87d06a3ca8d2390d08ea83a" title="Frame considered to be silence if power &amp;lt;= thresh_sil (for transitioning from SPEECH to SILENCE st...">thresh_sil</a>;
<a name="l00377"></a>00377     old_thresh_speech = r-&gt;<a class="code" href="structcont__ad__t.html#a0b9333d9acc41b5bfb67f69fc22ca901" title="Frame considered to be speech if power &amp;gt;= thresh_speech (for transitioning from SILENCE to SPEECH ...">thresh_speech</a>;
<a name="l00378"></a>00378     <span class="comment">/* r-&gt;noise_level = (int32) (th * r-&gt;adapt_rate + r-&gt;noise_level * (1.0 - r-&gt;adapt_rate)); */</span>
<a name="l00379"></a>00379     r-&gt;<a class="code" href="structcont__ad__t.html#af60b0f78f9959a25cf7e7bf4c4aab4d7" title="PWP: what we claim as the &amp;quot;current&amp;quot; noise level.">noise_level</a> =
<a name="l00380"></a>00380         (int32) (r-&gt;<a class="code" href="structcont__ad__t.html#af60b0f78f9959a25cf7e7bf4c4aab4d7" title="PWP: what we claim as the &amp;quot;current&amp;quot; noise level.">noise_level</a> +
<a name="l00381"></a>00381                  r-&gt;<a class="code" href="structcont__ad__t.html#ac22395096037175bf9a0a1f6877e5ec5" title="Linear interpolation constant for rate at which noise level adapted to each estimate; range: 0-1; 0=&amp;...">adapt_rate</a> * (th - r-&gt;<a class="code" href="structcont__ad__t.html#af60b0f78f9959a25cf7e7bf4c4aab4d7" title="PWP: what we claim as the &amp;quot;current&amp;quot; noise level.">noise_level</a>) + 0.5);
<a name="l00382"></a>00382 
<a name="l00383"></a>00383     <span class="comment">/* update thresholds */</span>
<a name="l00384"></a>00384     r-&gt;<a class="code" href="structcont__ad__t.html#adbbe28dca87d06a3ca8d2390d08ea83a" title="Frame considered to be silence if power &amp;lt;= thresh_sil (for transitioning from SPEECH to SILENCE st...">thresh_sil</a> = r-&gt;<a class="code" href="structcont__ad__t.html#af60b0f78f9959a25cf7e7bf4c4aab4d7" title="PWP: what we claim as the &amp;quot;current&amp;quot; noise level.">noise_level</a> + r-&gt;<a class="code" href="structcont__ad__t.html#a74a6f56fb4cbde7fc789c9b463cf2f8f" title="Max silence power/frame ABOVE noise level.">delta_sil</a>;
<a name="l00385"></a>00385     r-&gt;<a class="code" href="structcont__ad__t.html#a0b9333d9acc41b5bfb67f69fc22ca901" title="Frame considered to be speech if power &amp;gt;= thresh_speech (for transitioning from SILENCE to SPEECH ...">thresh_speech</a> = r-&gt;<a class="code" href="structcont__ad__t.html#af60b0f78f9959a25cf7e7bf4c4aab4d7" title="PWP: what we claim as the &amp;quot;current&amp;quot; noise level.">noise_level</a> + r-&gt;<a class="code" href="structcont__ad__t.html#afca0f69a21d9f28c9610fcefc0e7cb10" title="Min speech power/frame ABOVE noise level.">delta_speech</a>;
<a name="l00386"></a>00386 
<a name="l00387"></a>00387     <span class="keywordflow">if</span> (r-&gt;<a class="code" href="structcont__ad__t.html#adbbb6765386309476549beb058a235c5" title="If non-NULL, write detailed logs of this object&amp;#39;s progress to the file.">logfp</a>) {
<a name="l00388"></a>00388         fprintf(r-&gt;<a class="code" href="structcont__ad__t.html#adbbb6765386309476549beb058a235c5" title="If non-NULL, write detailed logs of this object&amp;#39;s progress to the file.">logfp</a>,
<a name="l00389"></a>00389                 <span class="stringliteral">&quot;%7.2fs %8df: NoisePeak: %d, Noiselevel: %d -&gt; %d, Th-Sil: %d -&gt; %d, Th-Sp: %d -&gt; %d\n&quot;</span>,
<a name="l00390"></a>00390                 (<span class="keywordtype">double</span>) (r-&gt;<a class="code" href="structcont__ad__t.html#a4ed32427e6a785b571b1346c85481899" title="Total number of frames of A/D data read, including consumed ones.">tot_frm</a> * r-&gt;<a class="code" href="structcont__ad__t.html#a55f701abf33b5f68f9ef4cbf95dfaf73" title="Samples/frame; audio level is analyzed within frames.">spf</a>) / (<span class="keywordtype">double</span>) (r-&gt;<a class="code" href="structcont__ad__t.html#a11a4bb48870007b39f8fa46e4b8f111a" title="Samples/sec; moved from ad-&amp;gt;sps to break dependence on ad by N.">sps</a>),
<a name="l00391"></a>00391                 r-&gt;<a class="code" href="structcont__ad__t.html#a4ed32427e6a785b571b1346c85481899" title="Total number of frames of A/D data read, including consumed ones.">tot_frm</a>, th, old_noise_level, r-&gt;<a class="code" href="structcont__ad__t.html#af60b0f78f9959a25cf7e7bf4c4aab4d7" title="PWP: what we claim as the &amp;quot;current&amp;quot; noise level.">noise_level</a>,
<a name="l00392"></a>00392                 old_thresh_sil, r-&gt;<a class="code" href="structcont__ad__t.html#adbbe28dca87d06a3ca8d2390d08ea83a" title="Frame considered to be silence if power &amp;lt;= thresh_sil (for transitioning from SPEECH to SILENCE st...">thresh_sil</a>, old_thresh_speech,
<a name="l00393"></a>00393                 r-&gt;<a class="code" href="structcont__ad__t.html#a0b9333d9acc41b5bfb67f69fc22ca901" title="Frame considered to be speech if power &amp;gt;= thresh_speech (for transitioning from SILENCE to SPEECH ...">thresh_speech</a>);
<a name="l00394"></a>00394 
<a name="l00395"></a>00395         <a class="code" href="cont__ad_8h.html#a288394cd94a4992bec9d3911cc875767" title="Dump the power histogram.">cont_ad_powhist_dump</a>(r-&gt;<a class="code" href="structcont__ad__t.html#adbbb6765386309476549beb058a235c5" title="If non-NULL, write detailed logs of this object&amp;#39;s progress to the file.">logfp</a>, r);
<a name="l00396"></a>00396 
<a name="l00397"></a>00397         fflush(r-&gt;<a class="code" href="structcont__ad__t.html#adbbb6765386309476549beb058a235c5" title="If non-NULL, write detailed logs of this object&amp;#39;s progress to the file.">logfp</a>);
<a name="l00398"></a>00398     }
<a name="l00399"></a>00399 
<a name="l00400"></a>00400     <span class="comment">/*</span>
<a name="l00401"></a>00401 <span class="comment">     * PWP: in SReed&#39;s original, he cleared the histogram here.</span>
<a name="l00402"></a>00402 <span class="comment">     * I can&#39;t fathom why.</span>
<a name="l00403"></a>00403 <span class="comment">     */</span>
<a name="l00404"></a>00404 
<a name="l00405"></a>00405     <span class="keywordflow">return</span> 0;
<a name="l00406"></a>00406 }
<a name="l00407"></a>00407 
<a name="l00408"></a>00408 
<a name="l00409"></a>00409 <span class="comment">/*</span>
<a name="l00410"></a>00410 <span class="comment"> * Silence to speech transition</span>
<a name="l00411"></a>00411 <span class="comment"> */</span>
<a name="l00412"></a>00412 <span class="keyword">static</span> <span class="keywordtype">void</span>
<a name="l00413"></a>00413 sil2speech_transition(<a class="code" href="structcont__ad__t.html" title="Continuous listening module or object Continuous listening module or object.">cont_ad_t</a> *r, <span class="keywordtype">int</span> frm)
<a name="l00414"></a>00414 {
<a name="l00415"></a>00415     <a class="code" href="structspseg__t.html" title="(FOR INTERNAL USE ) Data structure for maintaining speech (non-silence) segments not yet consumed by ...">spseg_t</a> *seg;
<a name="l00416"></a>00416 
<a name="l00417"></a>00417     <span class="comment">/* Speech detected; create speech segment description */</span>
<a name="l00418"></a>00418     seg = malloc(<span class="keyword">sizeof</span>(*seg));
<a name="l00419"></a>00419 
<a name="l00420"></a>00420     seg-&gt;startfrm = r-&gt;<a class="code" href="structcont__ad__t.html#a75bc7d23bfedfd79a2fd1e3ea2188e4c" title="Where next analysis window begins.">win_startfrm</a> - r-&gt;<a class="code" href="structcont__ad__t.html#a0d42e3ac6c1e5c59c86a40f4cf26a861" title="pad beggining of speech with this many extra frms">leader</a>;
<a name="l00421"></a>00421     <span class="keywordflow">if</span> (seg-&gt;startfrm &lt; 0)
<a name="l00422"></a>00422         seg-&gt;startfrm += CONT_AD_ADFRMSIZE;
<a name="l00423"></a>00423     seg-&gt;nfrm = r-&gt;<a class="code" href="structcont__ad__t.html#a0d42e3ac6c1e5c59c86a40f4cf26a861" title="pad beggining of speech with this many extra frms">leader</a> + r-&gt;<a class="code" href="structcont__ad__t.html#a7c61513f48e8fbc9ab6b57db66dad7b9" title="how many frames to look at for speech det">winsize</a>;
<a name="l00424"></a>00424     seg-&gt;next = NULL;
<a name="l00425"></a>00425 
<a name="l00426"></a>00426     <span class="keywordflow">if</span> (!r-&gt;<a class="code" href="structcont__ad__t.html#abffe61140bc2a02ae4222183b3ef6159" title="First of unconsumed speech segments.">spseg_head</a>)
<a name="l00427"></a>00427         r-&gt;<a class="code" href="structcont__ad__t.html#abffe61140bc2a02ae4222183b3ef6159" title="First of unconsumed speech segments.">spseg_head</a> = seg;
<a name="l00428"></a>00428     <span class="keywordflow">else</span>
<a name="l00429"></a>00429         r-&gt;<a class="code" href="structcont__ad__t.html#ac77e8f8bd27cea3b99238d9663455972" title="Last of unconsumed speech segments.">spseg_tail</a>-&gt;next = seg;
<a name="l00430"></a>00430     r-&gt;<a class="code" href="structcont__ad__t.html#ac77e8f8bd27cea3b99238d9663455972" title="Last of unconsumed speech segments.">spseg_tail</a> = seg;
<a name="l00431"></a>00431 
<a name="l00432"></a>00432     r-&gt;<a class="code" href="structcont__ad__t.html#ae52185e7f7dfe424060c0ff562a8858b" title="State at the end of its internal buffer (internal use): CONT_AD_STATE_SIL or CONT_AD_STATE_SPEECH.">tail_state</a> = CONT_AD_STATE_SPEECH;
<a name="l00433"></a>00433 
<a name="l00434"></a>00434     <span class="keywordflow">if</span> (r-&gt;<a class="code" href="structcont__ad__t.html#adbbb6765386309476549beb058a235c5" title="If non-NULL, write detailed logs of this object&amp;#39;s progress to the file.">logfp</a>) {
<a name="l00435"></a>00435         int32 n;
<a name="l00436"></a>00436 
<a name="l00437"></a>00437         <span class="comment">/* Where (in absolute time) this speech segment starts */</span>
<a name="l00438"></a>00438         n = frm - seg-&gt;startfrm;
<a name="l00439"></a>00439         <span class="keywordflow">if</span> (n &lt; 0)
<a name="l00440"></a>00440             n += CONT_AD_ADFRMSIZE;
<a name="l00441"></a>00441         n = r-&gt;<a class="code" href="structcont__ad__t.html#a4ed32427e6a785b571b1346c85481899" title="Total number of frames of A/D data read, including consumed ones.">tot_frm</a> - n - 1;
<a name="l00442"></a>00442 
<a name="l00443"></a>00443         fprintf(r-&gt;<a class="code" href="structcont__ad__t.html#adbbb6765386309476549beb058a235c5" title="If non-NULL, write detailed logs of this object&amp;#39;s progress to the file.">logfp</a>,
<a name="l00444"></a>00444                 <span class="stringliteral">&quot;%7.2fs %8d[%3d]f: Sil -&gt; Sp detect; seg start: %7.2fs %8d\n&quot;</span>,
<a name="l00445"></a>00445                 (<span class="keywordtype">double</span>) (r-&gt;<a class="code" href="structcont__ad__t.html#a4ed32427e6a785b571b1346c85481899" title="Total number of frames of A/D data read, including consumed ones.">tot_frm</a> *
<a name="l00446"></a>00446                           r-&gt;<a class="code" href="structcont__ad__t.html#a55f701abf33b5f68f9ef4cbf95dfaf73" title="Samples/frame; audio level is analyzed within frames.">spf</a>) /
<a name="l00447"></a>00447                 (<span class="keywordtype">double</span>) (r-&gt;<a class="code" href="structcont__ad__t.html#a11a4bb48870007b39f8fa46e4b8f111a" title="Samples/sec; moved from ad-&amp;gt;sps to break dependence on ad by N.">sps</a>),
<a name="l00448"></a>00448                 r-&gt;<a class="code" href="structcont__ad__t.html#a4ed32427e6a785b571b1346c85481899" title="Total number of frames of A/D data read, including consumed ones.">tot_frm</a>, frm,
<a name="l00449"></a>00449                 (<span class="keywordtype">double</span>) (n * r-&gt;<a class="code" href="structcont__ad__t.html#a55f701abf33b5f68f9ef4cbf95dfaf73" title="Samples/frame; audio level is analyzed within frames.">spf</a>) / (<span class="keywordtype">double</span>) (r-&gt;<a class="code" href="structcont__ad__t.html#a11a4bb48870007b39f8fa46e4b8f111a" title="Samples/sec; moved from ad-&amp;gt;sps to break dependence on ad by N.">sps</a>), n);
<a name="l00450"></a>00450     }
<a name="l00451"></a>00451 
<a name="l00452"></a>00452     <span class="comment">/* Now in SPEECH state; want to look for silence from end of this window */</span>
<a name="l00453"></a>00453     r-&gt;<a class="code" href="structcont__ad__t.html#a14ee16922e7287ad4ce8c51c6ddb74fc" title="Number of frames currently available from win_startfrm for analysis.">win_validfrm</a> = 1;
<a name="l00454"></a>00454     r-&gt;<a class="code" href="structcont__ad__t.html#a75bc7d23bfedfd79a2fd1e3ea2188e4c" title="Where next analysis window begins.">win_startfrm</a> = frm;
<a name="l00455"></a>00455 
<a name="l00456"></a>00456     <span class="comment">/* Count #sil frames remaining in reduced window (of 1 frame) */</span>
<a name="l00457"></a>00457     r-&gt;<a class="code" href="structcont__ad__t.html#a628e5b444bde5e0eb0dc7fe8731a31a6" title="If in SILENCE state, number of frames in analysis window considered to be speech; otherwise number of...">n_other</a> = (r-&gt;<a class="code" href="structcont__ad__t.html#a18f146239c77ff4ca6157261acdf4083" title="Frame power.">frm_pow</a>[frm] &lt;= r-&gt;<a class="code" href="structcont__ad__t.html#adbbe28dca87d06a3ca8d2390d08ea83a" title="Frame considered to be silence if power &amp;lt;= thresh_sil (for transitioning from SPEECH to SILENCE st...">thresh_sil</a>) ? 1 : 0;
<a name="l00458"></a>00458 }
<a name="l00459"></a>00459 
<a name="l00460"></a>00460 <span class="comment">/*</span>
<a name="l00461"></a>00461 <span class="comment"> * Speech to silence transition</span>
<a name="l00462"></a>00462 <span class="comment"> */</span>
<a name="l00463"></a>00463 <span class="keyword">static</span> <span class="keywordtype">void</span>
<a name="l00464"></a>00464 speech2sil_transition(<a class="code" href="structcont__ad__t.html" title="Continuous listening module or object Continuous listening module or object.">cont_ad_t</a> *r, <span class="keywordtype">int</span> frm)
<a name="l00465"></a>00465 {
<a name="l00466"></a>00466     <span class="keywordtype">int</span> f;
<a name="l00467"></a>00467 
<a name="l00468"></a>00468     <span class="comment">/* End of speech detected; speech-&gt;sil transition */</span>
<a name="l00469"></a>00469     r-&gt;<a class="code" href="structcont__ad__t.html#ac77e8f8bd27cea3b99238d9663455972" title="Last of unconsumed speech segments.">spseg_tail</a>-&gt;nfrm += r-&gt;<a class="code" href="structcont__ad__t.html#aa15db1e9fbb0048225521555ab8d9388" title="pad end of speech with this many extra frms">trailer</a>;
<a name="l00470"></a>00470 
<a name="l00471"></a>00471     r-&gt;<a class="code" href="structcont__ad__t.html#ae52185e7f7dfe424060c0ff562a8858b" title="State at the end of its internal buffer (internal use): CONT_AD_STATE_SIL or CONT_AD_STATE_SPEECH.">tail_state</a> = CONT_AD_STATE_SIL;
<a name="l00472"></a>00472 
<a name="l00473"></a>00473     <span class="keywordflow">if</span> (r-&gt;<a class="code" href="structcont__ad__t.html#adbbb6765386309476549beb058a235c5" title="If non-NULL, write detailed logs of this object&amp;#39;s progress to the file.">logfp</a>) {
<a name="l00474"></a>00474         int32 n;
<a name="l00475"></a>00475 
<a name="l00476"></a>00476         <span class="comment">/* Where (in absolute time) this speech segment ends */</span>
<a name="l00477"></a>00477         n = r-&gt;<a class="code" href="structcont__ad__t.html#ac77e8f8bd27cea3b99238d9663455972" title="Last of unconsumed speech segments.">spseg_tail</a>-&gt;startfrm + r-&gt;<a class="code" href="structcont__ad__t.html#ac77e8f8bd27cea3b99238d9663455972" title="Last of unconsumed speech segments.">spseg_tail</a>-&gt;nfrm - 1;
<a name="l00478"></a>00478         <span class="keywordflow">if</span> (n &gt;= CONT_AD_ADFRMSIZE)
<a name="l00479"></a>00479             n -= CONT_AD_ADFRMSIZE;
<a name="l00480"></a>00480         n = frm - n;
<a name="l00481"></a>00481         <span class="keywordflow">if</span> (n &lt; 0)
<a name="l00482"></a>00482             n += CONT_AD_ADFRMSIZE;
<a name="l00483"></a>00483         n = r-&gt;<a class="code" href="structcont__ad__t.html#a4ed32427e6a785b571b1346c85481899" title="Total number of frames of A/D data read, including consumed ones.">tot_frm</a> - n;
<a name="l00484"></a>00484 
<a name="l00485"></a>00485         fprintf(r-&gt;<a class="code" href="structcont__ad__t.html#adbbb6765386309476549beb058a235c5" title="If non-NULL, write detailed logs of this object&amp;#39;s progress to the file.">logfp</a>,
<a name="l00486"></a>00486                 <span class="stringliteral">&quot;%7.2fs %8d[%3d]f: Sp -&gt; Sil detect; seg end: %7.2fs %8d\n&quot;</span>,
<a name="l00487"></a>00487                 (<span class="keywordtype">double</span>) (r-&gt;<a class="code" href="structcont__ad__t.html#a4ed32427e6a785b571b1346c85481899" title="Total number of frames of A/D data read, including consumed ones.">tot_frm</a> * r-&gt;<a class="code" href="structcont__ad__t.html#a55f701abf33b5f68f9ef4cbf95dfaf73" title="Samples/frame; audio level is analyzed within frames.">spf</a>) /
<a name="l00488"></a>00488                 (<span class="keywordtype">double</span>) (r-&gt;<a class="code" href="structcont__ad__t.html#a11a4bb48870007b39f8fa46e4b8f111a" title="Samples/sec; moved from ad-&amp;gt;sps to break dependence on ad by N.">sps</a>), r-&gt;<a class="code" href="structcont__ad__t.html#a4ed32427e6a785b571b1346c85481899" title="Total number of frames of A/D data read, including consumed ones.">tot_frm</a>, frm,
<a name="l00489"></a>00489                 (<span class="keywordtype">double</span>) (n * r-&gt;<a class="code" href="structcont__ad__t.html#a55f701abf33b5f68f9ef4cbf95dfaf73" title="Samples/frame; audio level is analyzed within frames.">spf</a>) / (<span class="keywordtype">double</span>) (r-&gt;<a class="code" href="structcont__ad__t.html#a11a4bb48870007b39f8fa46e4b8f111a" title="Samples/sec; moved from ad-&amp;gt;sps to break dependence on ad by N.">sps</a>), n);
<a name="l00490"></a>00490     }
<a name="l00491"></a>00491 
<a name="l00492"></a>00492     <span class="comment">/* Now in SILENCE state; start looking for speech trailer+leader frames later */</span>
<a name="l00493"></a>00493     r-&gt;<a class="code" href="structcont__ad__t.html#a14ee16922e7287ad4ce8c51c6ddb74fc" title="Number of frames currently available from win_startfrm for analysis.">win_validfrm</a> -= (r-&gt;<a class="code" href="structcont__ad__t.html#aa15db1e9fbb0048225521555ab8d9388" title="pad end of speech with this many extra frms">trailer</a> + r-&gt;<a class="code" href="structcont__ad__t.html#a0d42e3ac6c1e5c59c86a40f4cf26a861" title="pad beggining of speech with this many extra frms">leader</a> - 1);
<a name="l00494"></a>00494     r-&gt;<a class="code" href="structcont__ad__t.html#a75bc7d23bfedfd79a2fd1e3ea2188e4c" title="Where next analysis window begins.">win_startfrm</a> += (r-&gt;<a class="code" href="structcont__ad__t.html#aa15db1e9fbb0048225521555ab8d9388" title="pad end of speech with this many extra frms">trailer</a> + r-&gt;<a class="code" href="structcont__ad__t.html#a0d42e3ac6c1e5c59c86a40f4cf26a861" title="pad beggining of speech with this many extra frms">leader</a> - 1);
<a name="l00495"></a>00495     <span class="keywordflow">if</span> (r-&gt;<a class="code" href="structcont__ad__t.html#a75bc7d23bfedfd79a2fd1e3ea2188e4c" title="Where next analysis window begins.">win_startfrm</a> &gt;= CONT_AD_ADFRMSIZE)
<a name="l00496"></a>00496         r-&gt;<a class="code" href="structcont__ad__t.html#a75bc7d23bfedfd79a2fd1e3ea2188e4c" title="Where next analysis window begins.">win_startfrm</a> -= CONT_AD_ADFRMSIZE;
<a name="l00497"></a>00497 
<a name="l00498"></a>00498     <span class="comment">/* Count #speech frames remaining in reduced window */</span>
<a name="l00499"></a>00499     r-&gt;<a class="code" href="structcont__ad__t.html#a628e5b444bde5e0eb0dc7fe8731a31a6" title="If in SILENCE state, number of frames in analysis window considered to be speech; otherwise number of...">n_other</a> = 0;
<a name="l00500"></a>00500     <span class="keywordflow">for</span> (f = r-&gt;<a class="code" href="structcont__ad__t.html#a75bc7d23bfedfd79a2fd1e3ea2188e4c" title="Where next analysis window begins.">win_startfrm</a>;;) {
<a name="l00501"></a>00501         <span class="keywordflow">if</span> (r-&gt;<a class="code" href="structcont__ad__t.html#a18f146239c77ff4ca6157261acdf4083" title="Frame power.">frm_pow</a>[f] &gt;= r-&gt;<a class="code" href="structcont__ad__t.html#a0b9333d9acc41b5bfb67f69fc22ca901" title="Frame considered to be speech if power &amp;gt;= thresh_speech (for transitioning from SILENCE to SPEECH ...">thresh_speech</a>)
<a name="l00502"></a>00502             r-&gt;<a class="code" href="structcont__ad__t.html#a628e5b444bde5e0eb0dc7fe8731a31a6" title="If in SILENCE state, number of frames in analysis window considered to be speech; otherwise number of...">n_other</a>++;
<a name="l00503"></a>00503 
<a name="l00504"></a>00504         <span class="keywordflow">if</span> (f == frm)
<a name="l00505"></a>00505             <span class="keywordflow">break</span>;
<a name="l00506"></a>00506 
<a name="l00507"></a>00507         f++;
<a name="l00508"></a>00508         <span class="keywordflow">if</span> (f &gt;= CONT_AD_ADFRMSIZE)
<a name="l00509"></a>00509             f = 0;
<a name="l00510"></a>00510     }
<a name="l00511"></a>00511 }
<a name="l00512"></a>00512 
<a name="l00513"></a>00513 
<a name="l00514"></a>00514 <span class="comment">/*</span>
<a name="l00515"></a>00515 <span class="comment"> * Main silence/speech region detection routine.  If currently in</span>
<a name="l00516"></a>00516 <span class="comment"> * SILENCE state, switch to SPEECH state if a window (r-&gt;winsize)</span>
<a name="l00517"></a>00517 <span class="comment"> * of frames is mostly non-silence.  If in SPEECH state, switch to</span>
<a name="l00518"></a>00518 <span class="comment"> * SILENCE state if the window is mostly silence.</span>
<a name="l00519"></a>00519 <span class="comment"> */</span>
<a name="l00520"></a>00520 <span class="keyword">static</span> <span class="keywordtype">void</span>
<a name="l00521"></a>00521 boundary_detect(<a class="code" href="structcont__ad__t.html" title="Continuous listening module or object Continuous listening module or object.">cont_ad_t</a> * r, int32 frm)
<a name="l00522"></a>00522 {
<a name="l00523"></a>00523     assert(r-&gt;<a class="code" href="structcont__ad__t.html#a628e5b444bde5e0eb0dc7fe8731a31a6" title="If in SILENCE state, number of frames in analysis window considered to be speech; otherwise number of...">n_other</a> &gt;= 0);
<a name="l00524"></a>00524 
<a name="l00525"></a>00525     r-&gt;<a class="code" href="structcont__ad__t.html#a14ee16922e7287ad4ce8c51c6ddb74fc" title="Number of frames currently available from win_startfrm for analysis.">win_validfrm</a>++;
<a name="l00526"></a>00526     <span class="keywordflow">if</span> (r-&gt;<a class="code" href="structcont__ad__t.html#ae52185e7f7dfe424060c0ff562a8858b" title="State at the end of its internal buffer (internal use): CONT_AD_STATE_SIL or CONT_AD_STATE_SPEECH.">tail_state</a> == CONT_AD_STATE_SIL) {
<a name="l00527"></a>00527         <span class="keywordflow">if</span> (r-&gt;<a class="code" href="structcont__ad__t.html#a18f146239c77ff4ca6157261acdf4083" title="Frame power.">frm_pow</a>[frm] &gt;= r-&gt;<a class="code" href="structcont__ad__t.html#a0b9333d9acc41b5bfb67f69fc22ca901" title="Frame considered to be speech if power &amp;gt;= thresh_speech (for transitioning from SILENCE to SPEECH ...">thresh_speech</a>)
<a name="l00528"></a>00528             r-&gt;<a class="code" href="structcont__ad__t.html#a628e5b444bde5e0eb0dc7fe8731a31a6" title="If in SILENCE state, number of frames in analysis window considered to be speech; otherwise number of...">n_other</a>++;
<a name="l00529"></a>00529     }
<a name="l00530"></a>00530     <span class="keywordflow">else</span> {
<a name="l00531"></a>00531         <span class="keywordflow">if</span> (r-&gt;<a class="code" href="structcont__ad__t.html#a18f146239c77ff4ca6157261acdf4083" title="Frame power.">frm_pow</a>[frm] &lt;= r-&gt;<a class="code" href="structcont__ad__t.html#adbbe28dca87d06a3ca8d2390d08ea83a" title="Frame considered to be silence if power &amp;lt;= thresh_sil (for transitioning from SPEECH to SILENCE st...">thresh_sil</a>)
<a name="l00532"></a>00532             r-&gt;<a class="code" href="structcont__ad__t.html#a628e5b444bde5e0eb0dc7fe8731a31a6" title="If in SILENCE state, number of frames in analysis window considered to be speech; otherwise number of...">n_other</a>++;
<a name="l00533"></a>00533     }
<a name="l00534"></a>00534 
<a name="l00535"></a>00535     <span class="keywordflow">if</span> (r-&gt;<a class="code" href="structcont__ad__t.html#adbbb6765386309476549beb058a235c5" title="If non-NULL, write detailed logs of this object&amp;#39;s progress to the file.">logfp</a>) {
<a name="l00536"></a>00536         fprintf(r-&gt;<a class="code" href="structcont__ad__t.html#adbbb6765386309476549beb058a235c5" title="If non-NULL, write detailed logs of this object&amp;#39;s progress to the file.">logfp</a>,
<a name="l00537"></a>00537                 <span class="stringliteral">&quot;%7.2fs %8d[%3d]f: P: %2d, N: %2d, T+: %2d, T-: %2d, #O: %2d, %s\n&quot;</span>,
<a name="l00538"></a>00538                 (<span class="keywordtype">double</span>) (r-&gt;<a class="code" href="structcont__ad__t.html#a4ed32427e6a785b571b1346c85481899" title="Total number of frames of A/D data read, including consumed ones.">tot_frm</a> * r-&gt;<a class="code" href="structcont__ad__t.html#a55f701abf33b5f68f9ef4cbf95dfaf73" title="Samples/frame; audio level is analyzed within frames.">spf</a>) / (<span class="keywordtype">double</span>) (r-&gt;<a class="code" href="structcont__ad__t.html#a11a4bb48870007b39f8fa46e4b8f111a" title="Samples/sec; moved from ad-&amp;gt;sps to break dependence on ad by N.">sps</a>),
<a name="l00539"></a>00539                 r-&gt;<a class="code" href="structcont__ad__t.html#a4ed32427e6a785b571b1346c85481899" title="Total number of frames of A/D data read, including consumed ones.">tot_frm</a>, frm, r-&gt;<a class="code" href="structcont__ad__t.html#a18f146239c77ff4ca6157261acdf4083" title="Frame power.">frm_pow</a>[frm], r-&gt;<a class="code" href="structcont__ad__t.html#af60b0f78f9959a25cf7e7bf4c4aab4d7" title="PWP: what we claim as the &amp;quot;current&amp;quot; noise level.">noise_level</a>,
<a name="l00540"></a>00540                 r-&gt;<a class="code" href="structcont__ad__t.html#a0b9333d9acc41b5bfb67f69fc22ca901" title="Frame considered to be speech if power &amp;gt;= thresh_speech (for transitioning from SILENCE to SPEECH ...">thresh_speech</a>, r-&gt;<a class="code" href="structcont__ad__t.html#adbbe28dca87d06a3ca8d2390d08ea83a" title="Frame considered to be silence if power &amp;lt;= thresh_sil (for transitioning from SPEECH to SILENCE st...">thresh_sil</a>, r-&gt;<a class="code" href="structcont__ad__t.html#a628e5b444bde5e0eb0dc7fe8731a31a6" title="If in SILENCE state, number of frames in analysis window considered to be speech; otherwise number of...">n_other</a>,
<a name="l00541"></a>00541                 (r-&gt;<a class="code" href="structcont__ad__t.html#ae52185e7f7dfe424060c0ff562a8858b" title="State at the end of its internal buffer (internal use): CONT_AD_STATE_SIL or CONT_AD_STATE_SPEECH.">tail_state</a> == CONT_AD_STATE_SIL) ? <span class="stringliteral">&quot;--&quot;</span> : <span class="stringliteral">&quot;Sp&quot;</span>);
<a name="l00542"></a>00542     }
<a name="l00543"></a>00543 
<a name="l00544"></a>00544     <span class="keywordflow">if</span> (r-&gt;<a class="code" href="structcont__ad__t.html#a14ee16922e7287ad4ce8c51c6ddb74fc" title="Number of frames currently available from win_startfrm for analysis.">win_validfrm</a> &lt; r-&gt;<a class="code" href="structcont__ad__t.html#a7c61513f48e8fbc9ab6b57db66dad7b9" title="how many frames to look at for speech det">winsize</a>)   <span class="comment">/* Not reached full analysis window size */</span>
<a name="l00545"></a>00545         <span class="keywordflow">return</span>;
<a name="l00546"></a>00546     assert(r-&gt;<a class="code" href="structcont__ad__t.html#a14ee16922e7287ad4ce8c51c6ddb74fc" title="Number of frames currently available from win_startfrm for analysis.">win_validfrm</a> == r-&gt;<a class="code" href="structcont__ad__t.html#a7c61513f48e8fbc9ab6b57db66dad7b9" title="how many frames to look at for speech det">winsize</a>);
<a name="l00547"></a>00547 
<a name="l00548"></a>00548     <span class="keywordflow">if</span> (r-&gt;<a class="code" href="structcont__ad__t.html#ae52185e7f7dfe424060c0ff562a8858b" title="State at the end of its internal buffer (internal use): CONT_AD_STATE_SIL or CONT_AD_STATE_SPEECH.">tail_state</a> == CONT_AD_STATE_SIL) {   <span class="comment">/* Currently in SILENCE state */</span>
<a name="l00549"></a>00549         <span class="keywordflow">if</span> (r-&gt;<a class="code" href="structcont__ad__t.html#abed5c6e9a2e078b70fc4c30b667612b2" title="Number of complete frames of unconsumed A/D data in adbuf.">n_frm</a> &gt;= r-&gt;<a class="code" href="structcont__ad__t.html#a7c61513f48e8fbc9ab6b57db66dad7b9" title="how many frames to look at for speech det">winsize</a> + r-&gt;<a class="code" href="structcont__ad__t.html#a0d42e3ac6c1e5c59c86a40f4cf26a861" title="pad beggining of speech with this many extra frms">leader</a>
<a name="l00550"></a>00550             &amp;&amp; r-&gt;<a class="code" href="structcont__ad__t.html#a628e5b444bde5e0eb0dc7fe8731a31a6" title="If in SILENCE state, number of frames in analysis window considered to be speech; otherwise number of...">n_other</a> &gt;= r-&gt;<a class="code" href="structcont__ad__t.html#a1b0bb7e53a2bf537ed362badddca341b" title="start speech on &amp;gt;= these many frames out of winsize, of &amp;gt;= delta_speech">speech_onset</a>) {
<a name="l00551"></a>00551             sil2speech_transition(r, frm);
<a name="l00552"></a>00552         }
<a name="l00553"></a>00553     }
<a name="l00554"></a>00554     <span class="keywordflow">else</span> {
<a name="l00555"></a>00555         <span class="keywordflow">if</span> (r-&gt;<a class="code" href="structcont__ad__t.html#a628e5b444bde5e0eb0dc7fe8731a31a6" title="If in SILENCE state, number of frames in analysis window considered to be speech; otherwise number of...">n_other</a> &gt;= r-&gt;<a class="code" href="structcont__ad__t.html#a9f5e138f4b79b59bf4daa5603d171165" title="end speech on &amp;gt;= these many frames out of winsize, of &amp;lt;= delta_sil">sil_onset</a>) {
<a name="l00556"></a>00556             speech2sil_transition(r, frm);
<a name="l00557"></a>00557         }
<a name="l00558"></a>00558         <span class="keywordflow">else</span> {
<a name="l00559"></a>00559             <span class="comment">/* In speech state, and staying there; add this frame to segment */</span>
<a name="l00560"></a>00560             r-&gt;<a class="code" href="structcont__ad__t.html#ac77e8f8bd27cea3b99238d9663455972" title="Last of unconsumed speech segments.">spseg_tail</a>-&gt;nfrm++;
<a name="l00561"></a>00561         }
<a name="l00562"></a>00562     }
<a name="l00563"></a>00563 
<a name="l00564"></a>00564     <span class="comment">/*</span>
<a name="l00565"></a>00565 <span class="comment">     * Get rid of oldest frame in analysis window.  Not quite correct;</span>
<a name="l00566"></a>00566 <span class="comment">     * thresholds could have changed over the window; should preserve</span>
<a name="l00567"></a>00567 <span class="comment">     * the original speech/silence label for the frame and undo it.  Later..</span>
<a name="l00568"></a>00568 <span class="comment">     */</span>
<a name="l00569"></a>00569     <span class="keywordflow">if</span> (r-&gt;<a class="code" href="structcont__ad__t.html#ae52185e7f7dfe424060c0ff562a8858b" title="State at the end of its internal buffer (internal use): CONT_AD_STATE_SIL or CONT_AD_STATE_SPEECH.">tail_state</a> == CONT_AD_STATE_SIL) {
<a name="l00570"></a>00570         <span class="keywordflow">if</span> (r-&gt;<a class="code" href="structcont__ad__t.html#a18f146239c77ff4ca6157261acdf4083" title="Frame power.">frm_pow</a>[r-&gt;<a class="code" href="structcont__ad__t.html#a75bc7d23bfedfd79a2fd1e3ea2188e4c" title="Where next analysis window begins.">win_startfrm</a>] &gt;= r-&gt;<a class="code" href="structcont__ad__t.html#a0b9333d9acc41b5bfb67f69fc22ca901" title="Frame considered to be speech if power &amp;gt;= thresh_speech (for transitioning from SILENCE to SPEECH ...">thresh_speech</a>) {
<a name="l00571"></a>00571             <span class="keywordflow">if</span> (r-&gt;<a class="code" href="structcont__ad__t.html#a628e5b444bde5e0eb0dc7fe8731a31a6" title="If in SILENCE state, number of frames in analysis window considered to be speech; otherwise number of...">n_other</a> &gt; 0)
<a name="l00572"></a>00572                 r-&gt;<a class="code" href="structcont__ad__t.html#a628e5b444bde5e0eb0dc7fe8731a31a6" title="If in SILENCE state, number of frames in analysis window considered to be speech; otherwise number of...">n_other</a>--;
<a name="l00573"></a>00573         }
<a name="l00574"></a>00574     }
<a name="l00575"></a>00575     <span class="keywordflow">else</span> {
<a name="l00576"></a>00576         <span class="keywordflow">if</span> (r-&gt;<a class="code" href="structcont__ad__t.html#a18f146239c77ff4ca6157261acdf4083" title="Frame power.">frm_pow</a>[r-&gt;<a class="code" href="structcont__ad__t.html#a75bc7d23bfedfd79a2fd1e3ea2188e4c" title="Where next analysis window begins.">win_startfrm</a>] &lt;= r-&gt;<a class="code" href="structcont__ad__t.html#adbbe28dca87d06a3ca8d2390d08ea83a" title="Frame considered to be silence if power &amp;lt;= thresh_sil (for transitioning from SPEECH to SILENCE st...">thresh_sil</a>) {
<a name="l00577"></a>00577             <span class="keywordflow">if</span> (r-&gt;<a class="code" href="structcont__ad__t.html#a628e5b444bde5e0eb0dc7fe8731a31a6" title="If in SILENCE state, number of frames in analysis window considered to be speech; otherwise number of...">n_other</a> &gt; 0)
<a name="l00578"></a>00578                 r-&gt;<a class="code" href="structcont__ad__t.html#a628e5b444bde5e0eb0dc7fe8731a31a6" title="If in SILENCE state, number of frames in analysis window considered to be speech; otherwise number of...">n_other</a>--;
<a name="l00579"></a>00579         }
<a name="l00580"></a>00580     }
<a name="l00581"></a>00581     r-&gt;<a class="code" href="structcont__ad__t.html#a14ee16922e7287ad4ce8c51c6ddb74fc" title="Number of frames currently available from win_startfrm for analysis.">win_validfrm</a>--;
<a name="l00582"></a>00582     r-&gt;<a class="code" href="structcont__ad__t.html#a75bc7d23bfedfd79a2fd1e3ea2188e4c" title="Where next analysis window begins.">win_startfrm</a>++;
<a name="l00583"></a>00583     <span class="keywordflow">if</span> (r-&gt;<a class="code" href="structcont__ad__t.html#a75bc7d23bfedfd79a2fd1e3ea2188e4c" title="Where next analysis window begins.">win_startfrm</a> &gt;= CONT_AD_ADFRMSIZE)
<a name="l00584"></a>00584         r-&gt;<a class="code" href="structcont__ad__t.html#a75bc7d23bfedfd79a2fd1e3ea2188e4c" title="Where next analysis window begins.">win_startfrm</a> = 0;
<a name="l00585"></a>00585 
<a name="l00586"></a>00586     <span class="keywordflow">if</span> (r-&gt;<a class="code" href="structcont__ad__t.html#adbbb6765386309476549beb058a235c5" title="If non-NULL, write detailed logs of this object&amp;#39;s progress to the file.">logfp</a>)
<a name="l00587"></a>00587         fflush(r-&gt;<a class="code" href="structcont__ad__t.html#adbbb6765386309476549beb058a235c5" title="If non-NULL, write detailed logs of this object&amp;#39;s progress to the file.">logfp</a>);
<a name="l00588"></a>00588 }
<a name="l00589"></a>00589 
<a name="l00590"></a>00590 
<a name="l00591"></a>00591 <span class="keyword">static</span> int32
<a name="l00592"></a>00592 max_siglvl(<a class="code" href="structcont__ad__t.html" title="Continuous listening module or object Continuous listening module or object.">cont_ad_t</a> * r, int32 startfrm, int32 nfrm)
<a name="l00593"></a>00593 {
<a name="l00594"></a>00594     int32 siglvl, i, f;
<a name="l00595"></a>00595 
<a name="l00596"></a>00596     siglvl = 0;
<a name="l00597"></a>00597     <span class="keywordflow">if</span> (nfrm &gt; 0) {
<a name="l00598"></a>00598         <span class="keywordflow">for</span> (i = 0, f = startfrm; i &lt; nfrm; i++, f++) {
<a name="l00599"></a>00599             <span class="keywordflow">if</span> (f &gt;= CONT_AD_ADFRMSIZE)
<a name="l00600"></a>00600                 f -= CONT_AD_ADFRMSIZE;
<a name="l00601"></a>00601             <span class="keywordflow">if</span> (r-&gt;<a class="code" href="structcont__ad__t.html#a18f146239c77ff4ca6157261acdf4083" title="Frame power.">frm_pow</a>[f] &gt; siglvl)
<a name="l00602"></a>00602                 siglvl = r-&gt;<a class="code" href="structcont__ad__t.html#a18f146239c77ff4ca6157261acdf4083" title="Frame power.">frm_pow</a>[f];
<a name="l00603"></a>00603         }
<a name="l00604"></a>00604     }
<a name="l00605"></a>00605     <span class="keywordflow">return</span> siglvl;
<a name="l00606"></a>00606 }
<a name="l00607"></a>00607 
<a name="l00608"></a>00608 
<a name="l00609"></a>00609 <span class="preprocessor">#if 0</span>
<a name="l00610"></a>00610 <span class="preprocessor"></span><span class="comment">/*</span>
<a name="l00611"></a>00611 <span class="comment"> * RKM(2005/01/31): Where did this come from?  If needed, it should be called</span>
<a name="l00612"></a>00612 <span class="comment"> * cont_ad_get_audio_data.</span>
<a name="l00613"></a>00613 <span class="comment"> */</span>
<a name="l00614"></a>00614 <span class="keywordtype">void</span>
<a name="l00615"></a>00615 get_audio_data(<a class="code" href="structcont__ad__t.html" title="Continuous listening module or object Continuous listening module or object.">cont_ad_t</a> * r, int16 * buf, int32 max)
<a name="l00616"></a>00616 {
<a name="l00617"></a>00617 }
<a name="l00618"></a>00618 <span class="preprocessor">#endif</span>
<a name="l00619"></a>00619 <span class="preprocessor"></span>
<a name="l00620"></a>00620 
<a name="l00621"></a>00621 <span class="keyword">static</span> <span class="keywordtype">void</span>
<a name="l00622"></a>00622 cont_ad_read_log(<a class="code" href="structcont__ad__t.html" title="Continuous listening module or object Continuous listening module or object.">cont_ad_t</a> * r, int32 retval)
<a name="l00623"></a>00623 {
<a name="l00624"></a>00624     <a class="code" href="structspseg__t.html" title="(FOR INTERNAL USE ) Data structure for maintaining speech (non-silence) segments not yet consumed by ...">spseg_t</a> *seg;
<a name="l00625"></a>00625 
<a name="l00626"></a>00626     fprintf(r-&gt;<a class="code" href="structcont__ad__t.html#adbbb6765386309476549beb058a235c5" title="If non-NULL, write detailed logs of this object&amp;#39;s progress to the file.">logfp</a>, <span class="stringliteral">&quot;return from cont_ad_read() -&gt; %d:\n&quot;</span>, retval);
<a name="l00627"></a>00627     fprintf(r-&gt;<a class="code" href="structcont__ad__t.html#adbbb6765386309476549beb058a235c5" title="If non-NULL, write detailed logs of this object&amp;#39;s progress to the file.">logfp</a>, <span class="stringliteral">&quot;\tstate: %d\n&quot;</span>, r-&gt;<a class="code" href="structcont__ad__t.html#a5d9420ea711733d1eea9b8f29a638fdb" title="State of data returned by most recent cont_ad_read call; CONT_AD_STATE_SIL or CONT_AD_STATE_SPEECH.">state</a>);
<a name="l00628"></a>00628     fprintf(r-&gt;<a class="code" href="structcont__ad__t.html#adbbb6765386309476549beb058a235c5" title="If non-NULL, write detailed logs of this object&amp;#39;s progress to the file.">logfp</a>, <span class="stringliteral">&quot;\tread_ts: %d (%.2fs)\n&quot;</span>,
<a name="l00629"></a>00629             r-&gt;<a class="code" href="structcont__ad__t.html#a7b71e87abfcb3ca4ae73af34c86f955e" title="Absolute timestamp (total no.">read_ts</a>, (float32) r-&gt;<a class="code" href="structcont__ad__t.html#a7b71e87abfcb3ca4ae73af34c86f955e" title="Absolute timestamp (total no.">read_ts</a> / (float32) r-&gt;<a class="code" href="structcont__ad__t.html#a11a4bb48870007b39f8fa46e4b8f111a" title="Samples/sec; moved from ad-&amp;gt;sps to break dependence on ad by N.">sps</a>);
<a name="l00630"></a>00630     fprintf(r-&gt;<a class="code" href="structcont__ad__t.html#adbbb6765386309476549beb058a235c5" title="If non-NULL, write detailed logs of this object&amp;#39;s progress to the file.">logfp</a>, <span class="stringliteral">&quot;\tseglen: %d (%.2fs)\n&quot;</span>,
<a name="l00631"></a>00631             r-&gt;<a class="code" href="structcont__ad__t.html#a478939247e09a8ae142c8996ec17d8c8" title="Total no.">seglen</a>, (float32) r-&gt;<a class="code" href="structcont__ad__t.html#a478939247e09a8ae142c8996ec17d8c8" title="Total no.">seglen</a> / (float32) r-&gt;<a class="code" href="structcont__ad__t.html#a11a4bb48870007b39f8fa46e4b8f111a" title="Samples/sec; moved from ad-&amp;gt;sps to break dependence on ad by N.">sps</a>);
<a name="l00632"></a>00632     fprintf(r-&gt;<a class="code" href="structcont__ad__t.html#adbbb6765386309476549beb058a235c5" title="If non-NULL, write detailed logs of this object&amp;#39;s progress to the file.">logfp</a>, <span class="stringliteral">&quot;\tsiglvl: %d\n&quot;</span>, r-&gt;<a class="code" href="structcont__ad__t.html#a5524c052dcd0a3d1a1c3b1fc2134b62e" title="Max signal level for the data consumed by the most recent cont_ad_read call (dB range: 0-99)...">siglvl</a>);
<a name="l00633"></a>00633     fprintf(r-&gt;<a class="code" href="structcont__ad__t.html#adbbb6765386309476549beb058a235c5" title="If non-NULL, write detailed logs of this object&amp;#39;s progress to the file.">logfp</a>, <span class="stringliteral">&quot;\theadfrm: %d\n&quot;</span>, r-&gt;<a class="code" href="structcont__ad__t.html#aa0617a92c549ac916258a54ec2cdc756" title="Frame number in adbuf with unconsumed A/D data.">headfrm</a>);
<a name="l00634"></a>00634     fprintf(r-&gt;<a class="code" href="structcont__ad__t.html#adbbb6765386309476549beb058a235c5" title="If non-NULL, write detailed logs of this object&amp;#39;s progress to the file.">logfp</a>, <span class="stringliteral">&quot;\tn_frm: %d\n&quot;</span>, r-&gt;<a class="code" href="structcont__ad__t.html#abed5c6e9a2e078b70fc4c30b667612b2" title="Number of complete frames of unconsumed A/D data in adbuf.">n_frm</a>);
<a name="l00635"></a>00635     fprintf(r-&gt;<a class="code" href="structcont__ad__t.html#adbbb6765386309476549beb058a235c5" title="If non-NULL, write detailed logs of this object&amp;#39;s progress to the file.">logfp</a>, <span class="stringliteral">&quot;\tn_sample: %d\n&quot;</span>, r-&gt;<a class="code" href="structcont__ad__t.html#a7ae5362560d9edfa6c16555285487a7a" title="Number of samples of unconsumed data in adbuf.">n_sample</a>);
<a name="l00636"></a>00636     fprintf(r-&gt;<a class="code" href="structcont__ad__t.html#adbbb6765386309476549beb058a235c5" title="If non-NULL, write detailed logs of this object&amp;#39;s progress to the file.">logfp</a>, <span class="stringliteral">&quot;\twin_startfrm: %d\n&quot;</span>, r-&gt;<a class="code" href="structcont__ad__t.html#a75bc7d23bfedfd79a2fd1e3ea2188e4c" title="Where next analysis window begins.">win_startfrm</a>);
<a name="l00637"></a>00637     fprintf(r-&gt;<a class="code" href="structcont__ad__t.html#adbbb6765386309476549beb058a235c5" title="If non-NULL, write detailed logs of this object&amp;#39;s progress to the file.">logfp</a>, <span class="stringliteral">&quot;\twin_validfrm: %d\n&quot;</span>, r-&gt;<a class="code" href="structcont__ad__t.html#a14ee16922e7287ad4ce8c51c6ddb74fc" title="Number of frames currently available from win_startfrm for analysis.">win_validfrm</a>);
<a name="l00638"></a>00638     fprintf(r-&gt;<a class="code" href="structcont__ad__t.html#adbbb6765386309476549beb058a235c5" title="If non-NULL, write detailed logs of this object&amp;#39;s progress to the file.">logfp</a>, <span class="stringliteral">&quot;\tnoise_level: %d\n&quot;</span>, r-&gt;<a class="code" href="structcont__ad__t.html#af60b0f78f9959a25cf7e7bf4c4aab4d7" title="PWP: what we claim as the &amp;quot;current&amp;quot; noise level.">noise_level</a>);
<a name="l00639"></a>00639     fprintf(r-&gt;<a class="code" href="structcont__ad__t.html#adbbb6765386309476549beb058a235c5" title="If non-NULL, write detailed logs of this object&amp;#39;s progress to the file.">logfp</a>, <span class="stringliteral">&quot;\tthresh_sil: %d\n&quot;</span>, r-&gt;<a class="code" href="structcont__ad__t.html#adbbe28dca87d06a3ca8d2390d08ea83a" title="Frame considered to be silence if power &amp;lt;= thresh_sil (for transitioning from SPEECH to SILENCE st...">thresh_sil</a>);
<a name="l00640"></a>00640     fprintf(r-&gt;<a class="code" href="structcont__ad__t.html#adbbb6765386309476549beb058a235c5" title="If non-NULL, write detailed logs of this object&amp;#39;s progress to the file.">logfp</a>, <span class="stringliteral">&quot;\tthresh_speech: %d\n&quot;</span>, r-&gt;<a class="code" href="structcont__ad__t.html#a0b9333d9acc41b5bfb67f69fc22ca901" title="Frame considered to be speech if power &amp;gt;= thresh_speech (for transitioning from SILENCE to SPEECH ...">thresh_speech</a>);
<a name="l00641"></a>00641     fprintf(r-&gt;<a class="code" href="structcont__ad__t.html#adbbb6765386309476549beb058a235c5" title="If non-NULL, write detailed logs of this object&amp;#39;s progress to the file.">logfp</a>, <span class="stringliteral">&quot;\tn_other: %d\n&quot;</span>, r-&gt;<a class="code" href="structcont__ad__t.html#a628e5b444bde5e0eb0dc7fe8731a31a6" title="If in SILENCE state, number of frames in analysis window considered to be speech; otherwise number of...">n_other</a>);
<a name="l00642"></a>00642     fprintf(r-&gt;<a class="code" href="structcont__ad__t.html#adbbb6765386309476549beb058a235c5" title="If non-NULL, write detailed logs of this object&amp;#39;s progress to the file.">logfp</a>, <span class="stringliteral">&quot;\ttail_state: %d\n&quot;</span>, r-&gt;<a class="code" href="structcont__ad__t.html#ae52185e7f7dfe424060c0ff562a8858b" title="State at the end of its internal buffer (internal use): CONT_AD_STATE_SIL or CONT_AD_STATE_SPEECH.">tail_state</a>);
<a name="l00643"></a>00643     fprintf(r-&gt;<a class="code" href="structcont__ad__t.html#adbbb6765386309476549beb058a235c5" title="If non-NULL, write detailed logs of this object&amp;#39;s progress to the file.">logfp</a>, <span class="stringliteral">&quot;\ttot_frm: %d\n&quot;</span>, r-&gt;<a class="code" href="structcont__ad__t.html#a4ed32427e6a785b571b1346c85481899" title="Total number of frames of A/D data read, including consumed ones.">tot_frm</a>);
<a name="l00644"></a>00644 
<a name="l00645"></a>00645     fprintf(r-&gt;<a class="code" href="structcont__ad__t.html#adbbb6765386309476549beb058a235c5" title="If non-NULL, write detailed logs of this object&amp;#39;s progress to the file.">logfp</a>, <span class="stringliteral">&quot;\tspseg:&quot;</span>);
<a name="l00646"></a>00646     <span class="keywordflow">for</span> (seg = r-&gt;<a class="code" href="structcont__ad__t.html#abffe61140bc2a02ae4222183b3ef6159" title="First of unconsumed speech segments.">spseg_head</a>; seg; seg = seg-&gt;next)
<a name="l00647"></a>00647         fprintf(r-&gt;<a class="code" href="structcont__ad__t.html#adbbb6765386309476549beb058a235c5" title="If non-NULL, write detailed logs of this object&amp;#39;s progress to the file.">logfp</a>, <span class="stringliteral">&quot; %d[%d]&quot;</span>, seg-&gt;startfrm, seg-&gt;nfrm);
<a name="l00648"></a>00648     fprintf(r-&gt;<a class="code" href="structcont__ad__t.html#adbbb6765386309476549beb058a235c5" title="If non-NULL, write detailed logs of this object&amp;#39;s progress to the file.">logfp</a>, <span class="stringliteral">&quot;\n&quot;</span>);
<a name="l00649"></a>00649 
<a name="l00650"></a>00650     fflush(r-&gt;<a class="code" href="structcont__ad__t.html#adbbb6765386309476549beb058a235c5" title="If non-NULL, write detailed logs of this object&amp;#39;s progress to the file.">logfp</a>);
<a name="l00651"></a>00651 }
<a name="l00652"></a>00652 
<a name="l00653"></a>00653 
<a name="l00654"></a>00654 <span class="comment">/*</span>
<a name="l00655"></a>00655 <span class="comment"> * Copy data from r-&gt;adbuf[sf], for nf frames, into buf.</span>
<a name="l00656"></a>00656 <span class="comment"> * All length checks must have been completed before this call; hence, this</span>
<a name="l00657"></a>00657 <span class="comment"> * function will copy exactly the specified number of frames.</span>
<a name="l00658"></a>00658 <span class="comment"> * </span>
<a name="l00659"></a>00659 <span class="comment"> * Return value: Index of frame just after the segment copied, possibly wrapped</span>
<a name="l00660"></a>00660 <span class="comment"> * around to 0.</span>
<a name="l00661"></a>00661 <span class="comment"> */</span>
<a name="l00662"></a>00662 <span class="keyword">static</span> int32
<a name="l00663"></a>00663 buf_copy(<a class="code" href="structcont__ad__t.html" title="Continuous listening module or object Continuous listening module or object.">cont_ad_t</a> * r, int32 sf, int32 nf, int16 * buf)
<a name="l00664"></a>00664 {
<a name="l00665"></a>00665     int32 f, l;
<a name="l00666"></a>00666 
<a name="l00667"></a>00667     assert((sf &gt;= 0) &amp;&amp; (sf &lt; CONT_AD_ADFRMSIZE));
<a name="l00668"></a>00668     assert(nf &gt;= 0);
<a name="l00669"></a>00669 
<a name="l00670"></a>00670     <span class="keywordflow">if</span> (sf + nf &gt; CONT_AD_ADFRMSIZE) {
<a name="l00671"></a>00671         <span class="comment">/* Amount to be copied wraps around adbuf; copy in two stages */</span>
<a name="l00672"></a>00672         f = CONT_AD_ADFRMSIZE - sf;
<a name="l00673"></a>00673         l = (f * r-&gt;<a class="code" href="structcont__ad__t.html#a55f701abf33b5f68f9ef4cbf95dfaf73" title="Samples/frame; audio level is analyzed within frames.">spf</a>);
<a name="l00674"></a>00674         memcpy(buf, r-&gt;<a class="code" href="structcont__ad__t.html#a719f5c6816cd0da0a31930a2e572b933" title="Circular buffer for maintaining A/D data read until consumed.">adbuf</a> + (sf * r-&gt;<a class="code" href="structcont__ad__t.html#a55f701abf33b5f68f9ef4cbf95dfaf73" title="Samples/frame; audio level is analyzed within frames.">spf</a>), l * <span class="keyword">sizeof</span>(int16));
<a name="l00675"></a>00675 
<a name="l00676"></a>00676         <span class="keywordflow">if</span> (r-&gt;<a class="code" href="structcont__ad__t.html#adbbb6765386309476549beb058a235c5" title="If non-NULL, write detailed logs of this object&amp;#39;s progress to the file.">logfp</a>) {
<a name="l00677"></a>00677             fprintf(r-&gt;<a class="code" href="structcont__ad__t.html#adbbb6765386309476549beb058a235c5" title="If non-NULL, write detailed logs of this object&amp;#39;s progress to the file.">logfp</a>,
<a name="l00678"></a>00678                     <span class="stringliteral">&quot;return %d speech frames [%d..%d]; %d samples\n&quot;</span>,
<a name="l00679"></a>00679                     f, sf, sf + f - 1, l);
<a name="l00680"></a>00680         }
<a name="l00681"></a>00681 
<a name="l00682"></a>00682         buf += l;
<a name="l00683"></a>00683         sf = 0;
<a name="l00684"></a>00684         nf -= f;
<a name="l00685"></a>00685     }
<a name="l00686"></a>00686 
<a name="l00687"></a>00687     <span class="keywordflow">if</span> (nf &gt; 0) {
<a name="l00688"></a>00688         l = (nf * r-&gt;<a class="code" href="structcont__ad__t.html#a55f701abf33b5f68f9ef4cbf95dfaf73" title="Samples/frame; audio level is analyzed within frames.">spf</a>);
<a name="l00689"></a>00689         memcpy(buf, r-&gt;<a class="code" href="structcont__ad__t.html#a719f5c6816cd0da0a31930a2e572b933" title="Circular buffer for maintaining A/D data read until consumed.">adbuf</a> + (sf * r-&gt;<a class="code" href="structcont__ad__t.html#a55f701abf33b5f68f9ef4cbf95dfaf73" title="Samples/frame; audio level is analyzed within frames.">spf</a>), l * <span class="keyword">sizeof</span>(int16));
<a name="l00690"></a>00690 
<a name="l00691"></a>00691         <span class="keywordflow">if</span> (r-&gt;<a class="code" href="structcont__ad__t.html#adbbb6765386309476549beb058a235c5" title="If non-NULL, write detailed logs of this object&amp;#39;s progress to the file.">logfp</a>) {
<a name="l00692"></a>00692             fprintf(r-&gt;<a class="code" href="structcont__ad__t.html#adbbb6765386309476549beb058a235c5" title="If non-NULL, write detailed logs of this object&amp;#39;s progress to the file.">logfp</a>,
<a name="l00693"></a>00693                     <span class="stringliteral">&quot;return %d speech frames [%d..%d]; %d samples\n&quot;</span>,
<a name="l00694"></a>00694                     nf, sf, sf + nf - 1, l);
<a name="l00695"></a>00695         }
<a name="l00696"></a>00696     }
<a name="l00697"></a>00697 
<a name="l00698"></a>00698     <span class="keywordflow">if</span> ((sf + nf) &gt;= CONT_AD_ADFRMSIZE) {
<a name="l00699"></a>00699         assert((sf + nf) == CONT_AD_ADFRMSIZE);
<a name="l00700"></a>00700         <span class="keywordflow">return</span> 0;
<a name="l00701"></a>00701     }
<a name="l00702"></a>00702     <span class="keywordflow">else</span>
<a name="l00703"></a>00703         <span class="keywordflow">return</span> (sf + nf);
<a name="l00704"></a>00704 }
<a name="l00705"></a>00705 
<a name="l00706"></a>00706 int32
<a name="l00707"></a><a class="code" href="cont__ad_8h.html#a680721acc14ac191bbae3a4940ed357d">00707</a> <a class="code" href="cont__ad_8h.html#a680721acc14ac191bbae3a4940ed357d" title="Get the maximum number of samples which can be passed into cont_ad_read().">cont_ad_buffer_space</a>(<a class="code" href="structcont__ad__t.html" title="Continuous listening module or object Continuous listening module or object.">cont_ad_t</a> *r)
<a name="l00708"></a>00708 {
<a name="l00709"></a>00709     <span class="keywordflow">return</span> r-&gt;<a class="code" href="structcont__ad__t.html#a5c6edc6be287f3ae013c59fef90cb4bd" title="Buffer size (Number of samples)">adbufsize</a> - r-&gt;<a class="code" href="structcont__ad__t.html#a7ae5362560d9edfa6c16555285487a7a" title="Number of samples of unconsumed data in adbuf.">n_sample</a>;
<a name="l00710"></a>00710 }
<a name="l00711"></a>00711 
<a name="l00712"></a>00712 <span class="comment">/*</span>
<a name="l00713"></a>00713 <span class="comment"> * Read as much data as possible from r-&gt;adfunc into r-&gt;adbuf.</span>
<a name="l00714"></a>00714 <span class="comment"> */</span>
<a name="l00715"></a>00715 <span class="keyword">static</span> int32
<a name="l00716"></a>00716 cont_ad_read_internal(<a class="code" href="structcont__ad__t.html" title="Continuous listening module or object Continuous listening module or object.">cont_ad_t</a> *r, int16 *buf, int32 max)
<a name="l00717"></a>00717 {
<a name="l00718"></a>00718     int32 head, tail, len, l;
<a name="l00719"></a>00719 
<a name="l00720"></a>00720     <span class="comment">/*</span>
<a name="l00721"></a>00721 <span class="comment">     * First read as much of raw A/D as possible and available.  adbuf is not</span>
<a name="l00722"></a>00722 <span class="comment">     * really a circular buffer, so may have to read in two steps for wrapping</span>
<a name="l00723"></a>00723 <span class="comment">     * around.</span>
<a name="l00724"></a>00724 <span class="comment">     */</span>
<a name="l00725"></a>00725     head = r-&gt;<a class="code" href="structcont__ad__t.html#aa0617a92c549ac916258a54ec2cdc756" title="Frame number in adbuf with unconsumed A/D data.">headfrm</a> * r-&gt;<a class="code" href="structcont__ad__t.html#a55f701abf33b5f68f9ef4cbf95dfaf73" title="Samples/frame; audio level is analyzed within frames.">spf</a>;
<a name="l00726"></a>00726     tail = head + r-&gt;<a class="code" href="structcont__ad__t.html#a7ae5362560d9edfa6c16555285487a7a" title="Number of samples of unconsumed data in adbuf.">n_sample</a>;
<a name="l00727"></a>00727     len = r-&gt;<a class="code" href="structcont__ad__t.html#a7ae5362560d9edfa6c16555285487a7a" title="Number of samples of unconsumed data in adbuf.">n_sample</a> - (r-&gt;<a class="code" href="structcont__ad__t.html#abed5c6e9a2e078b70fc4c30b667612b2" title="Number of complete frames of unconsumed A/D data in adbuf.">n_frm</a> * r-&gt;<a class="code" href="structcont__ad__t.html#a55f701abf33b5f68f9ef4cbf95dfaf73" title="Samples/frame; audio level is analyzed within frames.">spf</a>);    <span class="comment">/* #partial frame samples at the tail */</span>
<a name="l00728"></a>00728     assert((len &gt;= 0) &amp;&amp; (len &lt; r-&gt;spf));
<a name="l00729"></a>00729 
<a name="l00730"></a>00730     <span class="keywordflow">if</span> ((tail &lt; r-&gt;adbufsize) &amp;&amp; (!r-&gt;<a class="code" href="structcont__ad__t.html#af7b9044b76ed3b86ce74e4e7215ca4c3" title="Whether the source ad device has encountered EOF.">eof</a>)) {
<a name="l00731"></a>00731         <span class="keywordflow">if</span> (r-&gt;adfunc) {
<a name="l00732"></a>00732             <span class="keywordflow">if</span> ((l =
<a name="l00733"></a>00733                  (*(r-&gt;adfunc)) (r-&gt;<a class="code" href="structcont__ad__t.html#aae5b9d977e62424b0cf0e245485b20a0" title="A/D device argument for adfunc.">ad</a>, r-&gt;<a class="code" href="structcont__ad__t.html#a719f5c6816cd0da0a31930a2e572b933" title="Circular buffer for maintaining A/D data read until consumed.">adbuf</a> + tail,
<a name="l00734"></a>00734                                  r-&gt;<a class="code" href="structcont__ad__t.html#a5c6edc6be287f3ae013c59fef90cb4bd" title="Buffer size (Number of samples)">adbufsize</a> - tail)) &lt; 0) {
<a name="l00735"></a>00735                 r-&gt;<a class="code" href="structcont__ad__t.html#af7b9044b76ed3b86ce74e4e7215ca4c3" title="Whether the source ad device has encountered EOF.">eof</a> = 1;
<a name="l00736"></a>00736                 l = 0;
<a name="l00737"></a>00737             }
<a name="l00738"></a>00738         }
<a name="l00739"></a>00739         <span class="keywordflow">else</span> {
<a name="l00740"></a>00740             l = r-&gt;<a class="code" href="structcont__ad__t.html#a5c6edc6be287f3ae013c59fef90cb4bd" title="Buffer size (Number of samples)">adbufsize</a> - tail;
<a name="l00741"></a>00741             <span class="keywordflow">if</span> (l &gt; max) {
<a name="l00742"></a>00742                 l = max;
<a name="l00743"></a>00743                 max = 0;
<a name="l00744"></a>00744             }
<a name="l00745"></a>00745             <span class="keywordflow">else</span> {
<a name="l00746"></a>00746                 max -= l;
<a name="l00747"></a>00747             }
<a name="l00748"></a>00748             memcpy(r-&gt;<a class="code" href="structcont__ad__t.html#a719f5c6816cd0da0a31930a2e572b933" title="Circular buffer for maintaining A/D data read until consumed.">adbuf</a> + tail, buf, l * <span class="keyword">sizeof</span>(int16));
<a name="l00749"></a>00749             buf += l;
<a name="l00750"></a>00750         }
<a name="l00751"></a>00751         <span class="keywordflow">if</span> ((l &gt; 0) &amp;&amp; r-&gt;<a class="code" href="structcont__ad__t.html#af8cd2a7e0ef0f4e2c825c7812a091f9c" title="If non-NULL, raw audio input data processed by cont_ad is dumped to this file.">rawfp</a>) {
<a name="l00752"></a>00752             fwrite(r-&gt;<a class="code" href="structcont__ad__t.html#a719f5c6816cd0da0a31930a2e572b933" title="Circular buffer for maintaining A/D data read until consumed.">adbuf</a> + tail, <span class="keyword">sizeof</span>(int16), l, r-&gt;<a class="code" href="structcont__ad__t.html#af8cd2a7e0ef0f4e2c825c7812a091f9c" title="If non-NULL, raw audio input data processed by cont_ad is dumped to this file.">rawfp</a>);
<a name="l00753"></a>00753             fflush(r-&gt;<a class="code" href="structcont__ad__t.html#af8cd2a7e0ef0f4e2c825c7812a091f9c" title="If non-NULL, raw audio input data processed by cont_ad is dumped to this file.">rawfp</a>);
<a name="l00754"></a>00754         }
<a name="l00755"></a>00755 
<a name="l00756"></a>00756         tail += l;
<a name="l00757"></a>00757         len += l;
<a name="l00758"></a>00758         r-&gt;<a class="code" href="structcont__ad__t.html#a7ae5362560d9edfa6c16555285487a7a" title="Number of samples of unconsumed data in adbuf.">n_sample</a> += l;
<a name="l00759"></a>00759     }
<a name="l00760"></a>00760     <span class="keywordflow">if</span> ((tail &gt;= r-&gt;<a class="code" href="structcont__ad__t.html#a5c6edc6be287f3ae013c59fef90cb4bd" title="Buffer size (Number of samples)">adbufsize</a>) &amp;&amp; (!r-&gt;<a class="code" href="structcont__ad__t.html#af7b9044b76ed3b86ce74e4e7215ca4c3" title="Whether the source ad device has encountered EOF.">eof</a>)) {
<a name="l00761"></a>00761         tail -= r-&gt;<a class="code" href="structcont__ad__t.html#a5c6edc6be287f3ae013c59fef90cb4bd" title="Buffer size (Number of samples)">adbufsize</a>;
<a name="l00762"></a>00762         <span class="keywordflow">if</span> (tail &lt; head) {
<a name="l00763"></a>00763             <span class="keywordflow">if</span> (r-&gt;adfunc) {
<a name="l00764"></a>00764                 <span class="keywordflow">if</span> ((l =
<a name="l00765"></a>00765                      (*(r-&gt;adfunc)) (r-&gt;<a class="code" href="structcont__ad__t.html#aae5b9d977e62424b0cf0e245485b20a0" title="A/D device argument for adfunc.">ad</a>,
<a name="l00766"></a>00766                                      r-&gt;<a class="code" href="structcont__ad__t.html#a719f5c6816cd0da0a31930a2e572b933" title="Circular buffer for maintaining A/D data read until consumed.">adbuf</a> + tail, head - tail)) &lt; 0) {
<a name="l00767"></a>00767                     r-&gt;<a class="code" href="structcont__ad__t.html#af7b9044b76ed3b86ce74e4e7215ca4c3" title="Whether the source ad device has encountered EOF.">eof</a> = 1;
<a name="l00768"></a>00768                     l = 0;
<a name="l00769"></a>00769                 }
<a name="l00770"></a>00770             }
<a name="l00771"></a>00771             <span class="keywordflow">else</span> {
<a name="l00772"></a>00772                 l = head - tail;
<a name="l00773"></a>00773                 <span class="keywordflow">if</span> (l &gt; max)
<a name="l00774"></a>00774                     l = max;
<a name="l00775"></a>00775                 memcpy(r-&gt;<a class="code" href="structcont__ad__t.html#a719f5c6816cd0da0a31930a2e572b933" title="Circular buffer for maintaining A/D data read until consumed.">adbuf</a> + tail, buf, l * <span class="keyword">sizeof</span>(int16));
<a name="l00776"></a>00776             }
<a name="l00777"></a>00777             <span class="keywordflow">if</span> ((l &gt; 0) &amp;&amp; r-&gt;<a class="code" href="structcont__ad__t.html#af8cd2a7e0ef0f4e2c825c7812a091f9c" title="If non-NULL, raw audio input data processed by cont_ad is dumped to this file.">rawfp</a>) {
<a name="l00778"></a>00778                 fwrite(r-&gt;<a class="code" href="structcont__ad__t.html#a719f5c6816cd0da0a31930a2e572b933" title="Circular buffer for maintaining A/D data read until consumed.">adbuf</a> + tail, <span class="keyword">sizeof</span>(int16), l, r-&gt;<a class="code" href="structcont__ad__t.html#af8cd2a7e0ef0f4e2c825c7812a091f9c" title="If non-NULL, raw audio input data processed by cont_ad is dumped to this file.">rawfp</a>);
<a name="l00779"></a>00779                 fflush(r-&gt;<a class="code" href="structcont__ad__t.html#af8cd2a7e0ef0f4e2c825c7812a091f9c" title="If non-NULL, raw audio input data processed by cont_ad is dumped to this file.">rawfp</a>);
<a name="l00780"></a>00780             }
<a name="l00781"></a>00781 
<a name="l00782"></a>00782             tail += l;
<a name="l00783"></a>00783             len += l;
<a name="l00784"></a>00784             r-&gt;<a class="code" href="structcont__ad__t.html#a7ae5362560d9edfa6c16555285487a7a" title="Number of samples of unconsumed data in adbuf.">n_sample</a> += l;
<a name="l00785"></a>00785         }
<a name="l00786"></a>00786     }
<a name="l00787"></a>00787 
<a name="l00788"></a>00788     <span class="keywordflow">return</span> len;
<a name="l00789"></a>00789 }
<a name="l00790"></a>00790 
<a name="l00791"></a>00791 <span class="comment">/*</span>
<a name="l00792"></a>00792 <span class="comment"> * Classify incoming frames as silence or speech.</span>
<a name="l00793"></a>00793 <span class="comment"> */</span>
<a name="l00794"></a>00794 int32
<a name="l00795"></a>00795 cont_ad_classify(<a class="code" href="structcont__ad__t.html" title="Continuous listening module or object Continuous listening module or object.">cont_ad_t</a> *r, int32 len)
<a name="l00796"></a>00796 {
<a name="l00797"></a>00797     int32 tailfrm;
<a name="l00798"></a>00798 
<a name="l00799"></a>00799     tailfrm = (r-&gt;<a class="code" href="structcont__ad__t.html#aa0617a92c549ac916258a54ec2cdc756" title="Frame number in adbuf with unconsumed A/D data.">headfrm</a> + r-&gt;<a class="code" href="structcont__ad__t.html#abed5c6e9a2e078b70fc4c30b667612b2" title="Number of complete frames of unconsumed A/D data in adbuf.">n_frm</a>);  <span class="comment">/* Next free frame slot to be filled */</span>
<a name="l00800"></a>00800     <span class="keywordflow">if</span> (tailfrm &gt;= CONT_AD_ADFRMSIZE)
<a name="l00801"></a>00801         tailfrm -= CONT_AD_ADFRMSIZE;
<a name="l00802"></a>00802 
<a name="l00803"></a>00803     <span class="keywordflow">for</span> (; len &gt;= r-&gt;<a class="code" href="structcont__ad__t.html#a55f701abf33b5f68f9ef4cbf95dfaf73" title="Samples/frame; audio level is analyzed within frames.">spf</a>; len -= r-&gt;<a class="code" href="structcont__ad__t.html#a55f701abf33b5f68f9ef4cbf95dfaf73" title="Samples/frame; audio level is analyzed within frames.">spf</a>) {
<a name="l00804"></a>00804         compute_frame_pow(r, tailfrm);
<a name="l00805"></a>00805         r-&gt;<a class="code" href="structcont__ad__t.html#abed5c6e9a2e078b70fc4c30b667612b2" title="Number of complete frames of unconsumed A/D data in adbuf.">n_frm</a>++;
<a name="l00806"></a>00806         r-&gt;<a class="code" href="structcont__ad__t.html#a4ed32427e6a785b571b1346c85481899" title="Total number of frames of A/D data read, including consumed ones.">tot_frm</a>++;
<a name="l00807"></a>00807 
<a name="l00808"></a>00808         <span class="comment">/*</span>
<a name="l00809"></a>00809 <span class="comment">         * Find speech/sil state change, if any.  Also, if staying in speech state</span>
<a name="l00810"></a>00810 <span class="comment">         * add this frame to current speech segment.</span>
<a name="l00811"></a>00811 <span class="comment">         */</span>
<a name="l00812"></a>00812         boundary_detect(r, tailfrm);
<a name="l00813"></a>00813 
<a name="l00814"></a>00814         <span class="keywordflow">if</span> (++tailfrm &gt;= CONT_AD_ADFRMSIZE)
<a name="l00815"></a>00815             tailfrm = 0;
<a name="l00816"></a>00816 
<a name="l00817"></a>00817         <span class="comment">/* Update thresholds if time to do so */</span>
<a name="l00818"></a>00818         <span class="keywordflow">if</span> (r-&gt;<a class="code" href="structcont__ad__t.html#a2168183b25add085cf3aa29ddab1c8ce" title="Number of frames before next update to pow_hist/thresholds.">thresh_update</a> &lt;= 0) {
<a name="l00819"></a>00819             int32 i, f;
<a name="l00820"></a>00820             find_thresh(r);
<a name="l00821"></a>00821             decay_hist(r);
<a name="l00822"></a>00822             r-&gt;<a class="code" href="structcont__ad__t.html#a2168183b25add085cf3aa29ddab1c8ce" title="Number of frames before next update to pow_hist/thresholds.">thresh_update</a> = CONT_AD_THRESH_UPDATE;
<a name="l00823"></a>00823 
<a name="l00824"></a>00824 <span class="preprocessor">#if 1</span>
<a name="l00825"></a>00825 <span class="preprocessor"></span>            <span class="comment">/*</span>
<a name="l00826"></a>00826 <span class="comment">             * Since threshold has been updated, recompute r-&gt;n_other.</span>
<a name="l00827"></a>00827 <span class="comment">             * (RKM: Is this really necessary?  Comment out??)</span>
<a name="l00828"></a>00828 <span class="comment">             */</span>
<a name="l00829"></a>00829             r-&gt;<a class="code" href="structcont__ad__t.html#a628e5b444bde5e0eb0dc7fe8731a31a6" title="If in SILENCE state, number of frames in analysis window considered to be speech; otherwise number of...">n_other</a> = 0;
<a name="l00830"></a>00830             <span class="keywordflow">if</span> (r-&gt;<a class="code" href="structcont__ad__t.html#ae52185e7f7dfe424060c0ff562a8858b" title="State at the end of its internal buffer (internal use): CONT_AD_STATE_SIL or CONT_AD_STATE_SPEECH.">tail_state</a> == CONT_AD_STATE_SIL) {
<a name="l00831"></a>00831                 <span class="keywordflow">for</span> (i = r-&gt;<a class="code" href="structcont__ad__t.html#a14ee16922e7287ad4ce8c51c6ddb74fc" title="Number of frames currently available from win_startfrm for analysis.">win_validfrm</a>, f = r-&gt;<a class="code" href="structcont__ad__t.html#a75bc7d23bfedfd79a2fd1e3ea2188e4c" title="Where next analysis window begins.">win_startfrm</a>; i &gt; 0; --i) {
<a name="l00832"></a>00832                     <span class="keywordflow">if</span> (r-&gt;<a class="code" href="structcont__ad__t.html#a18f146239c77ff4ca6157261acdf4083" title="Frame power.">frm_pow</a>[f] &gt;= r-&gt;<a class="code" href="structcont__ad__t.html#a0b9333d9acc41b5bfb67f69fc22ca901" title="Frame considered to be speech if power &amp;gt;= thresh_speech (for transitioning from SILENCE to SPEECH ...">thresh_speech</a>)
<a name="l00833"></a>00833                         r-&gt;<a class="code" href="structcont__ad__t.html#a628e5b444bde5e0eb0dc7fe8731a31a6" title="If in SILENCE state, number of frames in analysis window considered to be speech; otherwise number of...">n_other</a>++;
<a name="l00834"></a>00834 
<a name="l00835"></a>00835                     f++;
<a name="l00836"></a>00836                     <span class="keywordflow">if</span> (f &gt;= CONT_AD_ADFRMSIZE)
<a name="l00837"></a>00837                         f = 0;
<a name="l00838"></a>00838                 }
<a name="l00839"></a>00839             }
<a name="l00840"></a>00840             <span class="keywordflow">else</span> {
<a name="l00841"></a>00841                 <span class="keywordflow">for</span> (i = r-&gt;<a class="code" href="structcont__ad__t.html#a14ee16922e7287ad4ce8c51c6ddb74fc" title="Number of frames currently available from win_startfrm for analysis.">win_validfrm</a>, f = r-&gt;<a class="code" href="structcont__ad__t.html#a75bc7d23bfedfd79a2fd1e3ea2188e4c" title="Where next analysis window begins.">win_startfrm</a>; i &gt; 0; --i) {
<a name="l00842"></a>00842                     <span class="keywordflow">if</span> (r-&gt;<a class="code" href="structcont__ad__t.html#a18f146239c77ff4ca6157261acdf4083" title="Frame power.">frm_pow</a>[f] &lt;= r-&gt;<a class="code" href="structcont__ad__t.html#adbbe28dca87d06a3ca8d2390d08ea83a" title="Frame considered to be silence if power &amp;lt;= thresh_sil (for transitioning from SPEECH to SILENCE st...">thresh_sil</a>)
<a name="l00843"></a>00843                         r-&gt;<a class="code" href="structcont__ad__t.html#a628e5b444bde5e0eb0dc7fe8731a31a6" title="If in SILENCE state, number of frames in analysis window considered to be speech; otherwise number of...">n_other</a>++;
<a name="l00844"></a>00844 
<a name="l00845"></a>00845                     f++;
<a name="l00846"></a>00846                     <span class="keywordflow">if</span> (f &gt;= CONT_AD_ADFRMSIZE)
<a name="l00847"></a>00847                         f = 0;
<a name="l00848"></a>00848                 }
<a name="l00849"></a>00849             }
<a name="l00850"></a>00850 <span class="preprocessor">#endif</span>
<a name="l00851"></a>00851 <span class="preprocessor"></span>        }
<a name="l00852"></a>00852     }
<a name="l00853"></a>00853 
<a name="l00854"></a>00854     <span class="keywordflow">return</span> r-&gt;<a class="code" href="structcont__ad__t.html#ae52185e7f7dfe424060c0ff562a8858b" title="State at the end of its internal buffer (internal use): CONT_AD_STATE_SIL or CONT_AD_STATE_SPEECH.">tail_state</a>;
<a name="l00855"></a>00855 }
<a name="l00856"></a>00856 
<a name="l00857"></a>00857 <span class="comment">/*</span>
<a name="l00858"></a>00858 <span class="comment"> * Main function called by the application to filter out silence regions.</span>
<a name="l00859"></a>00859 <span class="comment"> * Maintains a linked list of speech segments pointing into r-&gt;adbuf and feeds</span>
<a name="l00860"></a>00860 <span class="comment"> * data to application from them.</span>
<a name="l00861"></a>00861 <span class="comment"> */</span>
<a name="l00862"></a>00862 int32
<a name="l00863"></a><a class="code" href="cont__ad_8h.html#ae664132adc514db01a1d5c1209ded4ba">00863</a> <a class="code" href="cont__ad_8h.html#ae664132adc514db01a1d5c1209ded4ba" title="Read raw audio data into the silence filter.">cont_ad_read</a>(<a class="code" href="structcont__ad__t.html" title="Continuous listening module or object Continuous listening module or object.">cont_ad_t</a> * r, int16 * buf, int32 max)
<a name="l00864"></a>00864 {
<a name="l00865"></a>00865     int32 flen, len, retval, newstate;
<a name="l00866"></a>00866     <a class="code" href="structspseg__t.html" title="(FOR INTERNAL USE ) Data structure for maintaining speech (non-silence) segments not yet consumed by ...">spseg_t</a> *seg;
<a name="l00867"></a>00867 
<a name="l00868"></a>00868     <span class="keywordflow">if</span> ((r == NULL) || (buf == NULL))
<a name="l00869"></a>00869         <span class="keywordflow">return</span> -1;
<a name="l00870"></a>00870 
<a name="l00871"></a>00871     <span class="keywordflow">if</span> (max &lt; r-&gt;spf) {
<a name="l00872"></a>00872         <a class="code" href="err_8h.html#a5f7b2f58f5a663a6bdd51f197ae21993" title="Print error message to standard error stream.">E_ERROR</a>
<a name="l00873"></a>00873             (<span class="stringliteral">&quot;cont_ad_read requires buffer of at least %d samples\n&quot;</span>,
<a name="l00874"></a>00874              r-&gt;<a class="code" href="structcont__ad__t.html#a55f701abf33b5f68f9ef4cbf95dfaf73" title="Samples/frame; audio level is analyzed within frames.">spf</a>);
<a name="l00875"></a>00875         <span class="keywordflow">return</span> -1;
<a name="l00876"></a>00876     }
<a name="l00877"></a>00877 
<a name="l00878"></a>00878     <span class="keywordflow">if</span> (r-&gt;<a class="code" href="structcont__ad__t.html#adbbb6765386309476549beb058a235c5" title="If non-NULL, write detailed logs of this object&amp;#39;s progress to the file.">logfp</a>) {
<a name="l00879"></a>00879         fprintf(r-&gt;<a class="code" href="structcont__ad__t.html#adbbb6765386309476549beb058a235c5" title="If non-NULL, write detailed logs of this object&amp;#39;s progress to the file.">logfp</a>, <span class="stringliteral">&quot;cont_ad_read(,, %d)\n&quot;</span>, max);
<a name="l00880"></a>00880         fflush(r-&gt;<a class="code" href="structcont__ad__t.html#adbbb6765386309476549beb058a235c5" title="If non-NULL, write detailed logs of this object&amp;#39;s progress to the file.">logfp</a>);
<a name="l00881"></a>00881     }
<a name="l00882"></a>00882 
<a name="l00883"></a>00883     <span class="comment">/* Read data from adfunc or from buf. */</span>
<a name="l00884"></a>00884     len = cont_ad_read_internal(r, buf, max);
<a name="l00885"></a>00885 
<a name="l00886"></a>00886     <span class="comment">/* Compute frame power for unprocessed+new data and find speech/silence boundaries */</span>
<a name="l00887"></a>00887     cont_ad_classify(r, len);
<a name="l00888"></a>00888 
<a name="l00889"></a>00889     <span class="comment">/*</span>
<a name="l00890"></a>00890 <span class="comment">     * If eof on input data source, cleanup the final segment.</span>
<a name="l00891"></a>00891 <span class="comment">     */</span>
<a name="l00892"></a>00892     <span class="keywordflow">if</span> (r-&gt;<a class="code" href="structcont__ad__t.html#af7b9044b76ed3b86ce74e4e7215ca4c3" title="Whether the source ad device has encountered EOF.">eof</a>) {
<a name="l00893"></a>00893         <span class="keywordflow">if</span> (r-&gt;<a class="code" href="structcont__ad__t.html#ae52185e7f7dfe424060c0ff562a8858b" title="State at the end of its internal buffer (internal use): CONT_AD_STATE_SIL or CONT_AD_STATE_SPEECH.">tail_state</a> == CONT_AD_STATE_SPEECH) {
<a name="l00894"></a>00894             <span class="comment">/*</span>
<a name="l00895"></a>00895 <span class="comment">             * Still inside a speech segment when input data got over.  Absort any</span>
<a name="l00896"></a>00896 <span class="comment">             * remaining frames into the final speech segment.</span>
<a name="l00897"></a>00897 <span class="comment">             */</span>
<a name="l00898"></a>00898             assert(r-&gt;<a class="code" href="structcont__ad__t.html#ac77e8f8bd27cea3b99238d9663455972" title="Last of unconsumed speech segments.">spseg_tail</a> != NULL);
<a name="l00899"></a>00899 
<a name="l00900"></a>00900             <span class="comment">/* Absorb frames still in analysis window into final speech seg */</span>
<a name="l00901"></a>00901             assert((r-&gt;<a class="code" href="structcont__ad__t.html#a14ee16922e7287ad4ce8c51c6ddb74fc" title="Number of frames currently available from win_startfrm for analysis.">win_validfrm</a> &gt;= 0)
<a name="l00902"></a>00902                    &amp;&amp; (r-&gt;<a class="code" href="structcont__ad__t.html#a14ee16922e7287ad4ce8c51c6ddb74fc" title="Number of frames currently available from win_startfrm for analysis.">win_validfrm</a> &lt; r-&gt;<a class="code" href="structcont__ad__t.html#a7c61513f48e8fbc9ab6b57db66dad7b9" title="how many frames to look at for speech det">winsize</a>));
<a name="l00903"></a>00903             r-&gt;<a class="code" href="structcont__ad__t.html#ac77e8f8bd27cea3b99238d9663455972" title="Last of unconsumed speech segments.">spseg_tail</a>-&gt;nfrm += r-&gt;<a class="code" href="structcont__ad__t.html#a14ee16922e7287ad4ce8c51c6ddb74fc" title="Number of frames currently available from win_startfrm for analysis.">win_validfrm</a>;
<a name="l00904"></a>00904 
<a name="l00905"></a>00905             r-&gt;<a class="code" href="structcont__ad__t.html#ae52185e7f7dfe424060c0ff562a8858b" title="State at the end of its internal buffer (internal use): CONT_AD_STATE_SIL or CONT_AD_STATE_SPEECH.">tail_state</a> = CONT_AD_STATE_SIL;
<a name="l00906"></a>00906         }
<a name="l00907"></a>00907 
<a name="l00908"></a>00908         r-&gt;<a class="code" href="structcont__ad__t.html#a75bc7d23bfedfd79a2fd1e3ea2188e4c" title="Where next analysis window begins.">win_startfrm</a> += r-&gt;<a class="code" href="structcont__ad__t.html#a14ee16922e7287ad4ce8c51c6ddb74fc" title="Number of frames currently available from win_startfrm for analysis.">win_validfrm</a>;
<a name="l00909"></a>00909         <span class="keywordflow">if</span> (r-&gt;<a class="code" href="structcont__ad__t.html#a75bc7d23bfedfd79a2fd1e3ea2188e4c" title="Where next analysis window begins.">win_startfrm</a> &gt;= CONT_AD_ADFRMSIZE)
<a name="l00910"></a>00910             r-&gt;<a class="code" href="structcont__ad__t.html#a75bc7d23bfedfd79a2fd1e3ea2188e4c" title="Where next analysis window begins.">win_startfrm</a> -= CONT_AD_ADFRMSIZE;
<a name="l00911"></a>00911         r-&gt;<a class="code" href="structcont__ad__t.html#a14ee16922e7287ad4ce8c51c6ddb74fc" title="Number of frames currently available from win_startfrm for analysis.">win_validfrm</a> = 0;
<a name="l00912"></a>00912         r-&gt;<a class="code" href="structcont__ad__t.html#a628e5b444bde5e0eb0dc7fe8731a31a6" title="If in SILENCE state, number of frames in analysis window considered to be speech; otherwise number of...">n_other</a> = 0;
<a name="l00913"></a>00913     }
<a name="l00914"></a>00914 
<a name="l00915"></a>00915     <span class="comment">/*</span>
<a name="l00916"></a>00916 <span class="comment">     * At last ready to copy speech data, if any, into caller&#39;s buffer.  Raw</span>
<a name="l00917"></a>00917 <span class="comment">     * speech data is segmented into alternating speech and silence segments.</span>
<a name="l00918"></a>00918 <span class="comment">     * But any single call to cont_ad_read will never cross a speech/silence</span>
<a name="l00919"></a>00919 <span class="comment">     * boundary.</span>
<a name="l00920"></a>00920 <span class="comment">     */</span>
<a name="l00921"></a>00921     seg = r-&gt;<a class="code" href="structcont__ad__t.html#abffe61140bc2a02ae4222183b3ef6159" title="First of unconsumed speech segments.">spseg_head</a>;        <span class="comment">/* first speech segment available, if any */</span>
<a name="l00922"></a>00922 
<a name="l00923"></a>00923     <span class="keywordflow">if</span> ((seg == NULL) || (r-&gt;<a class="code" href="structcont__ad__t.html#aa0617a92c549ac916258a54ec2cdc756" title="Frame number in adbuf with unconsumed A/D data.">headfrm</a> != seg-&gt;startfrm)) {
<a name="l00924"></a>00924         <span class="comment">/*</span>
<a name="l00925"></a>00925 <span class="comment">         * Either no speech data available, or inside a silence segment.  Find</span>
<a name="l00926"></a>00926 <span class="comment">         * length of silence segment.</span>
<a name="l00927"></a>00927 <span class="comment">         */</span>
<a name="l00928"></a>00928         <span class="keywordflow">if</span> (seg == NULL) {
<a name="l00929"></a>00929             assert(r-&gt;<a class="code" href="structcont__ad__t.html#ae52185e7f7dfe424060c0ff562a8858b" title="State at the end of its internal buffer (internal use): CONT_AD_STATE_SIL or CONT_AD_STATE_SPEECH.">tail_state</a> == CONT_AD_STATE_SIL);
<a name="l00930"></a>00930 
<a name="l00931"></a>00931             flen =
<a name="l00932"></a>00932                 (r-&gt;<a class="code" href="structcont__ad__t.html#af7b9044b76ed3b86ce74e4e7215ca4c3" title="Whether the source ad device has encountered EOF.">eof</a>) ? r-&gt;<a class="code" href="structcont__ad__t.html#abed5c6e9a2e078b70fc4c30b667612b2" title="Number of complete frames of unconsumed A/D data in adbuf.">n_frm</a> : r-&gt;<a class="code" href="structcont__ad__t.html#abed5c6e9a2e078b70fc4c30b667612b2" title="Number of complete frames of unconsumed A/D data in adbuf.">n_frm</a> - (r-&gt;<a class="code" href="structcont__ad__t.html#a7c61513f48e8fbc9ab6b57db66dad7b9" title="how many frames to look at for speech det">winsize</a> +
<a name="l00933"></a>00933                                                   r-&gt;<a class="code" href="structcont__ad__t.html#a0d42e3ac6c1e5c59c86a40f4cf26a861" title="pad beggining of speech with this many extra frms">leader</a> - 1);
<a name="l00934"></a>00934             <span class="keywordflow">if</span> (flen &lt; 0)
<a name="l00935"></a>00935                 flen = 0;
<a name="l00936"></a>00936         }
<a name="l00937"></a>00937         <span class="keywordflow">else</span> {
<a name="l00938"></a>00938             flen = seg-&gt;startfrm - r-&gt;<a class="code" href="structcont__ad__t.html#aa0617a92c549ac916258a54ec2cdc756" title="Frame number in adbuf with unconsumed A/D data.">headfrm</a>;
<a name="l00939"></a>00939             <span class="keywordflow">if</span> (flen &lt; 0)
<a name="l00940"></a>00940                 flen += CONT_AD_ADFRMSIZE;
<a name="l00941"></a>00941         }
<a name="l00942"></a>00942 
<a name="l00943"></a>00943         <span class="keywordflow">if</span> (r-&gt;<a class="code" href="structcont__ad__t.html#a7726e8ea1bcca281a39c4b27bbb115e3" title="Pass all input data through, without filtering silence.">rawmode</a>) {
<a name="l00944"></a>00944             <span class="comment">/* Restrict silence segment to user buffer size, integral #frames */</span>
<a name="l00945"></a>00945             int32 f = max / r-&gt;<a class="code" href="structcont__ad__t.html#a55f701abf33b5f68f9ef4cbf95dfaf73" title="Samples/frame; audio level is analyzed within frames.">spf</a>;
<a name="l00946"></a>00946             <span class="keywordflow">if</span> (flen &gt; f)
<a name="l00947"></a>00947                 flen = f;
<a name="l00948"></a>00948         }
<a name="l00949"></a>00949 
<a name="l00950"></a>00950         newstate = CONT_AD_STATE_SIL;
<a name="l00951"></a>00951     }
<a name="l00952"></a>00952     <span class="keywordflow">else</span> {
<a name="l00953"></a>00953         flen = max / r-&gt;<a class="code" href="structcont__ad__t.html#a55f701abf33b5f68f9ef4cbf95dfaf73" title="Samples/frame; audio level is analyzed within frames.">spf</a>;    <span class="comment">/* truncate read-size to integral #frames */</span>
<a name="l00954"></a>00954         <span class="keywordflow">if</span> (flen &gt; seg-&gt;nfrm)
<a name="l00955"></a>00955             flen = seg-&gt;nfrm;   <span class="comment">/* truncate further to this segment size */</span>
<a name="l00956"></a>00956 
<a name="l00957"></a>00957         newstate = CONT_AD_STATE_SPEECH;
<a name="l00958"></a>00958     }
<a name="l00959"></a>00959 
<a name="l00960"></a>00960     len = flen * r-&gt;<a class="code" href="structcont__ad__t.html#a55f701abf33b5f68f9ef4cbf95dfaf73" title="Samples/frame; audio level is analyzed within frames.">spf</a>;        <span class="comment">/* #samples being consumed */</span>
<a name="l00961"></a>00961 
<a name="l00962"></a>00962     r-&gt;<a class="code" href="structcont__ad__t.html#a5524c052dcd0a3d1a1c3b1fc2134b62e" title="Max signal level for the data consumed by the most recent cont_ad_read call (dB range: 0-99)...">siglvl</a> = max_siglvl(r, r-&gt;<a class="code" href="structcont__ad__t.html#aa0617a92c549ac916258a54ec2cdc756" title="Frame number in adbuf with unconsumed A/D data.">headfrm</a>, flen);
<a name="l00963"></a>00963 
<a name="l00964"></a>00964     <span class="keywordflow">if</span> ((newstate == CONT_AD_STATE_SIL) &amp;&amp; (!r-&gt;<a class="code" href="structcont__ad__t.html#a7726e8ea1bcca281a39c4b27bbb115e3" title="Pass all input data through, without filtering silence.">rawmode</a>)) {
<a name="l00965"></a>00965         <span class="comment">/* Skip silence data */</span>
<a name="l00966"></a>00966         r-&gt;<a class="code" href="structcont__ad__t.html#aa0617a92c549ac916258a54ec2cdc756" title="Frame number in adbuf with unconsumed A/D data.">headfrm</a> += flen;
<a name="l00967"></a>00967         <span class="keywordflow">if</span> (r-&gt;<a class="code" href="structcont__ad__t.html#aa0617a92c549ac916258a54ec2cdc756" title="Frame number in adbuf with unconsumed A/D data.">headfrm</a> &gt;= CONT_AD_ADFRMSIZE)
<a name="l00968"></a>00968             r-&gt;<a class="code" href="structcont__ad__t.html#aa0617a92c549ac916258a54ec2cdc756" title="Frame number in adbuf with unconsumed A/D data.">headfrm</a> -= CONT_AD_ADFRMSIZE;
<a name="l00969"></a>00969 
<a name="l00970"></a>00970         retval = 0;             <span class="comment">/* #samples being copied/returned */</span>
<a name="l00971"></a>00971     }
<a name="l00972"></a>00972     <span class="keywordflow">else</span> {
<a name="l00973"></a>00973         <span class="comment">/* Copy speech/silence(in rawmode) data */</span>
<a name="l00974"></a>00974         r-&gt;<a class="code" href="structcont__ad__t.html#aa0617a92c549ac916258a54ec2cdc756" title="Frame number in adbuf with unconsumed A/D data.">headfrm</a> = buf_copy(r, r-&gt;<a class="code" href="structcont__ad__t.html#aa0617a92c549ac916258a54ec2cdc756" title="Frame number in adbuf with unconsumed A/D data.">headfrm</a>, flen, buf);
<a name="l00975"></a>00975 
<a name="l00976"></a>00976         retval = len;           <span class="comment">/* #samples being copied/returned */</span>
<a name="l00977"></a>00977     }
<a name="l00978"></a>00978 
<a name="l00979"></a>00979     r-&gt;<a class="code" href="structcont__ad__t.html#abed5c6e9a2e078b70fc4c30b667612b2" title="Number of complete frames of unconsumed A/D data in adbuf.">n_frm</a> -= flen;
<a name="l00980"></a>00980     r-&gt;<a class="code" href="structcont__ad__t.html#a7ae5362560d9edfa6c16555285487a7a" title="Number of samples of unconsumed data in adbuf.">n_sample</a> -= len;
<a name="l00981"></a>00981     assert((r-&gt;<a class="code" href="structcont__ad__t.html#abed5c6e9a2e078b70fc4c30b667612b2" title="Number of complete frames of unconsumed A/D data in adbuf.">n_frm</a> &gt;= 0) &amp;&amp; (r-&gt;<a class="code" href="structcont__ad__t.html#a7ae5362560d9edfa6c16555285487a7a" title="Number of samples of unconsumed data in adbuf.">n_sample</a> &gt;= 0));
<a name="l00982"></a>00982     assert(r-&gt;<a class="code" href="structcont__ad__t.html#a14ee16922e7287ad4ce8c51c6ddb74fc" title="Number of frames currently available from win_startfrm for analysis.">win_validfrm</a> &lt;= r-&gt;<a class="code" href="structcont__ad__t.html#abed5c6e9a2e078b70fc4c30b667612b2" title="Number of complete frames of unconsumed A/D data in adbuf.">n_frm</a>);
<a name="l00983"></a>00983 
<a name="l00984"></a>00984     <span class="keywordflow">if</span> (r-&gt;<a class="code" href="structcont__ad__t.html#a5d9420ea711733d1eea9b8f29a638fdb" title="State of data returned by most recent cont_ad_read call; CONT_AD_STATE_SIL or CONT_AD_STATE_SPEECH.">state</a> == newstate)
<a name="l00985"></a>00985         r-&gt;<a class="code" href="structcont__ad__t.html#a478939247e09a8ae142c8996ec17d8c8" title="Total no.">seglen</a> += len;
<a name="l00986"></a>00986     <span class="keywordflow">else</span>
<a name="l00987"></a>00987         r-&gt;<a class="code" href="structcont__ad__t.html#a478939247e09a8ae142c8996ec17d8c8" title="Total no.">seglen</a> = len;
<a name="l00988"></a>00988     r-&gt;<a class="code" href="structcont__ad__t.html#a5d9420ea711733d1eea9b8f29a638fdb" title="State of data returned by most recent cont_ad_read call; CONT_AD_STATE_SIL or CONT_AD_STATE_SPEECH.">state</a> = newstate;
<a name="l00989"></a>00989 
<a name="l00990"></a>00990     <span class="keywordflow">if</span> (newstate == CONT_AD_STATE_SPEECH) {
<a name="l00991"></a>00991         seg-&gt;startfrm = r-&gt;<a class="code" href="structcont__ad__t.html#aa0617a92c549ac916258a54ec2cdc756" title="Frame number in adbuf with unconsumed A/D data.">headfrm</a>;
<a name="l00992"></a>00992         assert(seg-&gt;startfrm &gt;= 0);
<a name="l00993"></a>00993         seg-&gt;nfrm -= flen;
<a name="l00994"></a>00994 
<a name="l00995"></a>00995         <span class="comment">/* Free seg if empty and not recording into it */</span>
<a name="l00996"></a>00996         <span class="keywordflow">if</span> ((seg-&gt;nfrm == 0)
<a name="l00997"></a>00997             &amp;&amp; (seg-&gt;next || (r-&gt;<a class="code" href="structcont__ad__t.html#ae52185e7f7dfe424060c0ff562a8858b" title="State at the end of its internal buffer (internal use): CONT_AD_STATE_SIL or CONT_AD_STATE_SPEECH.">tail_state</a> == CONT_AD_STATE_SIL))) {
<a name="l00998"></a>00998             r-&gt;<a class="code" href="structcont__ad__t.html#abffe61140bc2a02ae4222183b3ef6159" title="First of unconsumed speech segments.">spseg_head</a> = seg-&gt;next;
<a name="l00999"></a>00999             <span class="keywordflow">if</span> (seg-&gt;next == NULL)
<a name="l01000"></a>01000                 r-&gt;<a class="code" href="structcont__ad__t.html#ac77e8f8bd27cea3b99238d9663455972" title="Last of unconsumed speech segments.">spseg_tail</a> = NULL;
<a name="l01001"></a>01001             free(seg);
<a name="l01002"></a>01002         }
<a name="l01003"></a>01003     }
<a name="l01004"></a>01004 
<a name="l01005"></a>01005     <span class="comment">/* Update timestamp.  Total raw A/D read - those remaining to be consumed */</span>
<a name="l01006"></a>01006     r-&gt;<a class="code" href="structcont__ad__t.html#a7b71e87abfcb3ca4ae73af34c86f955e" title="Absolute timestamp (total no.">read_ts</a> = (r-&gt;<a class="code" href="structcont__ad__t.html#a4ed32427e6a785b571b1346c85481899" title="Total number of frames of A/D data read, including consumed ones.">tot_frm</a> - r-&gt;<a class="code" href="structcont__ad__t.html#abed5c6e9a2e078b70fc4c30b667612b2" title="Number of complete frames of unconsumed A/D data in adbuf.">n_frm</a>) * r-&gt;<a class="code" href="structcont__ad__t.html#a55f701abf33b5f68f9ef4cbf95dfaf73" title="Samples/frame; audio level is analyzed within frames.">spf</a>;
<a name="l01007"></a>01007 
<a name="l01008"></a>01008     if (retval == 0)
<a name="l01009"></a>01009         retval = (r-&gt;<a class="code" href="structcont__ad__t.html#af7b9044b76ed3b86ce74e4e7215ca4c3" title="Whether the source ad device has encountered EOF.">eof</a> &amp;&amp; (r-&gt;<a class="code" href="structcont__ad__t.html#abffe61140bc2a02ae4222183b3ef6159" title="First of unconsumed speech segments.">spseg_head</a> == NULL)) ? -1 : 0;
<a name="l01010"></a>01010 
<a name="l01011"></a>01011     <span class="keywordflow">if</span> (r-&gt;<a class="code" href="structcont__ad__t.html#adbbb6765386309476549beb058a235c5" title="If non-NULL, write detailed logs of this object&amp;#39;s progress to the file.">logfp</a>)
<a name="l01012"></a>01012         cont_ad_read_log(r, retval);
<a name="l01013"></a>01013 
<a name="l01014"></a>01014     <span class="keywordflow">return</span> retval;
<a name="l01015"></a>01015 }
<a name="l01016"></a>01016 
<a name="l01017"></a>01017 
<a name="l01018"></a>01018 <span class="comment">/*</span>
<a name="l01019"></a>01019 <span class="comment"> * Calibrate input channel for silence threshold.</span>
<a name="l01020"></a>01020 <span class="comment"> */</span>
<a name="l01021"></a>01021 int32
<a name="l01022"></a><a class="code" href="cont__ad_8h.html#a7a1d0eaf8292a4549b00a97163999321">01022</a> <a class="code" href="cont__ad_8h.html#a7a1d0eaf8292a4549b00a97163999321" title="Calibrate the silence filter.">cont_ad_calib</a>(<a class="code" href="structcont__ad__t.html" title="Continuous listening module or object Continuous listening module or object.">cont_ad_t</a> * r)
<a name="l01023"></a>01023 {
<a name="l01024"></a>01024     int32 i, s, k, len, tailfrm;
<a name="l01025"></a>01025 
<a name="l01026"></a>01026     <span class="keywordflow">if</span> (r == NULL)
<a name="l01027"></a>01027         <span class="keywordflow">return</span> -1;
<a name="l01028"></a>01028 
<a name="l01029"></a>01029     <span class="comment">/* clear histogram */</span>
<a name="l01030"></a>01030     <span class="keywordflow">for</span> (i = 0; i &lt; CONT_AD_POWHISTSIZE; i++)
<a name="l01031"></a>01031         r-&gt;<a class="code" href="structcont__ad__t.html#a01f61a105019bea12533db84351d07b9" title="Histogram of frame power, moving window, decayed.">pow_hist</a>[i] = 0;
<a name="l01032"></a>01032     tailfrm = r-&gt;<a class="code" href="structcont__ad__t.html#aa0617a92c549ac916258a54ec2cdc756" title="Frame number in adbuf with unconsumed A/D data.">headfrm</a> + r-&gt;<a class="code" href="structcont__ad__t.html#abed5c6e9a2e078b70fc4c30b667612b2" title="Number of complete frames of unconsumed A/D data in adbuf.">n_frm</a>;
<a name="l01033"></a>01033     if (tailfrm &gt;= CONT_AD_ADFRMSIZE)
<a name="l01034"></a>01034         tailfrm -= CONT_AD_ADFRMSIZE;
<a name="l01035"></a>01035     s = (tailfrm * r-&gt;<a class="code" href="structcont__ad__t.html#a55f701abf33b5f68f9ef4cbf95dfaf73" title="Samples/frame; audio level is analyzed within frames.">spf</a>);
<a name="l01036"></a>01036 
<a name="l01037"></a>01037     <span class="keywordflow">for</span> (r-&gt;<a class="code" href="structcont__ad__t.html#ac6e6809727ddc78a13674478d5b527db" title="Number of frames of calibration data seen so far.">n_calib_frame</a> = 0;
<a name="l01038"></a>01038          r-&gt;<a class="code" href="structcont__ad__t.html#ac6e6809727ddc78a13674478d5b527db" title="Number of frames of calibration data seen so far.">n_calib_frame</a> &lt; CONT_AD_CALIB_FRAMES;
<a name="l01039"></a>01039          ++r-&gt;<a class="code" href="structcont__ad__t.html#ac6e6809727ddc78a13674478d5b527db" title="Number of frames of calibration data seen so far.">n_calib_frame</a>) {
<a name="l01040"></a>01040         len = r-&gt;<a class="code" href="structcont__ad__t.html#a55f701abf33b5f68f9ef4cbf95dfaf73" title="Samples/frame; audio level is analyzed within frames.">spf</a>;
<a name="l01041"></a>01041         <span class="keywordflow">while</span> (len &gt; 0) {
<a name="l01042"></a>01042             <span class="comment">/*Trouble */</span>
<a name="l01043"></a>01043             <span class="keywordflow">if</span> ((k = (*(r-&gt;adfunc)) (r-&gt;<a class="code" href="structcont__ad__t.html#aae5b9d977e62424b0cf0e245485b20a0" title="A/D device argument for adfunc.">ad</a>, r-&gt;<a class="code" href="structcont__ad__t.html#a719f5c6816cd0da0a31930a2e572b933" title="Circular buffer for maintaining A/D data read until consumed.">adbuf</a> + s, len)) &lt; 0)
<a name="l01044"></a>01044                 <span class="keywordflow">return</span> -1;
<a name="l01045"></a>01045             len -= k;
<a name="l01046"></a>01046             s += k;
<a name="l01047"></a>01047         }
<a name="l01048"></a>01048         s -= r-&gt;<a class="code" href="structcont__ad__t.html#a55f701abf33b5f68f9ef4cbf95dfaf73" title="Samples/frame; audio level is analyzed within frames.">spf</a>;
<a name="l01049"></a>01049 
<a name="l01050"></a>01050         compute_frame_pow(r, tailfrm);
<a name="l01051"></a>01051     }
<a name="l01052"></a>01052 
<a name="l01053"></a>01053     r-&gt;<a class="code" href="structcont__ad__t.html#a2168183b25add085cf3aa29ddab1c8ce" title="Number of frames before next update to pow_hist/thresholds.">thresh_update</a> = CONT_AD_THRESH_UPDATE;
<a name="l01054"></a>01054     <span class="keywordflow">return</span> find_thresh(r);
<a name="l01055"></a>01055 }
<a name="l01056"></a>01056 
<a name="l01057"></a>01057 int32
<a name="l01058"></a><a class="code" href="cont__ad_8h.html#a6a86e16fb673748be753e2a281ce837a">01058</a> <a class="code" href="cont__ad_8h.html#a6a86e16fb673748be753e2a281ce837a" title="Get the number of samples required to calibrate the silence filter.">cont_ad_calib_size</a>(<a class="code" href="structcont__ad__t.html" title="Continuous listening module or object Continuous listening module or object.">cont_ad_t</a> *r)
<a name="l01059"></a>01059 {
<a name="l01060"></a>01060     <span class="keywordflow">return</span> r-&gt;<a class="code" href="structcont__ad__t.html#a55f701abf33b5f68f9ef4cbf95dfaf73" title="Samples/frame; audio level is analyzed within frames.">spf</a> * CONT_AD_CALIB_FRAMES;
<a name="l01061"></a>01061 }
<a name="l01062"></a>01062 
<a name="l01063"></a>01063 int32
<a name="l01064"></a><a class="code" href="cont__ad_8h.html#a8a575044cf22d96a5ec8fb20410b0065">01064</a> <a class="code" href="cont__ad_8h.html#a8a575044cf22d96a5ec8fb20410b0065" title="Calibrate the silence filter without an audio device.">cont_ad_calib_loop</a>(<a class="code" href="structcont__ad__t.html" title="Continuous listening module or object Continuous listening module or object.">cont_ad_t</a> * r, int16 * buf, int32 max)
<a name="l01065"></a>01065 {
<a name="l01066"></a>01066     int32 i, s, len, tailfrm;
<a name="l01067"></a>01067 
<a name="l01068"></a>01068     <span class="keywordflow">if</span> (r-&gt;<a class="code" href="structcont__ad__t.html#ac6e6809727ddc78a13674478d5b527db" title="Number of frames of calibration data seen so far.">n_calib_frame</a> == CONT_AD_CALIB_FRAMES) {
<a name="l01069"></a>01069         <span class="comment">/* If calibration previously succeeded, then this is a</span>
<a name="l01070"></a>01070 <span class="comment">         * recalibration, so start again. */</span>
<a name="l01071"></a>01071         r-&gt;<a class="code" href="structcont__ad__t.html#ac6e6809727ddc78a13674478d5b527db" title="Number of frames of calibration data seen so far.">n_calib_frame</a> = 0;
<a name="l01072"></a>01072         <span class="comment">/* clear histogram */</span>
<a name="l01073"></a>01073         <span class="keywordflow">for</span> (i = 0; i &lt; CONT_AD_POWHISTSIZE; i++)
<a name="l01074"></a>01074             r-&gt;<a class="code" href="structcont__ad__t.html#a01f61a105019bea12533db84351d07b9" title="Histogram of frame power, moving window, decayed.">pow_hist</a>[i] = 0;
<a name="l01075"></a>01075     }
<a name="l01076"></a>01076 
<a name="l01077"></a>01077     tailfrm = r-&gt;<a class="code" href="structcont__ad__t.html#aa0617a92c549ac916258a54ec2cdc756" title="Frame number in adbuf with unconsumed A/D data.">headfrm</a> + r-&gt;<a class="code" href="structcont__ad__t.html#abed5c6e9a2e078b70fc4c30b667612b2" title="Number of complete frames of unconsumed A/D data in adbuf.">n_frm</a>;
<a name="l01078"></a>01078     <span class="keywordflow">if</span> (tailfrm &gt;= CONT_AD_ADFRMSIZE)
<a name="l01079"></a>01079         tailfrm -= CONT_AD_ADFRMSIZE;
<a name="l01080"></a>01080     s = (tailfrm * r-&gt;<a class="code" href="structcont__ad__t.html#a55f701abf33b5f68f9ef4cbf95dfaf73" title="Samples/frame; audio level is analyzed within frames.">spf</a>);
<a name="l01081"></a>01081 
<a name="l01082"></a>01082     len = r-&gt;<a class="code" href="structcont__ad__t.html#a55f701abf33b5f68f9ef4cbf95dfaf73" title="Samples/frame; audio level is analyzed within frames.">spf</a>;
<a name="l01083"></a>01083     <span class="keywordflow">for</span> (; r-&gt;<a class="code" href="structcont__ad__t.html#ac6e6809727ddc78a13674478d5b527db" title="Number of frames of calibration data seen so far.">n_calib_frame</a> &lt; CONT_AD_CALIB_FRAMES;
<a name="l01084"></a>01084          ++r-&gt;<a class="code" href="structcont__ad__t.html#ac6e6809727ddc78a13674478d5b527db" title="Number of frames of calibration data seen so far.">n_calib_frame</a>) {
<a name="l01085"></a>01085         <span class="keywordflow">if</span> (max &lt; len)
<a name="l01086"></a>01086             <span class="keywordflow">return</span> 1;
<a name="l01087"></a>01087         memcpy(r-&gt;<a class="code" href="structcont__ad__t.html#a719f5c6816cd0da0a31930a2e572b933" title="Circular buffer for maintaining A/D data read until consumed.">adbuf</a> + s, buf, len * <span class="keyword">sizeof</span>(int16));
<a name="l01088"></a>01088         max -= len;
<a name="l01089"></a>01089         buf += len;
<a name="l01090"></a>01090         compute_frame_pow(r, tailfrm);
<a name="l01091"></a>01091     }
<a name="l01092"></a>01092 
<a name="l01093"></a>01093     r-&gt;<a class="code" href="structcont__ad__t.html#a2168183b25add085cf3aa29ddab1c8ce" title="Number of frames before next update to pow_hist/thresholds.">thresh_update</a> = CONT_AD_THRESH_UPDATE;
<a name="l01094"></a>01094     <span class="keywordflow">return</span> find_thresh(r);
<a name="l01095"></a>01095 }
<a name="l01096"></a>01096 
<a name="l01097"></a>01097 
<a name="l01098"></a>01098 <span class="comment">/* PWP 1/14/98 -- modified for compatibility with old code */</span>
<a name="l01099"></a>01099 int32
<a name="l01100"></a><a class="code" href="cont__ad_8h.html#af9a8f9f66bbfd1ce48fe9366fafcc40d">01100</a> <a class="code" href="cont__ad_8h.html#af9a8f9f66bbfd1ce48fe9366fafcc40d" title="Set silence and speech threshold parameters.">cont_ad_set_thresh</a>(<a class="code" href="structcont__ad__t.html" title="Continuous listening module or object Continuous listening module or object.">cont_ad_t</a> * r, int32 sil, int32 speech)
<a name="l01101"></a>01101 {
<a name="l01102"></a>01102     <span class="keywordflow">if</span> (r == NULL)
<a name="l01103"></a>01103         <span class="keywordflow">return</span> -1;
<a name="l01104"></a>01104 
<a name="l01105"></a>01105     <span class="keywordflow">if</span> ((sil &lt; 0) || (speech &lt; 0)) {
<a name="l01106"></a>01106         fprintf(stderr,
<a name="l01107"></a>01107                 <span class="stringliteral">&quot;cont_ad_set_thresh: invalid threshold arguments: %d, %d\n&quot;</span>,
<a name="l01108"></a>01108                 sil, speech);
<a name="l01109"></a>01109         <span class="keywordflow">return</span> -1;
<a name="l01110"></a>01110     }
<a name="l01111"></a>01111     r-&gt;<a class="code" href="structcont__ad__t.html#a74a6f56fb4cbde7fc789c9b463cf2f8f" title="Max silence power/frame ABOVE noise level.">delta_sil</a> = (3 * sil) / 2;
<a name="l01112"></a>01112     r-&gt;<a class="code" href="structcont__ad__t.html#afca0f69a21d9f28c9610fcefc0e7cb10" title="Min speech power/frame ABOVE noise level.">delta_speech</a> = (3 * speech) / 2;
<a name="l01113"></a>01113 
<a name="l01114"></a>01114     <span class="keywordflow">return</span> 0;
<a name="l01115"></a>01115 }
<a name="l01116"></a>01116 
<a name="l01117"></a>01117 
<a name="l01118"></a>01118 <span class="comment">/*</span>
<a name="l01119"></a>01119 <span class="comment"> * PWP 1/14/98 -- set the changable params.</span>
<a name="l01120"></a>01120 <span class="comment"> *</span>
<a name="l01121"></a>01121 <span class="comment"> *   delta_sil, delta_speech, min_noise, and max_noise are in dB,</span>
<a name="l01122"></a>01122 <span class="comment"> *   winsize, speech_onset, sil_onset, leader and trailer are in frames of</span>
<a name="l01123"></a>01123 <span class="comment"> *   16 ms length (256 samples @ 16kHz sampling).</span>
<a name="l01124"></a>01124 <span class="comment"> */</span>
<a name="l01125"></a>01125 int32
<a name="l01126"></a><a class="code" href="cont__ad_8h.html#aa402397c575922ea352afe5e66c02a34">01126</a> <a class="code" href="cont__ad_8h.html#aa402397c575922ea352afe5e66c02a34" title="Set the changable parameters.">cont_ad_set_params</a>(<a class="code" href="structcont__ad__t.html" title="Continuous listening module or object Continuous listening module or object.">cont_ad_t</a> * r, int32 delta_sil,
<a name="l01127"></a>01127                    int32 delta_speech, int32 min_noise,
<a name="l01128"></a>01128                    int32 max_noise, int32 winsize,
<a name="l01129"></a>01129                    int32 speech_onset, int32 sil_onset, int32 leader,
<a name="l01130"></a>01130                    int32 trailer, float32 adapt_rate)
<a name="l01131"></a>01131 {
<a name="l01132"></a>01132     <span class="keywordflow">if</span> ((delta_sil &lt; 0) || (delta_speech &lt; 0) || (min_noise &lt; 0)
<a name="l01133"></a>01133         || (max_noise &lt; 0)) {
<a name="l01134"></a>01134         <a class="code" href="err_8h.html#a5f7b2f58f5a663a6bdd51f197ae21993" title="Print error message to standard error stream.">E_ERROR</a>(<span class="stringliteral">&quot;threshold arguments: &quot;</span>
<a name="l01135"></a>01135                 <span class="stringliteral">&quot;%d, %d, %d, %d must all be &gt;=0\n&quot;</span>, delta_sil,
<a name="l01136"></a>01136                 delta_speech, min_noise, max_noise);
<a name="l01137"></a>01137         <span class="keywordflow">return</span> -1;
<a name="l01138"></a>01138     }
<a name="l01139"></a>01139 
<a name="l01140"></a>01140     <span class="keywordflow">if</span> ((speech_onset &gt; winsize) || (speech_onset &lt;= 0)
<a name="l01141"></a>01141         || (winsize &lt;= 0)) {
<a name="l01142"></a>01142         <a class="code" href="err_8h.html#a5f7b2f58f5a663a6bdd51f197ae21993" title="Print error message to standard error stream.">E_ERROR</a>
<a name="l01143"></a>01143             (<span class="stringliteral">&quot;speech_onset, %d, must be &lt;= winsize, %d, and both &gt;0\n&quot;</span>,
<a name="l01144"></a>01144              speech_onset, winsize);
<a name="l01145"></a>01145         <span class="keywordflow">return</span> -1;
<a name="l01146"></a>01146     }
<a name="l01147"></a>01147 
<a name="l01148"></a>01148     <span class="keywordflow">if</span> ((sil_onset &gt; winsize) || (sil_onset &lt;= 0) || (winsize &lt;= 0)) {
<a name="l01149"></a>01149         <a class="code" href="err_8h.html#a5f7b2f58f5a663a6bdd51f197ae21993" title="Print error message to standard error stream.">E_ERROR</a>
<a name="l01150"></a>01150             (<span class="stringliteral">&quot;sil_onset, %d, must be &lt;= winsize, %d, and both &gt;0\n&quot;</span>,
<a name="l01151"></a>01151              sil_onset, winsize);
<a name="l01152"></a>01152         <span class="keywordflow">return</span> -1;
<a name="l01153"></a>01153     }
<a name="l01154"></a>01154 
<a name="l01155"></a>01155     <span class="keywordflow">if</span> (((leader + trailer) &gt; winsize) || (leader &lt;= 0)
<a name="l01156"></a>01156         || (trailer &lt;= 0)) {
<a name="l01157"></a>01157         <a class="code" href="err_8h.html#a5f7b2f58f5a663a6bdd51f197ae21993" title="Print error message to standard error stream.">E_ERROR</a>
<a name="l01158"></a>01158             (<span class="stringliteral">&quot;leader, %d, plus trailer, %d, must be &lt;= winsize, %d, and both &gt;0\n&quot;</span>,
<a name="l01159"></a>01159              leader, trailer, winsize);
<a name="l01160"></a>01160         <span class="keywordflow">return</span> -1;
<a name="l01161"></a>01161     }
<a name="l01162"></a>01162 
<a name="l01163"></a>01163     <span class="keywordflow">if</span> ((adapt_rate &lt; 0.0) || (adapt_rate &gt; 1.0)) {
<a name="l01164"></a>01164         <a class="code" href="err_8h.html#a5f7b2f58f5a663a6bdd51f197ae21993" title="Print error message to standard error stream.">E_ERROR</a>(<span class="stringliteral">&quot;adapt_rate, %e; must be in range 0..1\n&quot;</span>, adapt_rate);
<a name="l01165"></a>01165         <span class="keywordflow">return</span> -1;
<a name="l01166"></a>01166     }
<a name="l01167"></a>01167 
<a name="l01168"></a>01168     <span class="keywordflow">if</span> (r == NULL)
<a name="l01169"></a>01169         <span class="keywordflow">return</span> -1;
<a name="l01170"></a>01170 
<a name="l01171"></a>01171     r-&gt;<a class="code" href="structcont__ad__t.html#a74a6f56fb4cbde7fc789c9b463cf2f8f" title="Max silence power/frame ABOVE noise level.">delta_sil</a> = delta_sil;
<a name="l01172"></a>01172     r-&gt;<a class="code" href="structcont__ad__t.html#afca0f69a21d9f28c9610fcefc0e7cb10" title="Min speech power/frame ABOVE noise level.">delta_speech</a> = delta_speech;
<a name="l01173"></a>01173     r-&gt;<a class="code" href="structcont__ad__t.html#ac301114b24356aef2edccba155e3cf33" title="noise lower than this we ignore">min_noise</a> = min_noise;
<a name="l01174"></a>01174     r-&gt;<a class="code" href="structcont__ad__t.html#af3b50663565964bb18ebb9f9e0002421" title="noise higher than this signals an error">max_noise</a> = max_noise;
<a name="l01175"></a>01175 
<a name="l01176"></a>01176     r-&gt;<a class="code" href="structcont__ad__t.html#a7c61513f48e8fbc9ab6b57db66dad7b9" title="how many frames to look at for speech det">winsize</a> = winsize;
<a name="l01177"></a>01177     r-&gt;<a class="code" href="structcont__ad__t.html#a1b0bb7e53a2bf537ed362badddca341b" title="start speech on &amp;gt;= these many frames out of winsize, of &amp;gt;= delta_speech">speech_onset</a> = speech_onset;
<a name="l01178"></a>01178     r-&gt;<a class="code" href="structcont__ad__t.html#a9f5e138f4b79b59bf4daa5603d171165" title="end speech on &amp;gt;= these many frames out of winsize, of &amp;lt;= delta_sil">sil_onset</a> = sil_onset;
<a name="l01179"></a>01179     r-&gt;<a class="code" href="structcont__ad__t.html#a0d42e3ac6c1e5c59c86a40f4cf26a861" title="pad beggining of speech with this many extra frms">leader</a> = leader;
<a name="l01180"></a>01180     r-&gt;<a class="code" href="structcont__ad__t.html#aa15db1e9fbb0048225521555ab8d9388" title="pad end of speech with this many extra frms">trailer</a> = trailer;
<a name="l01181"></a>01181 
<a name="l01182"></a>01182     r-&gt;<a class="code" href="structcont__ad__t.html#ac22395096037175bf9a0a1f6877e5ec5" title="Linear interpolation constant for rate at which noise level adapted to each estimate; range: 0-1; 0=&amp;...">adapt_rate</a> = adapt_rate;
<a name="l01183"></a>01183 
<a name="l01184"></a>01184     <span class="keywordflow">if</span> (r-&gt;<a class="code" href="structcont__ad__t.html#a14ee16922e7287ad4ce8c51c6ddb74fc" title="Number of frames currently available from win_startfrm for analysis.">win_validfrm</a> &gt;= r-&gt;<a class="code" href="structcont__ad__t.html#a7c61513f48e8fbc9ab6b57db66dad7b9" title="how many frames to look at for speech det">winsize</a>)
<a name="l01185"></a>01185         r-&gt;<a class="code" href="structcont__ad__t.html#a14ee16922e7287ad4ce8c51c6ddb74fc" title="Number of frames currently available from win_startfrm for analysis.">win_validfrm</a> = r-&gt;<a class="code" href="structcont__ad__t.html#a7c61513f48e8fbc9ab6b57db66dad7b9" title="how many frames to look at for speech det">winsize</a> - 1;
<a name="l01186"></a>01186 
<a name="l01187"></a>01187     <span class="keywordflow">return</span> 0;
<a name="l01188"></a>01188 }
<a name="l01189"></a>01189 
<a name="l01190"></a>01190 
<a name="l01191"></a>01191 <span class="comment">/*</span>
<a name="l01192"></a>01192 <span class="comment"> * PWP 1/14/98 -- get the changable params.</span>
<a name="l01193"></a>01193 <span class="comment"> *</span>
<a name="l01194"></a>01194 <span class="comment"> *   delta_sil, delta_speech, min_noise, and max_noise are in dB,</span>
<a name="l01195"></a>01195 <span class="comment"> *   winsize, speech_onset, sil_onset, leader and trailer are in frames of</span>
<a name="l01196"></a>01196 <span class="comment"> *   16 ms length (256 samples @ 16kHz sampling).</span>
<a name="l01197"></a>01197 <span class="comment"> */</span>
<a name="l01198"></a>01198 int32
<a name="l01199"></a><a class="code" href="cont__ad_8h.html#aedd013bc2c6aca14fba02049ed7645d7">01199</a> <a class="code" href="cont__ad_8h.html#aedd013bc2c6aca14fba02049ed7645d7" title="PWP 1/14/98 -- get the changable params.">cont_ad_get_params</a>(<a class="code" href="structcont__ad__t.html" title="Continuous listening module or object Continuous listening module or object.">cont_ad_t</a> * r, int32 * delta_sil,
<a name="l01200"></a>01200                    int32 * delta_speech, int32 * min_noise,
<a name="l01201"></a>01201                    int32 * max_noise, int32 * winsize,
<a name="l01202"></a>01202                    int32 * speech_onset, int32 * sil_onset,
<a name="l01203"></a>01203                    int32 * leader, int32 * trailer, float32 * adapt_rate)
<a name="l01204"></a>01204 {
<a name="l01205"></a>01205     <span class="keywordflow">if</span> (!delta_sil || !delta_speech || !min_noise || !max_noise
<a name="l01206"></a>01206         || !winsize || !speech_onset || !sil_onset || !leader
<a name="l01207"></a>01207         || !trailer || !adapt_rate) {
<a name="l01208"></a>01208         fprintf(stderr, <span class="stringliteral">&quot;cont_ad_get_params: some param slots are NULL\n&quot;</span>);
<a name="l01209"></a>01209         <span class="keywordflow">return</span> (-1);
<a name="l01210"></a>01210     }
<a name="l01211"></a>01211 
<a name="l01212"></a>01212     <span class="keywordflow">if</span> (r == NULL)
<a name="l01213"></a>01213         <span class="keywordflow">return</span> -1;
<a name="l01214"></a>01214 
<a name="l01215"></a>01215     *delta_sil = r-&gt;<a class="code" href="structcont__ad__t.html#a74a6f56fb4cbde7fc789c9b463cf2f8f" title="Max silence power/frame ABOVE noise level.">delta_sil</a>;
<a name="l01216"></a>01216     *delta_speech = r-&gt;<a class="code" href="structcont__ad__t.html#afca0f69a21d9f28c9610fcefc0e7cb10" title="Min speech power/frame ABOVE noise level.">delta_speech</a>;
<a name="l01217"></a>01217     *min_noise = r-&gt;<a class="code" href="structcont__ad__t.html#ac301114b24356aef2edccba155e3cf33" title="noise lower than this we ignore">min_noise</a>;
<a name="l01218"></a>01218     *max_noise = r-&gt;<a class="code" href="structcont__ad__t.html#af3b50663565964bb18ebb9f9e0002421" title="noise higher than this signals an error">max_noise</a>;
<a name="l01219"></a>01219 
<a name="l01220"></a>01220     *winsize = r-&gt;<a class="code" href="structcont__ad__t.html#a7c61513f48e8fbc9ab6b57db66dad7b9" title="how many frames to look at for speech det">winsize</a>;
<a name="l01221"></a>01221     *speech_onset = r-&gt;<a class="code" href="structcont__ad__t.html#a1b0bb7e53a2bf537ed362badddca341b" title="start speech on &amp;gt;= these many frames out of winsize, of &amp;gt;= delta_speech">speech_onset</a>;
<a name="l01222"></a>01222     *sil_onset = r-&gt;<a class="code" href="structcont__ad__t.html#a9f5e138f4b79b59bf4daa5603d171165" title="end speech on &amp;gt;= these many frames out of winsize, of &amp;lt;= delta_sil">sil_onset</a>;
<a name="l01223"></a>01223     *leader = r-&gt;<a class="code" href="structcont__ad__t.html#a0d42e3ac6c1e5c59c86a40f4cf26a861" title="pad beggining of speech with this many extra frms">leader</a>;
<a name="l01224"></a>01224     *trailer = r-&gt;<a class="code" href="structcont__ad__t.html#aa15db1e9fbb0048225521555ab8d9388" title="pad end of speech with this many extra frms">trailer</a>;
<a name="l01225"></a>01225 
<a name="l01226"></a>01226     *adapt_rate = r-&gt;<a class="code" href="structcont__ad__t.html#ac22395096037175bf9a0a1f6877e5ec5" title="Linear interpolation constant for rate at which noise level adapted to each estimate; range: 0-1; 0=&amp;...">adapt_rate</a>;
<a name="l01227"></a>01227 
<a name="l01228"></a>01228     <span class="keywordflow">return</span> 0;
<a name="l01229"></a>01229 }
<a name="l01230"></a>01230 
<a name="l01231"></a>01231 
<a name="l01232"></a>01232 <span class="comment">/*</span>
<a name="l01233"></a>01233 <span class="comment"> * Reset, discarded any accumulated speech.</span>
<a name="l01234"></a>01234 <span class="comment"> */</span>
<a name="l01235"></a>01235 int32
<a name="l01236"></a><a class="code" href="cont__ad_8h.html#a12a017ea8a96dc54445e937bb9de24ae">01236</a> <a class="code" href="cont__ad_8h.html#a12a017ea8a96dc54445e937bb9de24ae" title="Reset, discarding any accumulated speech segments.">cont_ad_reset</a>(<a class="code" href="structcont__ad__t.html" title="Continuous listening module or object Continuous listening module or object.">cont_ad_t</a> * r)
<a name="l01237"></a>01237 {
<a name="l01238"></a>01238     <a class="code" href="structspseg__t.html" title="(FOR INTERNAL USE ) Data structure for maintaining speech (non-silence) segments not yet consumed by ...">spseg_t</a> *seg;
<a name="l01239"></a>01239 
<a name="l01240"></a>01240     <span class="keywordflow">if</span> (r == NULL)
<a name="l01241"></a>01241         <span class="keywordflow">return</span> -1;
<a name="l01242"></a>01242 
<a name="l01243"></a>01243     <span class="keywordflow">while</span> (r-&gt;<a class="code" href="structcont__ad__t.html#abffe61140bc2a02ae4222183b3ef6159" title="First of unconsumed speech segments.">spseg_head</a>) {
<a name="l01244"></a>01244         seg = r-&gt;<a class="code" href="structcont__ad__t.html#abffe61140bc2a02ae4222183b3ef6159" title="First of unconsumed speech segments.">spseg_head</a>;
<a name="l01245"></a>01245         r-&gt;<a class="code" href="structcont__ad__t.html#abffe61140bc2a02ae4222183b3ef6159" title="First of unconsumed speech segments.">spseg_head</a> = seg-&gt;next;
<a name="l01246"></a>01246         free(seg);
<a name="l01247"></a>01247     }
<a name="l01248"></a>01248     r-&gt;<a class="code" href="structcont__ad__t.html#ac77e8f8bd27cea3b99238d9663455972" title="Last of unconsumed speech segments.">spseg_tail</a> = NULL;
<a name="l01249"></a>01249 
<a name="l01250"></a>01250     r-&gt;<a class="code" href="structcont__ad__t.html#aa0617a92c549ac916258a54ec2cdc756" title="Frame number in adbuf with unconsumed A/D data.">headfrm</a> = 0;
<a name="l01251"></a>01251     r-&gt;<a class="code" href="structcont__ad__t.html#abed5c6e9a2e078b70fc4c30b667612b2" title="Number of complete frames of unconsumed A/D data in adbuf.">n_frm</a> = 0;
<a name="l01252"></a>01252     r-&gt;<a class="code" href="structcont__ad__t.html#a7ae5362560d9edfa6c16555285487a7a" title="Number of samples of unconsumed data in adbuf.">n_sample</a> = 0;
<a name="l01253"></a>01253     r-&gt;<a class="code" href="structcont__ad__t.html#a75bc7d23bfedfd79a2fd1e3ea2188e4c" title="Where next analysis window begins.">win_startfrm</a> = 0;
<a name="l01254"></a>01254     r-&gt;<a class="code" href="structcont__ad__t.html#a14ee16922e7287ad4ce8c51c6ddb74fc" title="Number of frames currently available from win_startfrm for analysis.">win_validfrm</a> = 0;
<a name="l01255"></a>01255     r-&gt;<a class="code" href="structcont__ad__t.html#a628e5b444bde5e0eb0dc7fe8731a31a6" title="If in SILENCE state, number of frames in analysis window considered to be speech; otherwise number of...">n_other</a> = 0;
<a name="l01256"></a>01256 
<a name="l01257"></a>01257     r-&gt;<a class="code" href="structcont__ad__t.html#ae52185e7f7dfe424060c0ff562a8858b" title="State at the end of its internal buffer (internal use): CONT_AD_STATE_SIL or CONT_AD_STATE_SPEECH.">tail_state</a> = CONT_AD_STATE_SIL;
<a name="l01258"></a>01258 
<a name="l01259"></a>01259     <span class="keywordflow">return</span> 0;
<a name="l01260"></a>01260 }
<a name="l01261"></a>01261 
<a name="l01262"></a>01262 
<a name="l01263"></a>01263 int32
<a name="l01264"></a><a class="code" href="cont__ad_8h.html#a381c3df971d43a20e8e8b8da43d2872d">01264</a> <a class="code" href="cont__ad_8h.html#a381c3df971d43a20e8e8b8da43d2872d" title="Close the continuous listening object.">cont_ad_close</a>(<a class="code" href="structcont__ad__t.html" title="Continuous listening module or object Continuous listening module or object.">cont_ad_t</a> * cont)
<a name="l01265"></a>01265 {
<a name="l01266"></a>01266     <span class="keywordflow">if</span> (cont == NULL)
<a name="l01267"></a>01267         <span class="keywordflow">return</span> -1;
<a name="l01268"></a>01268 
<a name="l01269"></a>01269     <a class="code" href="cont__ad_8h.html#a12a017ea8a96dc54445e937bb9de24ae" title="Reset, discarding any accumulated speech segments.">cont_ad_reset</a>(cont);        <span class="comment">/* Frees any remaining speech segments */</span>
<a name="l01270"></a>01270 
<a name="l01271"></a>01271     free(cont-&gt;<a class="code" href="structcont__ad__t.html#a719f5c6816cd0da0a31930a2e572b933" title="Circular buffer for maintaining A/D data read until consumed.">adbuf</a>);
<a name="l01272"></a>01272     free(cont-&gt;<a class="code" href="structcont__ad__t.html#a01f61a105019bea12533db84351d07b9" title="Histogram of frame power, moving window, decayed.">pow_hist</a>);
<a name="l01273"></a>01273     free(cont-&gt;<a class="code" href="structcont__ad__t.html#a18f146239c77ff4ca6157261acdf4083" title="Frame power.">frm_pow</a>);
<a name="l01274"></a>01274     free(cont);
<a name="l01275"></a>01275 
<a name="l01276"></a>01276     <span class="keywordflow">return</span> 0;
<a name="l01277"></a>01277 }
<a name="l01278"></a>01278 
<a name="l01279"></a>01279 
<a name="l01280"></a>01280 int32
<a name="l01281"></a><a class="code" href="cont__ad_8h.html#a8f8284f329d1c0e04856ec9d13020dc4">01281</a> <a class="code" href="cont__ad_8h.html#a8f8284f329d1c0e04856ec9d13020dc4" title="Detach the given continuous listening module from the associated audio device.">cont_ad_detach</a>(<a class="code" href="structcont__ad__t.html" title="Continuous listening module or object Continuous listening module or object.">cont_ad_t</a> * c)
<a name="l01282"></a>01282 {
<a name="l01283"></a>01283     <span class="keywordflow">if</span> (c == NULL)
<a name="l01284"></a>01284         <span class="keywordflow">return</span> -1;
<a name="l01285"></a>01285 
<a name="l01286"></a>01286     c-&gt;<a class="code" href="structcont__ad__t.html#aae5b9d977e62424b0cf0e245485b20a0" title="A/D device argument for adfunc.">ad</a> = NULL;
<a name="l01287"></a>01287     c-&gt;adfunc = NULL;
<a name="l01288"></a>01288     <span class="keywordflow">return</span> 0;
<a name="l01289"></a>01289 }
<a name="l01290"></a>01290 
<a name="l01291"></a>01291 
<a name="l01292"></a>01292 int32
<a name="l01293"></a><a class="code" href="cont__ad_8h.html#a41e7f8c5925dba26dd51e8f7a3d16404">01293</a> <a class="code" href="cont__ad_8h.html#a41e7f8c5925dba26dd51e8f7a3d16404" title="Attach the continuous listening module to the given audio device/function.">cont_ad_attach</a>(<a class="code" href="structcont__ad__t.html" title="Continuous listening module or object Continuous listening module or object.">cont_ad_t</a> * c, <a class="code" href="structad__rec__t.html">ad_rec_t</a> * a,
<a name="l01294"></a>01294                int32(*func) (<a class="code" href="structad__rec__t.html">ad_rec_t</a> *, int16 *, int32))
<a name="l01295"></a>01295 {
<a name="l01296"></a>01296     <span class="keywordflow">if</span> (c == NULL)
<a name="l01297"></a>01297         <span class="keywordflow">return</span> -1;
<a name="l01298"></a>01298 
<a name="l01299"></a>01299     c-&gt;<a class="code" href="structcont__ad__t.html#aae5b9d977e62424b0cf0e245485b20a0" title="A/D device argument for adfunc.">ad</a> = a;
<a name="l01300"></a>01300     c-&gt;adfunc = func;
<a name="l01301"></a>01301     c-&gt;<a class="code" href="structcont__ad__t.html#af7b9044b76ed3b86ce74e4e7215ca4c3" title="Whether the source ad device has encountered EOF.">eof</a> = 0;
<a name="l01302"></a>01302 
<a name="l01303"></a>01303     <span class="keywordflow">return</span> 0;
<a name="l01304"></a>01304 }
<a name="l01305"></a>01305 
<a name="l01306"></a>01306 
<a name="l01307"></a>01307 int32
<a name="l01308"></a><a class="code" href="cont__ad_8h.html#a382fe6375eae57a532c524d68bc3dd24">01308</a> <a class="code" href="cont__ad_8h.html#a382fe6375eae57a532c524d68bc3dd24" title="Set the silence and speech thresholds.">cont_set_thresh</a>(<a class="code" href="structcont__ad__t.html" title="Continuous listening module or object Continuous listening module or object.">cont_ad_t</a> * r, int32 silence, int32 speech)
<a name="l01309"></a>01309 {
<a name="l01310"></a>01310     int32 i, f;
<a name="l01311"></a>01311 
<a name="l01312"></a>01312     r-&gt;<a class="code" href="structcont__ad__t.html#a0b9333d9acc41b5bfb67f69fc22ca901" title="Frame considered to be speech if power &amp;gt;= thresh_speech (for transitioning from SILENCE to SPEECH ...">thresh_speech</a> = speech;
<a name="l01313"></a>01313     r-&gt;<a class="code" href="structcont__ad__t.html#adbbe28dca87d06a3ca8d2390d08ea83a" title="Frame considered to be silence if power &amp;lt;= thresh_sil (for transitioning from SPEECH to SILENCE st...">thresh_sil</a> = silence;
<a name="l01314"></a>01314 
<a name="l01315"></a>01315     <span class="comment">/* Since threshold has been updated, recompute r-&gt;n_other */</span>
<a name="l01316"></a>01316     r-&gt;<a class="code" href="structcont__ad__t.html#a628e5b444bde5e0eb0dc7fe8731a31a6" title="If in SILENCE state, number of frames in analysis window considered to be speech; otherwise number of...">n_other</a> = 0;
<a name="l01317"></a>01317     <span class="keywordflow">if</span> (r-&gt;<a class="code" href="structcont__ad__t.html#ae52185e7f7dfe424060c0ff562a8858b" title="State at the end of its internal buffer (internal use): CONT_AD_STATE_SIL or CONT_AD_STATE_SPEECH.">tail_state</a> == CONT_AD_STATE_SIL) {
<a name="l01318"></a>01318         <span class="keywordflow">for</span> (i = r-&gt;<a class="code" href="structcont__ad__t.html#a14ee16922e7287ad4ce8c51c6ddb74fc" title="Number of frames currently available from win_startfrm for analysis.">win_validfrm</a>, f = r-&gt;<a class="code" href="structcont__ad__t.html#a75bc7d23bfedfd79a2fd1e3ea2188e4c" title="Where next analysis window begins.">win_startfrm</a>; i &gt; 0; --i) {
<a name="l01319"></a>01319             <span class="keywordflow">if</span> (r-&gt;<a class="code" href="structcont__ad__t.html#a18f146239c77ff4ca6157261acdf4083" title="Frame power.">frm_pow</a>[f] &gt;= r-&gt;<a class="code" href="structcont__ad__t.html#a0b9333d9acc41b5bfb67f69fc22ca901" title="Frame considered to be speech if power &amp;gt;= thresh_speech (for transitioning from SILENCE to SPEECH ...">thresh_speech</a>)
<a name="l01320"></a>01320                 r-&gt;<a class="code" href="structcont__ad__t.html#a628e5b444bde5e0eb0dc7fe8731a31a6" title="If in SILENCE state, number of frames in analysis window considered to be speech; otherwise number of...">n_other</a>++;
<a name="l01321"></a>01321 
<a name="l01322"></a>01322             f++;
<a name="l01323"></a>01323             <span class="keywordflow">if</span> (f &gt;= CONT_AD_ADFRMSIZE)
<a name="l01324"></a>01324                 f = 0;
<a name="l01325"></a>01325         }
<a name="l01326"></a>01326     }
<a name="l01327"></a>01327     <span class="keywordflow">else</span> <span class="keywordflow">if</span> (r-&gt;<a class="code" href="structcont__ad__t.html#ae52185e7f7dfe424060c0ff562a8858b" title="State at the end of its internal buffer (internal use): CONT_AD_STATE_SIL or CONT_AD_STATE_SPEECH.">tail_state</a> == CONT_AD_STATE_SPEECH) {
<a name="l01328"></a>01328         <span class="keywordflow">for</span> (i = r-&gt;<a class="code" href="structcont__ad__t.html#a14ee16922e7287ad4ce8c51c6ddb74fc" title="Number of frames currently available from win_startfrm for analysis.">win_validfrm</a>, f = r-&gt;<a class="code" href="structcont__ad__t.html#a75bc7d23bfedfd79a2fd1e3ea2188e4c" title="Where next analysis window begins.">win_startfrm</a>; i &gt; 0; --i) {
<a name="l01329"></a>01329             <span class="keywordflow">if</span> (r-&gt;<a class="code" href="structcont__ad__t.html#a18f146239c77ff4ca6157261acdf4083" title="Frame power.">frm_pow</a>[f] &lt;= r-&gt;<a class="code" href="structcont__ad__t.html#adbbe28dca87d06a3ca8d2390d08ea83a" title="Frame considered to be silence if power &amp;lt;= thresh_sil (for transitioning from SPEECH to SILENCE st...">thresh_sil</a>)
<a name="l01330"></a>01330                 r-&gt;<a class="code" href="structcont__ad__t.html#a628e5b444bde5e0eb0dc7fe8731a31a6" title="If in SILENCE state, number of frames in analysis window considered to be speech; otherwise number of...">n_other</a>++;
<a name="l01331"></a>01331 
<a name="l01332"></a>01332             f++;
<a name="l01333"></a>01333             <span class="keywordflow">if</span> (f &gt;= CONT_AD_ADFRMSIZE)
<a name="l01334"></a>01334                 f = 0;
<a name="l01335"></a>01335         }
<a name="l01336"></a>01336     }
<a name="l01337"></a>01337 
<a name="l01338"></a>01338     <span class="keywordflow">return</span> 0;
<a name="l01339"></a>01339 }
<a name="l01340"></a>01340 
<a name="l01341"></a>01341 
<a name="l01342"></a>01342 <span class="comment">/*</span>
<a name="l01343"></a>01343 <span class="comment"> * Set the file pointer for dumping the raw input audio stream.</span>
<a name="l01344"></a>01344 <span class="comment"> */</span>
<a name="l01345"></a>01345 int32
<a name="l01346"></a><a class="code" href="cont__ad_8h.html#a662ed7c409479060e3b5ac8eb7bd1865">01346</a> <a class="code" href="cont__ad_8h.html#a662ed7c409479060e3b5ac8eb7bd1865" title="Set a file for dumping raw audio input.">cont_ad_set_rawfp</a>(<a class="code" href="structcont__ad__t.html" title="Continuous listening module or object Continuous listening module or object.">cont_ad_t</a> * r, FILE * fp)
<a name="l01347"></a>01347 {
<a name="l01348"></a>01348     <span class="keywordflow">if</span> (r == NULL)
<a name="l01349"></a>01349         <span class="keywordflow">return</span> -1;
<a name="l01350"></a>01350 
<a name="l01351"></a>01351     r-&gt;<a class="code" href="structcont__ad__t.html#af8cd2a7e0ef0f4e2c825c7812a091f9c" title="If non-NULL, raw audio input data processed by cont_ad is dumped to this file.">rawfp</a> = fp;
<a name="l01352"></a>01352     <span class="keywordflow">return</span> 0;
<a name="l01353"></a>01353 }
<a name="l01354"></a>01354 
<a name="l01355"></a>01355 
<a name="l01356"></a>01356 <span class="comment">/*</span>
<a name="l01357"></a>01357 <span class="comment"> * Set the file pointer for logging cont_ad progress.</span>
<a name="l01358"></a>01358 <span class="comment"> */</span>
<a name="l01359"></a>01359 int32
<a name="l01360"></a><a class="code" href="cont__ad_8h.html#a16c5810eb19ed89522ef4c3394bbfe83">01360</a> <a class="code" href="cont__ad_8h.html#a16c5810eb19ed89522ef4c3394bbfe83" title="Set the file to which cont_ad logs its progress.">cont_ad_set_logfp</a>(<a class="code" href="structcont__ad__t.html" title="Continuous listening module or object Continuous listening module or object.">cont_ad_t</a> * r, FILE * fp)
<a name="l01361"></a>01361 {
<a name="l01362"></a>01362     <span class="keywordflow">if</span> (r == NULL)
<a name="l01363"></a>01363         <span class="keywordflow">return</span> -1;
<a name="l01364"></a>01364 
<a name="l01365"></a>01365     r-&gt;<a class="code" href="structcont__ad__t.html#adbbb6765386309476549beb058a235c5" title="If non-NULL, write detailed logs of this object&amp;#39;s progress to the file.">logfp</a> = fp;
<a name="l01366"></a>01366     <span class="keywordflow">return</span> 0;
<a name="l01367"></a>01367 }
<a name="l01368"></a>01368 
<a name="l01369"></a>01369 
<a name="l01370"></a>01370 <span class="comment">/*</span>
<a name="l01371"></a>01371 <span class="comment"> * One-time initialization.</span>
<a name="l01372"></a>01372 <span class="comment"> */</span>
<a name="l01373"></a>01373 <a class="code" href="structcont__ad__t.html" title="Continuous listening module or object Continuous listening module or object.">cont_ad_t</a> *
<a name="l01374"></a>01374 <a class="code" href="cont__ad_8h.html#af28bf56f17d5cfebf4d960ebed44ca64" title="Initialize a continuous listening/silence filtering object.">cont_ad_init</a>(<a class="code" href="structad__rec__t.html">ad_rec_t</a> * a, int32(*func) (<a class="code" href="structad__rec__t.html">ad_rec_t</a> *, int16 *, int32))
<a name="l01375"></a>01375 {
<a name="l01376"></a>01376     <a class="code" href="structcont__ad__t.html" title="Continuous listening module or object Continuous listening module or object.">cont_ad_t</a> *r;
<a name="l01377"></a>01377 
<a name="l01378"></a>01378     <span class="keywordflow">if</span> ((r = malloc(<span class="keyword">sizeof</span>(*r))) == NULL) {
<a name="l01379"></a>01379                 <a class="code" href="err_8h.html#a54ffbfe898d74595c586a1f48f32ef03" title="Print error text; Call perror(&amp;quot;&amp;quot;);.">E_ERROR_SYSTEM</a>(<span class="stringliteral">&quot;allocation of cont_ad_t failed&quot;</span>);
<a name="l01380"></a>01380         <span class="keywordflow">return</span> NULL;
<a name="l01381"></a>01381     }
<a name="l01382"></a>01382 
<a name="l01383"></a>01383     r-&gt;<a class="code" href="structcont__ad__t.html#aae5b9d977e62424b0cf0e245485b20a0" title="A/D device argument for adfunc.">ad</a> = a;
<a name="l01384"></a>01384     r-&gt;adfunc = func;
<a name="l01385"></a>01385     r-&gt;<a class="code" href="structcont__ad__t.html#af7b9044b76ed3b86ce74e4e7215ca4c3" title="Whether the source ad device has encountered EOF.">eof</a> = 0;
<a name="l01386"></a>01386     r-&gt;<a class="code" href="structcont__ad__t.html#a7726e8ea1bcca281a39c4b27bbb115e3" title="Pass all input data through, without filtering silence.">rawmode</a> = 0;
<a name="l01387"></a>01387 
<a name="l01388"></a>01388     <span class="keywordflow">if</span> (a != NULL)
<a name="l01389"></a>01389         r-&gt;<a class="code" href="structcont__ad__t.html#a11a4bb48870007b39f8fa46e4b8f111a" title="Samples/sec; moved from ad-&amp;gt;sps to break dependence on ad by N.">sps</a> = a-&gt;<a class="code" href="structad__rec__t.html#ac8ccccdc755f68cb4ad24007b36d6c8a" title="Samples/sec.">sps</a>;
<a name="l01390"></a>01390     <span class="keywordflow">else</span>
<a name="l01391"></a>01391         r-&gt;<a class="code" href="structcont__ad__t.html#a11a4bb48870007b39f8fa46e4b8f111a" title="Samples/sec; moved from ad-&amp;gt;sps to break dependence on ad by N.">sps</a> = CONT_AD_SPS;
<a name="l01392"></a>01392 
<a name="l01393"></a>01393     <span class="comment">/* Set samples/frame such that when sps=16000, spf=256 */</span>
<a name="l01394"></a>01394     r-&gt;<a class="code" href="structcont__ad__t.html#a55f701abf33b5f68f9ef4cbf95dfaf73" title="Samples/frame; audio level is analyzed within frames.">spf</a> = (r-&gt;<a class="code" href="structcont__ad__t.html#a11a4bb48870007b39f8fa46e4b8f111a" title="Samples/sec; moved from ad-&amp;gt;sps to break dependence on ad by N.">sps</a> * 256) / CONT_AD_SPS;
<a name="l01395"></a>01395     r-&gt;<a class="code" href="structcont__ad__t.html#a5c6edc6be287f3ae013c59fef90cb4bd" title="Buffer size (Number of samples)">adbufsize</a> = CONT_AD_ADFRMSIZE * r-&gt;<a class="code" href="structcont__ad__t.html#a55f701abf33b5f68f9ef4cbf95dfaf73" title="Samples/frame; audio level is analyzed within frames.">spf</a>;
<a name="l01396"></a>01396 
<a name="l01397"></a>01397     <span class="keywordflow">if</span> ((r-&gt;<a class="code" href="structcont__ad__t.html#a719f5c6816cd0da0a31930a2e572b933" title="Circular buffer for maintaining A/D data read until consumed.">adbuf</a> = malloc(r-&gt;<a class="code" href="structcont__ad__t.html#a5c6edc6be287f3ae013c59fef90cb4bd" title="Buffer size (Number of samples)">adbufsize</a> * <span class="keyword">sizeof</span>(*r-&gt;<a class="code" href="structcont__ad__t.html#a719f5c6816cd0da0a31930a2e572b933" title="Circular buffer for maintaining A/D data read until consumed.">adbuf</a>))) == NULL) {
<a name="l01398"></a>01398         <a class="code" href="err_8h.html#a54ffbfe898d74595c586a1f48f32ef03" title="Print error text; Call perror(&amp;quot;&amp;quot;);.">E_ERROR_SYSTEM</a>(<span class="stringliteral">&quot;allocation of audio buffer failed&quot;</span>);
<a name="l01399"></a>01399         free(r);
<a name="l01400"></a>01400         <span class="keywordflow">return</span> NULL;
<a name="l01401"></a>01401     }
<a name="l01402"></a>01402     <span class="keywordflow">if</span> ((r-&gt;<a class="code" href="structcont__ad__t.html#a01f61a105019bea12533db84351d07b9" title="Histogram of frame power, moving window, decayed.">pow_hist</a> =
<a name="l01403"></a>01403          calloc(CONT_AD_POWHISTSIZE, <span class="keyword">sizeof</span>(*r-&gt;<a class="code" href="structcont__ad__t.html#a01f61a105019bea12533db84351d07b9" title="Histogram of frame power, moving window, decayed.">pow_hist</a>))) == NULL) {
<a name="l01404"></a>01404         <a class="code" href="err_8h.html#a54ffbfe898d74595c586a1f48f32ef03" title="Print error text; Call perror(&amp;quot;&amp;quot;);.">E_ERROR_SYSTEM</a>(<span class="stringliteral">&quot;allocation of power history buffer failed&quot;</span>);
<a name="l01405"></a>01405         free(r-&gt;<a class="code" href="structcont__ad__t.html#a719f5c6816cd0da0a31930a2e572b933" title="Circular buffer for maintaining A/D data read until consumed.">adbuf</a>);
<a name="l01406"></a>01406         free(r);
<a name="l01407"></a>01407         <span class="keywordflow">return</span> NULL;
<a name="l01408"></a>01408     }
<a name="l01409"></a>01409     <span class="keywordflow">if</span> ((r-&gt;<a class="code" href="structcont__ad__t.html#a18f146239c77ff4ca6157261acdf4083" title="Frame power.">frm_pow</a> =
<a name="l01410"></a>01410          calloc(CONT_AD_ADFRMSIZE, <span class="keyword">sizeof</span>(*r-&gt;<a class="code" href="structcont__ad__t.html#a18f146239c77ff4ca6157261acdf4083" title="Frame power.">frm_pow</a>))) == NULL) {
<a name="l01411"></a>01411         <a class="code" href="err_8h.html#a54ffbfe898d74595c586a1f48f32ef03" title="Print error text; Call perror(&amp;quot;&amp;quot;);.">E_ERROR_SYSTEM</a>(<span class="stringliteral">&quot;allocation of frame power buffer failed&quot;</span>);
<a name="l01412"></a>01412         free(r-&gt;<a class="code" href="structcont__ad__t.html#a01f61a105019bea12533db84351d07b9" title="Histogram of frame power, moving window, decayed.">pow_hist</a>);
<a name="l01413"></a>01413         free(r-&gt;<a class="code" href="structcont__ad__t.html#a719f5c6816cd0da0a31930a2e572b933" title="Circular buffer for maintaining A/D data read until consumed.">adbuf</a>);
<a name="l01414"></a>01414         free(r);
<a name="l01415"></a>01415         <span class="keywordflow">return</span> NULL;
<a name="l01416"></a>01416     }
<a name="l01417"></a>01417 
<a name="l01418"></a>01418     r-&gt;<a class="code" href="structcont__ad__t.html#a5d9420ea711733d1eea9b8f29a638fdb" title="State of data returned by most recent cont_ad_read call; CONT_AD_STATE_SIL or CONT_AD_STATE_SPEECH.">state</a> = CONT_AD_STATE_SIL;
<a name="l01419"></a>01419     r-&gt;<a class="code" href="structcont__ad__t.html#a7b71e87abfcb3ca4ae73af34c86f955e" title="Absolute timestamp (total no.">read_ts</a> = 0;
<a name="l01420"></a>01420     r-&gt;<a class="code" href="structcont__ad__t.html#a478939247e09a8ae142c8996ec17d8c8" title="Total no.">seglen</a> = 0;
<a name="l01421"></a>01421     r-&gt;<a class="code" href="structcont__ad__t.html#a5524c052dcd0a3d1a1c3b1fc2134b62e" title="Max signal level for the data consumed by the most recent cont_ad_read call (dB range: 0-99)...">siglvl</a> = 0;
<a name="l01422"></a>01422     r-&gt;<a class="code" href="structcont__ad__t.html#a54e2013d9634ec473aaf79a606fb2e0f" title="For pre-emphasis filter.">prev_sample</a> = 0;
<a name="l01423"></a>01423     r-&gt;<a class="code" href="structcont__ad__t.html#a4ed32427e6a785b571b1346c85481899" title="Total number of frames of A/D data read, including consumed ones.">tot_frm</a> = 0;
<a name="l01424"></a>01424     r-&gt;<a class="code" href="structcont__ad__t.html#af60b0f78f9959a25cf7e7bf4c4aab4d7" title="PWP: what we claim as the &amp;quot;current&amp;quot; noise level.">noise_level</a> = CONT_AD_DEFAULT_NOISE;
<a name="l01425"></a>01425 
<a name="l01426"></a>01426     r-&gt;<a class="code" href="structcont__ad__t.html#a9e23379bf649ee06ece20133316253e5" title="Do automatic threshold adjustment or not.">auto_thresh</a> = 1;
<a name="l01427"></a>01427     r-&gt;<a class="code" href="structcont__ad__t.html#a74a6f56fb4cbde7fc789c9b463cf2f8f" title="Max silence power/frame ABOVE noise level.">delta_sil</a> = CONT_AD_DELTA_SIL;
<a name="l01428"></a>01428     r-&gt;<a class="code" href="structcont__ad__t.html#afca0f69a21d9f28c9610fcefc0e7cb10" title="Min speech power/frame ABOVE noise level.">delta_speech</a> = CONT_AD_DELTA_SPEECH;
<a name="l01429"></a>01429     r-&gt;<a class="code" href="structcont__ad__t.html#ac301114b24356aef2edccba155e3cf33" title="noise lower than this we ignore">min_noise</a> = CONT_AD_MIN_NOISE;
<a name="l01430"></a>01430     r-&gt;<a class="code" href="structcont__ad__t.html#af3b50663565964bb18ebb9f9e0002421" title="noise higher than this signals an error">max_noise</a> = CONT_AD_MAX_NOISE;
<a name="l01431"></a>01431     r-&gt;<a class="code" href="structcont__ad__t.html#a7c61513f48e8fbc9ab6b57db66dad7b9" title="how many frames to look at for speech det">winsize</a> = CONT_AD_WINSIZE;
<a name="l01432"></a>01432     r-&gt;<a class="code" href="structcont__ad__t.html#a1b0bb7e53a2bf537ed362badddca341b" title="start speech on &amp;gt;= these many frames out of winsize, of &amp;gt;= delta_speech">speech_onset</a> = CONT_AD_SPEECH_ONSET;
<a name="l01433"></a>01433     r-&gt;<a class="code" href="structcont__ad__t.html#a9f5e138f4b79b59bf4daa5603d171165" title="end speech on &amp;gt;= these many frames out of winsize, of &amp;lt;= delta_sil">sil_onset</a> = CONT_AD_SIL_ONSET;
<a name="l01434"></a>01434     r-&gt;<a class="code" href="structcont__ad__t.html#a0d42e3ac6c1e5c59c86a40f4cf26a861" title="pad beggining of speech with this many extra frms">leader</a> = CONT_AD_LEADER;
<a name="l01435"></a>01435     r-&gt;<a class="code" href="structcont__ad__t.html#aa15db1e9fbb0048225521555ab8d9388" title="pad end of speech with this many extra frms">trailer</a> = CONT_AD_TRAILER;
<a name="l01436"></a>01436 
<a name="l01437"></a>01437     r-&gt;<a class="code" href="structcont__ad__t.html#adbbe28dca87d06a3ca8d2390d08ea83a" title="Frame considered to be silence if power &amp;lt;= thresh_sil (for transitioning from SPEECH to SILENCE st...">thresh_sil</a> = r-&gt;<a class="code" href="structcont__ad__t.html#af60b0f78f9959a25cf7e7bf4c4aab4d7" title="PWP: what we claim as the &amp;quot;current&amp;quot; noise level.">noise_level</a> + r-&gt;<a class="code" href="structcont__ad__t.html#a74a6f56fb4cbde7fc789c9b463cf2f8f" title="Max silence power/frame ABOVE noise level.">delta_sil</a>;
<a name="l01438"></a>01438     r-&gt;<a class="code" href="structcont__ad__t.html#a0b9333d9acc41b5bfb67f69fc22ca901" title="Frame considered to be speech if power &amp;gt;= thresh_speech (for transitioning from SILENCE to SPEECH ...">thresh_speech</a> = r-&gt;<a class="code" href="structcont__ad__t.html#af60b0f78f9959a25cf7e7bf4c4aab4d7" title="PWP: what we claim as the &amp;quot;current&amp;quot; noise level.">noise_level</a> + r-&gt;<a class="code" href="structcont__ad__t.html#afca0f69a21d9f28c9610fcefc0e7cb10" title="Min speech power/frame ABOVE noise level.">delta_speech</a>;
<a name="l01439"></a>01439     r-&gt;<a class="code" href="structcont__ad__t.html#a2168183b25add085cf3aa29ddab1c8ce" title="Number of frames before next update to pow_hist/thresholds.">thresh_update</a> = CONT_AD_THRESH_UPDATE;
<a name="l01440"></a>01440     r-&gt;<a class="code" href="structcont__ad__t.html#ac22395096037175bf9a0a1f6877e5ec5" title="Linear interpolation constant for rate at which noise level adapted to each estimate; range: 0-1; 0=&amp;...">adapt_rate</a> = CONT_AD_ADAPT_RATE;
<a name="l01441"></a>01441 
<a name="l01442"></a>01442     r-&gt;<a class="code" href="structcont__ad__t.html#ae52185e7f7dfe424060c0ff562a8858b" title="State at the end of its internal buffer (internal use): CONT_AD_STATE_SIL or CONT_AD_STATE_SPEECH.">tail_state</a> = CONT_AD_STATE_SIL;
<a name="l01443"></a>01443 
<a name="l01444"></a>01444     r-&gt;<a class="code" href="structcont__ad__t.html#abffe61140bc2a02ae4222183b3ef6159" title="First of unconsumed speech segments.">spseg_head</a> = NULL;
<a name="l01445"></a>01445     r-&gt;<a class="code" href="structcont__ad__t.html#ac77e8f8bd27cea3b99238d9663455972" title="Last of unconsumed speech segments.">spseg_tail</a> = NULL;
<a name="l01446"></a>01446 
<a name="l01447"></a>01447     r-&gt;<a class="code" href="structcont__ad__t.html#af8cd2a7e0ef0f4e2c825c7812a091f9c" title="If non-NULL, raw audio input data processed by cont_ad is dumped to this file.">rawfp</a> = NULL;
<a name="l01448"></a>01448     r-&gt;<a class="code" href="structcont__ad__t.html#adbbb6765386309476549beb058a235c5" title="If non-NULL, write detailed logs of this object&amp;#39;s progress to the file.">logfp</a> = NULL;
<a name="l01449"></a>01449 
<a name="l01450"></a>01450     r-&gt;<a class="code" href="structcont__ad__t.html#ac6e6809727ddc78a13674478d5b527db" title="Number of frames of calibration data seen so far.">n_calib_frame</a> = 0;
<a name="l01451"></a>01451 
<a name="l01452"></a>01452     <a class="code" href="cont__ad_8h.html#a12a017ea8a96dc54445e937bb9de24ae" title="Reset, discarding any accumulated speech segments.">cont_ad_reset</a>(r);
<a name="l01453"></a>01453 
<a name="l01454"></a>01454     <span class="keywordflow">return</span> r;
<a name="l01455"></a>01455 }
<a name="l01456"></a>01456 
<a name="l01457"></a>01457 
<a name="l01458"></a>01458 <a class="code" href="structcont__ad__t.html" title="Continuous listening module or object Continuous listening module or object.">cont_ad_t</a> *
<a name="l01459"></a>01459 <a class="code" href="cont__ad_8h.html#a1a9bbf961917827f5d03adcd409dda35" title="Initializes a continuous listening object which simply passes data through (!)">cont_ad_init_rawmode</a>(<a class="code" href="structad__rec__t.html">ad_rec_t</a> * a,
<a name="l01460"></a>01460                      int32(*func) (<a class="code" href="structad__rec__t.html">ad_rec_t</a> *, int16 *, int32))
<a name="l01461"></a>01461 {
<a name="l01462"></a>01462     <a class="code" href="structcont__ad__t.html" title="Continuous listening module or object Continuous listening module or object.">cont_ad_t</a> *r;
<a name="l01463"></a>01463 
<a name="l01464"></a>01464     r = <a class="code" href="cont__ad_8h.html#af28bf56f17d5cfebf4d960ebed44ca64" title="Initialize a continuous listening/silence filtering object.">cont_ad_init</a>(a, func);
<a name="l01465"></a>01465     r-&gt;<a class="code" href="structcont__ad__t.html#a7726e8ea1bcca281a39c4b27bbb115e3" title="Pass all input data through, without filtering silence.">rawmode</a> = 1;
<a name="l01466"></a>01466 
<a name="l01467"></a>01467     <span class="keywordflow">return</span> r;
<a name="l01468"></a>01468 }
</pre></div></div>
</div>
  <div id="nav-path" class="navpath">
    <ul>
      <li class="navelem"><b>cont_ad_base.c</b>      </li>
      <li class="footer">Generated on Tue Apr 19 2011 for SphinxBase by&#160;
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.3 </li>
    </ul>
  </div>

</body>
</html>