csr8670--sink工程的大致工作流程分析(以speaker为例)二

来源:互联网 发布:linux war包不自动解压 编辑:程序博客网 时间:2024/06/08 13:12

1.编解码任务的初始化

继续接着流程一分析:

  • 1.1 当连接初始化完成之后,如下所示会调用编解码的初始化任务:这个编解码的任务作用是什么?
<code class="hljs coffeescript has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"> <span class="hljs-reserved" style="box-sizing: border-box;">case</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(0, 136, 0);">CL_INIT_CFM</span>:            MAIN_DEBUG<span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">((<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"CL_INIT_CFM [%d]\n"</span> , ((CL_INIT_CFM_T*)message)->status ))</span>;            <span class="hljs-title" style="box-sizing: border-box;">if</span><span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">(((CL_INIT_CFM_T*)message)->status == success)</span>            {                /* <span class="hljs-title" style="box-sizing: border-box;">Initialise</span> <span class="hljs-title" style="box-sizing: border-box;">the</span> <span class="hljs-title" style="box-sizing: border-box;">codec</span> <span class="hljs-title" style="box-sizing: border-box;">task</span> */                <span class="hljs-title" style="box-sizing: border-box;">sinkInitCodecTask</span><span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">()</span>;/*编解码的任务*/</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li></ul><div class="save_code tracking-ad" data-mod="popu_249" style="box-sizing: border-box; position: absolute; width: 105px; height: 60px; right: 30px; top: 5px; color: rgb(255, 255, 255); cursor: pointer; z-index: 2;"><a target=_blank target="_blank" style="color: rgb(51, 102, 153); box-sizing: border-box;"><img src="http://static.blog.csdn.net/images/save_snippets.png" style="border: none; box-sizing: border-box; max-width: 100%;" alt="" /></a></div><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li></ul>
  • 1.2 sinkInitCodecTask函数
<code class="hljs applescript has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">DESCRIPTION    Initialises <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">the</span> codec task/*初始化编解码相关的任务*/RETURNS*/static void sinkInitCodecTask ( void ){    /* The Connection Library has been successfully initialised,       initialise <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">the</span> HFP library <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">to</span> instantiate an instance <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">of</span> both       <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">the</span> HFP <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">and</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">the</span> HSP */    /*init <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">the</span> codec task*/    /*注意传递的两个参数,第二个为最重要任务,注意这个rundata的结构体在main函数configManagerInitMemory();中开辟*/    CodecInitCsrInternal (&theSink.rundata->codec, &theSink.task) ;}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li></ul>
  • 1.3 接下来进入CodecInitCsrInternal 函数
<code class="hljs lasso has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">void</span> CodecInitCsrInternal(CsrInternalCodecTaskData<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">*</span> codec, Task appTask){    codec<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>task<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>handler <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> csrInternalMessageHandler;    codec<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>clientTask <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> appTask;<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*这里很重要,编码器的任务就有了上层任务的入口,可以看一下很多任务的第二个结构体类型都是这样使用的*/</span>    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*向codec的任务发送了一个消息,编码内部初始化请求*/</span>    MessageSend(<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">&</span>codec<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>task, CODEC_INTERNAL_INIT_REQ, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>);}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li></ul>
  • 1.4 接下来转向csrInternalMessageHandler函数
<code class="hljs perl has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">void csrInternalMessageHandler(Task task, MessageId id, Message message){    CsrInternalCodecTaskData <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">*codec</span> = (CsrInternalCodecTaskData <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">*)</span> task;    <span class="hljs-regexp" style="color: rgb(0, 136, 0); box-sizing: border-box;">/* Check the message id */</span>    switch (id)    {    case CODEC_INTERNAL_INIT_REQ:<span class="hljs-regexp" style="color: rgb(0, 136, 0); box-sizing: border-box;">/*第一次这里将被执行*/</span>        handleCsrInternalCodecInitRe<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">q(codec)</span>;<span class="hljs-regexp" style="color: rgb(0, 136, 0); box-sizing: border-box;">/*具体的初始化请求*/</span>        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">break</span>;    case CODEC_INTERNAL_CONFIG_REQ:        handleCsrInternalCodecConfigureRe<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">q(codec, (CODEC_INTERNAL_CONFIG_REQ_T <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">*)</span> message)</span>;             <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">break</span>;    case CODEC_INTERNAL_INPUT_GAIN_REQ:        handleCsrInternalInputGainRe<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">q((CODEC_INTERNAL_INPUT_GAIN_REQ_T <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">*)</span> message)</span>;        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">break</span>;    case CODEC_INTERNAL_OUTPUT_GAIN_REQ:        handleCsrInternalOutputGainRe<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">q((CODEC_INTERNAL_OUTPUT_GAIN_REQ_T <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">*)</span> message)</span>;        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">break</span>;    <span class="hljs-regexp" style="color: rgb(0, 136, 0); box-sizing: border-box;">/* Not used */</span>    case CODEC_INTERNAL_CODEC_ENABLE_REQ:        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">break</span>;    case CODEC_INTERNAL_CODEC_DISABLE_REQ:        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">break</span>;    case CODEC_INTERNAL_POWER_DOWN_REQ:        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">break</span>;    default:        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">break</span>;    }}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li></ul>
  • 1.5 接下来执行handleCsrInternalCodecInitReq这个函数
<code class="hljs perl has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">void handleCsrInternalCodecInitRe<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">q(CsrInternalCodecTaskData <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">*codec</span>)</span>{    <span class="hljs-regexp" style="color: rgb(0, 136, 0); box-sizing: border-box;">/*发送确认向上层,传递过程中注意参数,codec_success*/</span>    sendInitCfmToApp(&codec->task, codec->clientTask, codec_success, CODEC_INPUT_GAIN_RANGE, CODEC_OUTPUT_GAIN_RANGE);  }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li></ul>
  • 1.6 执行确认发送函数
<code class="hljs lasso has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">void</span> sendInitCfmToApp(Task codecTask,                       Task clientTask,                       codec_status_code status,                       uint16 inputGainRange,                       uint16 outputGainRange){    MAKE_CODEC_MESSAGE(CODEC_INIT_CFM);<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*这个信息也会在xIDE中被打印出来,原理是什么?*/</span>    message<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>status <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> status;<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*这里是codec_success*/</span>    message<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>inputGainRange <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> inputGainRange;    message<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>outputGainRange <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> outputGainRange;    message<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>codecTask <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> codecTask;    MessageSend(clientTask, CODEC_INIT_CFM, message);<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*此时clientTask就是上层那个任务,这个是向上层发送CODEC_INIT_CFM确认消息,这样的话上层就能收到这个消息,即这个初始化也完成了*/</span>}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li></ul>
  • 1.7 接下来转向上层,处理这个消息,至此编解码的任务就算初始化完成,但是目前不知道这个编解码初始化函数有什么作用,好像整个过程什么也没有做啊???
<code class="hljs coffeescript has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">static <span class="hljs-reserved" style="box-sizing: border-box;">void</span> handleCodecMessage  ( Task task, MessageId id, Message message ){    MAIN_DEBUG((<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"CODEC MSG received [%x]\n"</span>, id)) ;    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (id == CODEC_INIT_CFM )    {       <span class="hljs-regexp" style="color: rgb(0, 136, 0); box-sizing: border-box;">/* The codec is now initialised */</span>        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> <span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">( ((CODEC_INIT_CFM_T*)message)->status == codec_success)</span>        {            <span class="hljs-title" style="box-sizing: border-box;">MAIN_DEBUG</span><span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">((<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"CODEC_INIT_CFM\n"</span>))</span>;/*初始化完成*/            <span class="hljs-title" style="box-sizing: border-box;">sinkHfpInit</span><span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">()</span>;/*进行<span class="hljs-title" style="box-sizing: border-box;">hfp</span>的初始化*/            <span class="hljs-title" style="box-sizing: border-box;">theSink</span>.<span class="hljs-title" style="box-sizing: border-box;">codec_task</span> = <span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">((CODEC_INIT_CFM_T*)message)</span>-></span>codecTask ;<span class="hljs-regexp" style="color: rgb(0, 136, 0); box-sizing: border-box;">/*在程序中有几个不懂的结构体,这个message是一个,有待分析*/</span>        }        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span>        {            Panic();        }    }}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li></ul>

接下来就会进行sinkHfpInit的初始化工作

2.Hfp任务的初始化过程

下图表示Hfp初始化过程,这里只对Hfp的初始化过程进行简单分析。 
Hfp初始化过程

2.1 初始化函数

  • 这个是Hfp的初始化函数,从上图可知当连接库和编解码任务初始化完成之后,下面需要做的就是初始化需要的profile,这个Hfp就是一个profile
<code class="hljs applescript has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">void sinkHfpInit( void ){    hfp_init_params hfp_params;/*定义了一个hfp初始化时用到的参数的结构体,这里为什么使用栈空间,不使用堆空间呢?难道是因为这个数据类型不大,所以用栈空间完全可以?*/    memset(&hfp_params, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>, sizeof(hfp_init_params));/*清空这个结构体*/    /* Get features config so HFP can be initialised correctly depending <span class="hljs-function_start" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">on</span></span> mSBC support */    /*配置系统的features,这个信息是保存到theSink的成员中去的,这个features是什么?需要看结构体的定义,关系到系统支持的特性,这个函数很重要,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2.1</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.1</span>*/    configManagerInitFeatures();    sinkClearQueueudEvent(); /*清空消息队列的事件,什么意思呢?*/    /* <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">get</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">the</span> extra hfp supported features such <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">as</span> supported sco packet types        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">from</span> pskey user <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">5</span> */    configManagerHFP_SupportedFeatures();/*同理获取配置信息的,这个信息是保存到theSink的成员中去的*/    /* initialise <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">the</span> hfp library <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">with</span> parameters <span class="hljs-command" style="box-sizing: border-box;">read</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">from</span> config*/        configManagerHFP_Init(&hfp_params);  /*这里是将刚定义的结构体进行赋值,也是通过获取配置信息,只不过这次只是HFP的配置*/    /* If <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">the</span> current audio plugin has no mSBC support <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">but</span> HFP1<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.6</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">is</span> configured,        disable <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">it</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">and</span> enable HFP1<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.5</span> */       /*字面翻译:如果当前的音频插件不支持mSBC,但是定义了HFP1<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.6</span>的话,禁止<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1.6</span>使能<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1.5</span>,可以理解为<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1.5</span>的HFP默认支持SBC,而<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1.6</span>的需要mSBC的支持?是这样吗*/    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(!audioHfpGetPlugin(hfp_wbs_codec_mask_msbc, theSink.features.audio_plugin) &&       hfp_params.supported_profile & hfp_handsfree_106_profile)    {        /* remove HFP1<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.6</span> support */        hfp_params.supported_profile &= ~hfp_handsfree_106_profile;        /* add HFP1<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.5</span> support */        hfp_params.supported_profile |= hfp_handsfree_profile;        /* ensure mSBC <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">is</span> removed <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">from</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">the</span> supported codecs */        hfp_params.supported_wbs_codecs &= hfp_wbs_codec_mask_cvsd;    }            /*将信息赋值给上层app*/    theSink.hfp_profiles = hfp_params.supported_profile;    /* store <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">the</span> link loss <span class="hljs-property" style="box-sizing: border-box;">time</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">in</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">the</span> app */    theSink.linkLossReminderTime = hfp_params.link_loss_interval;    /* initialise hfp library <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">with</span> pskey <span class="hljs-command" style="box-sizing: border-box;">read</span> configuration */    /*这个应该是具体的初始化hfp库的函数,注意传递的参数<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2.1</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.2</span>*/    HfpInit(&theSink.task, &hfp_params, NULL);    /* initialise <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">the</span> audio library, uses one malloc slot */    AudioLibraryInit();}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li><li style="box-sizing: border-box; padding: 0px 5px;">40</li><li style="box-sizing: border-box; padding: 0px 5px;">41</li><li style="box-sizing: border-box; padding: 0px 5px;">42</li><li style="box-sizing: border-box; padding: 0px 5px;">43</li><li style="box-sizing: border-box; padding: 0px 5px;">44</li><li style="box-sizing: border-box; padding: 0px 5px;">45</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li><li style="box-sizing: border-box; padding: 0px 5px;">40</li><li style="box-sizing: border-box; padding: 0px 5px;">41</li><li style="box-sizing: border-box; padding: 0px 5px;">42</li><li style="box-sizing: border-box; padding: 0px 5px;">43</li><li style="box-sizing: border-box; padding: 0px 5px;">44</li><li style="box-sizing: border-box; padding: 0px 5px;">45</li></ul>
  • 2.1.1 configManagerInitFeatures这个函数分析
<code class="hljs markdown has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">/<span class="hljs-strong" style="box-sizing: border-box;">*****</span><span class="hljs-strong" style="box-sizing: border-box;">*****</span><span class="hljs-strong" style="box-sizing: border-box;">*****</span><span class="hljs-strong" style="box-sizing: border-box;">*****</span><span class="hljs-strong" style="box-sizing: border-box;">*****</span><span class="hljs-strong" style="box-sizing: border-box;">*****</span><span class="hljs-strong" style="box-sizing: border-box;">*****</span><span class="hljs-strong" style="box-sizing: border-box;">*****</span><span class="hljs-strong" style="box-sizing: border-box;">*****</span><span class="hljs-strong" style="box-sizing: border-box;">*****</span><span class="hljs-strong" style="box-sizing: border-box;">*****</span><span class="hljs-strong" style="box-sizing: border-box;">*****</span><span class="hljs-strong" style="box-sizing: border-box;">*****</span><span class="hljs-strong" style="box-sizing: border-box;">*****</span><span class="hljs-strong" style="box-sizing: border-box;">*****</span>*NAME <span class="hljs-code" style="box-sizing: border-box;">    configManagerInitFeatures</span>DESCRIPTION<span class="hljs-code" style="box-sizing: border-box;">    Read and configure the system features from PS/*看这个描述应该是从ps中读取信息*/</span>RETURNS<span class="hljs-code" style="box-sizing: border-box;">    void</span>*/void configManagerInitFeatures( void )  {    <span class="hljs-code" style="box-sizing: border-box;">    /* Read and configure the system features */</span><span class="hljs-code" style="box-sizing: border-box;">    configManagerFeatureBlock( );</span>}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li></ul>
<code class="hljs avrasm has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">static void configManagerFeatureBlock( void ) {    uint8 i<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/* Read the feature block from persistent store */</span>    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*这个就是很重要的那个函数,这个函数获取pstool设置的数据,其中第一个参数应该是pskey,第二个参数为这个数据需要保存在哪里,第三个参数为数据的大小,这里的feature代表的就是系统配置的特性*/</span>      ConfigRetrieve(CONFIG_FEATURE_BLOCK, &theSink<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.features</span>, sizeof(feature_config_type)) <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#ifdef ENABLE_PEER</span>    ValidatePeerUseDeviceIdFeature()<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">; </span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#endif</span>    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*Set the default volume level*/</span>    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*翻译设置音量等级*/</span>    for(i=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;i<MAX_PROFILES;i++)</span>    {        theSink<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.profile</span>_data[i]<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.audio</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.gSMVolumeLevel</span> = theSink<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.features</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.DefaultVolume</span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;  </span>    }        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/* if aptX Low Latency is enabled, automatically enable standard aptX */</span>    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*aptX这个是高级应用,目前不考虑*/</span>    if(theSink<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.features</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.A</span>2dpOptionalCodecsEnabled & (<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span><<APTX_SPRINT_CODEC_BIT))    {        theSink<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.features</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.A</span>2dpOptionalCodecsEnabled |= (<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span><<APTX_CODEC_BIT)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;              </span>    }}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li></ul>
  • 2.1.2 HfpInit函数的分析
<code class="hljs lasso has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">MESSAGE RETURNED    HFP_INIT_CFM<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*可以看出这个函数执行完之后,会有一个确认信息发出,我们往下看*/</span>RETURNS    <span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">void</span><span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">*</span><span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">/</span><span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">void</span> HfpInit(Task theAppTask, const hfp_init_params <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">*</span>config, const char<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">*</span> extra_indicators){    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(theHfp)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*判断是否hfp任务已经有了,这里theHfp不为NULL,且config为传递过了的配置参数*/</span>    {        hfpInitCfmToApp(hfp_init_reinit_fail);        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span>;    }    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/* Check the app has passed in a valid pointer. */</span>    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">!</span>config)    {        HFP_DEBUG((<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Config parameters not passed in\n"</span>));<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*不会执行*/</span>    }    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span>    {        uint8             size_hfp_data;        hfp_task_data<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">*</span>    lHfp;        hfp_link_data<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">*</span>    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">link</span>;        hfp_profile       profile  <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> config<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>supported_profile;        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/* Calculate number of links and services */</span>        uint8 num_links    <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> (config<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>multipoint <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">?</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span> : <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>);<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*应该是判断是否支持多点连接,看英文注释:Whether multiple connections to one profile are supported */</span>        uint8 num_services <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>;        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(supportedProfileIsHfp(profile))<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*判断是否支持Hfp*/</span>            num_services <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">+=</span> num_links;<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*如果支持的话,将支持的服务加1*/</span>        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(supportedProfileIsHsp(profile))<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*判断是否支持Hsp*/</span>            num_services <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">+=</span> num_links;<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*经过这两个判断:num_services 可能出现的值有四个                                                                1:不支持多点连接也不支持Hfp和Hsp                                                                2:不支持多点连接支持Hfp或者Hsp                                                                3:支持多点连接也支持Hfp或者Hsp                                                                 4:支持多点连接支持Hfp和Hsp      */</span>        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/* Calculate overall memory requirement */</span>        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*计算需要的内存空间,需要为HFP任务做准备*/</span>        size_hfp_data <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> sizeof(hfp_task_data)                       <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">+</span> num_links <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">*</span> sizeof(hfp_link_data)                      <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">+</span> num_services <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">*</span> sizeof(hfp_service_data);        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/* Allocate and zero our hfp_task_data */</span>        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*开辟空间,这样直接连续赋值可以吗?在c语言中?*/</span>        lHfp <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> theHfp <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> PanicUnlessMalloc(size_hfp_data);<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*这样的话lHfp和theHfp指向相同*/</span>        memset(lHfp, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>, size_hfp_data);<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*清空开辟的空间*/</span>        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/* Set pointers - NB. (lHfp + 1) compiles to (lHfp + (1 * sizeof(hfp_task_data))) */</span>        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*这里看不懂??????????*/</span>        lHfp<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>links    <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> (hfp_link_data<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">*</span>)(lHfp <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">+</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>);        lHfp<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>services <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> (hfp_service_data<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">*</span>)(lHfp<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>links <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">+</span> num_links);        lHfp<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>top      <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> (hfp_service_data<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">*</span>)(lHfp<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>services <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">+</span> num_services);        PRINT((<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"HFP Task Data taking up %d words\n"</span>, size_hfp_data));        PRINT((<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"%d Words for main task\n"</span>,           sizeof(hfp_task_data)));        PRINT((<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"%d Words for links\n"</span>,               sizeof(hfp_link_data) <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">*</span> num_links));        PRINT((<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"%d Words for services\n"</span>,            sizeof(hfp_service_data) <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">*</span> num_services));        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/* Set the handler function */</span>        lHfp<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>task<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>handler <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> hfpProfileHandler;<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*设置回到函数*/</span>        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/* Mask out unsupported features. */</span>        lHfp<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>hf_supported_features <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> (config<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>supported_features <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">&</span> ~HFP_ENHANCED_CALL_CONTROL);<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*掩盖不支持的功能,这是百度翻译的结果T0T...*/</span>        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">!</span>supportedProfileIsHfp106(profile))<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*Hfp也有版本,自行百度1.5与1.6*/</span>            lHfp<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>hf_supported_features <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">&=</span> ~HFP_CODEC_NEGOTIATION;        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/* Codec negotiation is supported */</span>        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(hfFeatureEnabled(HFP_CODEC_NEGOTIATION))<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*这个和支持的特性有关吧?*/</span>            hfpWbsEnable(config<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>supported_wbs_codecs);        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/* Set the number of link loss reconnect attempts */</span>        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*参数断开连接式重连尝试的参数设置*/</span>        lHfp<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>link_loss_time     <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> config<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>link_loss_time;        lHfp<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>link_loss_interval <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> config<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>link_loss_interval;        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/* Set up other config options */</span>        lHfp<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>extra_indicators <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> extra_indicators;        lHfp<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>optional_indicators <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> config<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>optional_indicators;        lHfp<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>disable_nrec <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> config<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>disable_nrec;        lHfp<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>extended_errors <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> config<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>extended_errors;        lHfp<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>csr_features <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> config<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>csr_features;        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/* Store the app task so we know where to return responses */</span>        lHfp<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>clientTask <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> theAppTask;<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*又出现了,不用说了一样的作用*/</span>        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(config<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>supported_profile <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">==</span> hfp_no_profile)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*什么意思,如果不支持hfp这个profile,发送初始化完成,正常情况下不会执行这个*/</span>        {            hfpInitCfmToApp(hfp_init_success);<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*发送的是hfp初始化完成信息,应用层怎样知道不支持hfp的呢?这里将标志设置为初始化成功??不明白*/</span>            <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span>;        }        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*抱歉这个地方看的不是很明白,稍后看完再分析..*/</span>        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/* Connection related state updated in separate function */</span>        for_all_links(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">link</span>)        {            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*hfpLinkReset(link, FALSE); - link already memset to 0 above */</span>            <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">link</span><span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>ag_supported_features <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> (AG_THREE_WAY_CALLING <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">|</span> AG_IN_BAND_RING);        }        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/* Ensure only one HFP version is specified (1.6 takes priority) */</span>        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(supportedProfileIsHfp106(profile))            profile <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">&=</span> ~hfp_handsfree_profile;        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/* Set up services and begin registration */</span>        hfpServicesInit(profile, config<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>multipoint);<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*服务初始化*/</span>        hfpServiceChannelRegister(theHfp<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>services);<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*服务注册,这两个意思不懂??*/</span>        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/* We want sync connect notifications */</span>        ConnectionSyncRegister(<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">&</span>theHfp<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>task);<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*代码看过去,往上层的连接库的回调函数发送的消息*/</span>    }}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li><li style="box-sizing: border-box; padding: 0px 5px;">40</li><li style="box-sizing: border-box; padding: 0px 5px;">41</li><li style="box-sizing: border-box; padding: 0px 5px;">42</li><li style="box-sizing: border-box; padding: 0px 5px;">43</li><li style="box-sizing: border-box; padding: 0px 5px;">44</li><li style="box-sizing: border-box; padding: 0px 5px;">45</li><li style="box-sizing: border-box; padding: 0px 5px;">46</li><li style="box-sizing: border-box; padding: 0px 5px;">47</li><li style="box-sizing: border-box; padding: 0px 5px;">48</li><li style="box-sizing: border-box; padding: 0px 5px;">49</li><li style="box-sizing: border-box; padding: 0px 5px;">50</li><li style="box-sizing: border-box; padding: 0px 5px;">51</li><li style="box-sizing: border-box; padding: 0px 5px;">52</li><li style="box-sizing: border-box; padding: 0px 5px;">53</li><li style="box-sizing: border-box; padding: 0px 5px;">54</li><li style="box-sizing: border-box; padding: 0px 5px;">55</li><li style="box-sizing: border-box; padding: 0px 5px;">56</li><li style="box-sizing: border-box; padding: 0px 5px;">57</li><li style="box-sizing: border-box; padding: 0px 5px;">58</li><li style="box-sizing: border-box; padding: 0px 5px;">59</li><li style="box-sizing: border-box; padding: 0px 5px;">60</li><li style="box-sizing: border-box; padding: 0px 5px;">61</li><li style="box-sizing: border-box; padding: 0px 5px;">62</li><li style="box-sizing: border-box; padding: 0px 5px;">63</li><li style="box-sizing: border-box; padding: 0px 5px;">64</li><li style="box-sizing: border-box; padding: 0px 5px;">65</li><li style="box-sizing: border-box; padding: 0px 5px;">66</li><li style="box-sizing: border-box; padding: 0px 5px;">67</li><li style="box-sizing: border-box; padding: 0px 5px;">68</li><li style="box-sizing: border-box; padding: 0px 5px;">69</li><li style="box-sizing: border-box; padding: 0px 5px;">70</li><li style="box-sizing: border-box; padding: 0px 5px;">71</li><li style="box-sizing: border-box; padding: 0px 5px;">72</li><li style="box-sizing: border-box; padding: 0px 5px;">73</li><li style="box-sizing: border-box; padding: 0px 5px;">74</li><li style="box-sizing: border-box; padding: 0px 5px;">75</li><li style="box-sizing: border-box; padding: 0px 5px;">76</li><li style="box-sizing: border-box; padding: 0px 5px;">77</li><li style="box-sizing: border-box; padding: 0px 5px;">78</li><li style="box-sizing: border-box; padding: 0px 5px;">79</li><li style="box-sizing: border-box; padding: 0px 5px;">80</li><li style="box-sizing: border-box; padding: 0px 5px;">81</li><li style="box-sizing: border-box; padding: 0px 5px;">82</li><li style="box-sizing: border-box; padding: 0px 5px;">83</li><li style="box-sizing: border-box; padding: 0px 5px;">84</li><li style="box-sizing: border-box; padding: 0px 5px;">85</li><li style="box-sizing: border-box; padding: 0px 5px;">86</li><li style="box-sizing: border-box; padding: 0px 5px;">87</li><li style="box-sizing: border-box; padding: 0px 5px;">88</li><li style="box-sizing: border-box; padding: 0px 5px;">89</li><li style="box-sizing: border-box; padding: 0px 5px;">90</li><li style="box-sizing: border-box; padding: 0px 5px;">91</li><li style="box-sizing: border-box; padding: 0px 5px;">92</li><li style="box-sizing: border-box; padding: 0px 5px;">93</li><li style="box-sizing: border-box; padding: 0px 5px;">94</li><li style="box-sizing: border-box; padding: 0px 5px;">95</li><li style="box-sizing: border-box; padding: 0px 5px;">96</li><li style="box-sizing: border-box; padding: 0px 5px;">97</li><li style="box-sizing: border-box; padding: 0px 5px;">98</li><li style="box-sizing: border-box; padding: 0px 5px;">99</li><li style="box-sizing: border-box; padding: 0px 5px;">100</li><li style="box-sizing: border-box; padding: 0px 5px;">101</li><li style="box-sizing: border-box; padding: 0px 5px;">102</li><li style="box-sizing: border-box; padding: 0px 5px;">103</li><li style="box-sizing: border-box; padding: 0px 5px;">104</li><li style="box-sizing: border-box; padding: 0px 5px;">105</li><li style="box-sizing: border-box; padding: 0px 5px;">106</li><li style="box-sizing: border-box; padding: 0px 5px;">107</li><li style="box-sizing: border-box; padding: 0px 5px;">108</li><li style="box-sizing: border-box; padding: 0px 5px;">109</li><li style="box-sizing: border-box; padding: 0px 5px;">110</li><li style="box-sizing: border-box; padding: 0px 5px;">111</li><li style="box-sizing: border-box; padding: 0px 5px;">112</li><li style="box-sizing: border-box; padding: 0px 5px;">113</li><li style="box-sizing: border-box; padding: 0px 5px;">114</li><li style="box-sizing: border-box; padding: 0px 5px;">115</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li><li style="box-sizing: border-box; padding: 0px 5px;">40</li><li style="box-sizing: border-box; padding: 0px 5px;">41</li><li style="box-sizing: border-box; padding: 0px 5px;">42</li><li style="box-sizing: border-box; padding: 0px 5px;">43</li><li style="box-sizing: border-box; padding: 0px 5px;">44</li><li style="box-sizing: border-box; padding: 0px 5px;">45</li><li style="box-sizing: border-box; padding: 0px 5px;">46</li><li style="box-sizing: border-box; padding: 0px 5px;">47</li><li style="box-sizing: border-box; padding: 0px 5px;">48</li><li style="box-sizing: border-box; padding: 0px 5px;">49</li><li style="box-sizing: border-box; padding: 0px 5px;">50</li><li style="box-sizing: border-box; padding: 0px 5px;">51</li><li style="box-sizing: border-box; padding: 0px 5px;">52</li><li style="box-sizing: border-box; padding: 0px 5px;">53</li><li style="box-sizing: border-box; padding: 0px 5px;">54</li><li style="box-sizing: border-box; padding: 0px 5px;">55</li><li style="box-sizing: border-box; padding: 0px 5px;">56</li><li style="box-sizing: border-box; padding: 0px 5px;">57</li><li style="box-sizing: border-box; padding: 0px 5px;">58</li><li style="box-sizing: border-box; padding: 0px 5px;">59</li><li style="box-sizing: border-box; padding: 0px 5px;">60</li><li style="box-sizing: border-box; padding: 0px 5px;">61</li><li style="box-sizing: border-box; padding: 0px 5px;">62</li><li style="box-sizing: border-box; padding: 0px 5px;">63</li><li style="box-sizing: border-box; padding: 0px 5px;">64</li><li style="box-sizing: border-box; padding: 0px 5px;">65</li><li style="box-sizing: border-box; padding: 0px 5px;">66</li><li style="box-sizing: border-box; padding: 0px 5px;">67</li><li style="box-sizing: border-box; padding: 0px 5px;">68</li><li style="box-sizing: border-box; padding: 0px 5px;">69</li><li style="box-sizing: border-box; padding: 0px 5px;">70</li><li style="box-sizing: border-box; padding: 0px 5px;">71</li><li style="box-sizing: border-box; padding: 0px 5px;">72</li><li style="box-sizing: border-box; padding: 0px 5px;">73</li><li style="box-sizing: border-box; padding: 0px 5px;">74</li><li style="box-sizing: border-box; padding: 0px 5px;">75</li><li style="box-sizing: border-box; padding: 0px 5px;">76</li><li style="box-sizing: border-box; padding: 0px 5px;">77</li><li style="box-sizing: border-box; padding: 0px 5px;">78</li><li style="box-sizing: border-box; padding: 0px 5px;">79</li><li style="box-sizing: border-box; padding: 0px 5px;">80</li><li style="box-sizing: border-box; padding: 0px 5px;">81</li><li style="box-sizing: border-box; padding: 0px 5px;">82</li><li style="box-sizing: border-box; padding: 0px 5px;">83</li><li style="box-sizing: border-box; padding: 0px 5px;">84</li><li style="box-sizing: border-box; padding: 0px 5px;">85</li><li style="box-sizing: border-box; padding: 0px 5px;">86</li><li style="box-sizing: border-box; padding: 0px 5px;">87</li><li style="box-sizing: border-box; padding: 0px 5px;">88</li><li style="box-sizing: border-box; padding: 0px 5px;">89</li><li style="box-sizing: border-box; padding: 0px 5px;">90</li><li style="box-sizing: border-box; padding: 0px 5px;">91</li><li style="box-sizing: border-box; padding: 0px 5px;">92</li><li style="box-sizing: border-box; padding: 0px 5px;">93</li><li style="box-sizing: border-box; padding: 0px 5px;">94</li><li style="box-sizing: border-box; padding: 0px 5px;">95</li><li style="box-sizing: border-box; padding: 0px 5px;">96</li><li style="box-sizing: border-box; padding: 0px 5px;">97</li><li style="box-sizing: border-box; padding: 0px 5px;">98</li><li style="box-sizing: border-box; padding: 0px 5px;">99</li><li style="box-sizing: border-box; padding: 0px 5px;">100</li><li style="box-sizing: border-box; padding: 0px 5px;">101</li><li style="box-sizing: border-box; padding: 0px 5px;">102</li><li style="box-sizing: border-box; padding: 0px 5px;">103</li><li style="box-sizing: border-box; padding: 0px 5px;">104</li><li style="box-sizing: border-box; padding: 0px 5px;">105</li><li style="box-sizing: border-box; padding: 0px 5px;">106</li><li style="box-sizing: border-box; padding: 0px 5px;">107</li><li style="box-sizing: border-box; padding: 0px 5px;">108</li><li style="box-sizing: border-box; padding: 0px 5px;">109</li><li style="box-sizing: border-box; padding: 0px 5px;">110</li><li style="box-sizing: border-box; padding: 0px 5px;">111</li><li style="box-sizing: border-box; padding: 0px 5px;">112</li><li style="box-sizing: border-box; padding: 0px 5px;">113</li><li style="box-sizing: border-box; padding: 0px 5px;">114</li><li style="box-sizing: border-box; padding: 0px 5px;">115</li></ul>

2.1 HFP的流程文字版

  • 这里需要对HFP的流程有一个明确的思路,这个hfp是两个设备之间进行通信的,所以只了解一端的数据是很难理解的,需要AG和HF端都能够了解,这样的话上面图片中的一些初始化消息到底是怎么来的才能看懂。在csr8670–不能不知道的基本知识,长期记录中,有对HFP的简单分析,但是这里,我们需要对HFP中的两个设备的过程进行详细的分析。
  • 说明,以下来自HFP15_SPEC_V10r00.pdf的翻译,英文有限希望大家去看原文
  • 不管是HF还是AG都会进行SCL(Service Level Connection )的连接建立,但是这个SCL的建立必须依赖于RFCOMM的建立,所以FHP的初始化首先会进行RFCOMM连接的建立。 
    也就是这两个函数
<code class="hljs vbnet has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">/* <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">Set</span> up theHfp->services <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">structure</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">with</span> profiles <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">from</span> app configuration <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">and</span> corresponding <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">default</span> RFCOMM channels.*//*这里是初始化服务的,至于是哪个服务不了解,知道也初始化了RFC相关的通道*/hfpServicesInit(profile, config->multipoint); /*这里是RFC通道注册用的,执行这个函数,会上上面发送一个CL_INTERNAL_RFCOMM_REGISTER_REQ请求*/hfpServiceChannelRegister(theHfp->services);</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li></ul>
  • 接下来处理发送的请求
<code class="hljs markdown has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">  case CL<span class="hljs-emphasis" style="box-sizing: border-box;">_INTERNAL_</span>RFCOMM<span class="hljs-emphasis" style="box-sizing: border-box;">_REGISTER_</span>REQ:<span class="hljs-code" style="box-sizing: border-box;">            PRINT(("CL_INTERNAL_RFCOMM_REGISTER_REQ\n"));</span><span class="hljs-code" style="box-sizing: border-box;">            /*注册rfc请求*/</span><span class="hljs-code" style="box-sizing: border-box;">            connectionHandleRfcommRegisterReq((CL_INTERNAL_RFCOMM_REGISTER_REQ_T *)message);</span><span class="hljs-code" style="box-sizing: border-box;">            break;</span> /<span class="hljs-strong" style="box-sizing: border-box;">*****</span><span class="hljs-strong" style="box-sizing: border-box;">*****</span><span class="hljs-strong" style="box-sizing: border-box;">*****</span><span class="hljs-strong" style="box-sizing: border-box;">*****</span><span class="hljs-strong" style="box-sizing: border-box;">*****</span><span class="hljs-strong" style="box-sizing: border-box;">*****</span><span class="hljs-strong" style="box-sizing: border-box;">*****</span><span class="hljs-strong" style="box-sizing: border-box;">*****</span><span class="hljs-strong" style="box-sizing: border-box;">*****</span><span class="hljs-strong" style="box-sizing: border-box;">*****</span><span class="hljs-strong" style="box-sizing: border-box;">*****</span><span class="hljs-strong" style="box-sizing: border-box;">*****</span><span class="hljs-strong" style="box-sizing: border-box;">*****</span><span class="hljs-strong" style="box-sizing: border-box;">*****</span><span class="hljs-strong" style="box-sizing: border-box;">*****</span>**<span class="hljs-code" style="box-sizing: border-box;">    RFCOMM Register (Sequential)</span><span class="hljs-code" style="box-sizing: border-box;">    Triggers:</span><span class="hljs-code" style="box-sizing: border-box;">        ConnectionRfcommAllocateChannel</span><span class="hljs-code" style="box-sizing: border-box;">        ConnectionRfcommAllocateChannelLazy</span><span class="hljs-code" style="box-sizing: border-box;">    Message Sequence:</span><span class="hljs-code" style="box-sizing: border-box;">        Connection -> BlueStack         RFC_REGISTER_REQ</span><span class="hljs-code" style="box-sizing: border-box;">        Bluestack -> Connection         RFC_REGISTER_CFM</span><span class="hljs-code" style="box-sizing: border-box;">    Response:</span><span class="hljs-code" style="box-sizing: border-box;">        CL_RFCOMM_REGISTER_CFM  //执行这个函数之后会有一个注册确认响应</span><span class="hljs-strong" style="box-sizing: border-box;">*****</span><span class="hljs-strong" style="box-sizing: border-box;">*****</span><span class="hljs-strong" style="box-sizing: border-box;">*****</span><span class="hljs-strong" style="box-sizing: border-box;">*****</span><span class="hljs-strong" style="box-sizing: border-box;">*****</span><span class="hljs-strong" style="box-sizing: border-box;">*****</span><span class="hljs-strong" style="box-sizing: border-box;">*****</span><span class="hljs-strong" style="box-sizing: border-box;">*****</span><span class="hljs-strong" style="box-sizing: border-box;">*****</span><span class="hljs-strong" style="box-sizing: border-box;">*****</span><span class="hljs-strong" style="box-sizing: border-box;">*****</span><span class="hljs-strong" style="box-sizing: border-box;">*****</span><span class="hljs-strong" style="box-sizing: border-box;">*****</span><span class="hljs-strong" style="box-sizing: border-box;">*****</span><span class="hljs-strong" style="box-sizing: border-box;">*****</span><span class="hljs-emphasis" style="box-sizing: border-box;">***</span>/void connectionHandleRfcommRegisterReq(const CL<span class="hljs-emphasis" style="box-sizing: border-box;">_INTERNAL_</span>RFCOMM<span class="hljs-emphasis" style="box-sizing: border-box;">_REGISTER_</span>REQ_T *req){<span class="hljs-code" style="box-sizing: border-box;">            /*  </span><span class="hljs-code" style="box-sizing: border-box;">        Create an entry in the connection map to enable incoming primitives on this</span><span class="hljs-code" style="box-sizing: border-box;">        server channel to be mapped to the correct task </span><span class="hljs-code" style="box-sizing: border-box;">            */</span><span class="hljs-code" style="box-sizing: border-box;">    MAKE_PRIM_T(RFC_REGISTER_REQ);</span><span class="hljs-code" style="box-sizing: border-box;">    prim->phandle           = 0;</span><span class="hljs-code" style="box-sizing: border-box;">    prim->context           = (uint16) req->theAppTask;      </span><span class="hljs-code" style="box-sizing: border-box;">    prim->flags             = 0;</span><span class="hljs-code" style="box-sizing: border-box;">    prim->loc_serv_chan_req = req->suggested_server_channel;</span><span class="hljs-code" style="box-sizing: border-box;">    VmSendRfcommPrim(prim);</span>}执行这个函数之后,会从Bluestack 发送回来MESSAGE<span class="hljs-emphasis" style="box-sizing: border-box;">_BLUESTACK_</span>RFCOMM<span class="hljs-emphasis" style="box-sizing: border-box;">_PRIM接着执行--->connectionBluestackHandlerRfcomm(theCm, (RFCOMM_</span>UPRIM<span class="hljs-emphasis" style="box-sizing: border-box;">_T *)message)--->由上面可知为RFC_</span>REGISTER<span class="hljs-emphasis" style="box-sizing: border-box;">_CFM消息所以处理connectionHandleRfcommRegisterCfm((RFC_</span>REGISTER<span class="hljs-emphasis" style="box-sizing: border-box;">_CFM_</span>T<span class="hljs-emphasis" style="box-sizing: border-box;">*)message)函数,这个函数会发送一个CL_RFCOMM_REGISTER_CFM消息,也就是上面说的注册确认响应---> hfpInitRfcommRegisterCfm((CL_RFCOMM_REGISTER_CFM_T *</span>) message)至此,RFCOMM的注册过程结束</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li></ul>
  • 接下来分析这个函数 ConnectionSyncRegister(&theHfp->task);
<code class="hljs perl has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">void ConnectionSyncRegister(Task theAppTask){    <span class="hljs-regexp" style="color: rgb(0, 136, 0); box-sizing: border-box;">/* Send an internal register request message */</span>    MAKE_CL_MESSAGE(CL_INTERNAL_SYNC_REGISTER_REQ);    message->theAppTask = theAppTask;    MessageSend(connectionGetCmTask(), CL_INTERNAL_SYNC_REGISTER_REQ, message);<span class="hljs-regexp" style="color: rgb(0, 136, 0); box-sizing: border-box;">/*发送了一个同步注册请求,向连接库的回调函数*/</span>}--->执行这个函数 connectionHandleSyncRegisterRe<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">q((CL_INTERNAL_SYNC_REGISTER_REQ_T <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">*)</span> message)</span>;看注释是什么同步连接必须要注册这个函数,所以不用管了之后</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li></ul>

接下来我还在看英文的文档。。。

转载:http://blog.csdn.net/code_warry/article/details/50524915

1 0