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;">DESCRIPTIONInitialises <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的初始化过程进行简单分析。 

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 RETURNEDHFP_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和Hsp2:不支持多点连接支持Hfp或者Hsp3:支持多点连接也支持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

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

  1. 【转载】csr8670--sink工程的大致工作流程分析(以speaker为例)二

    csr8670--sink工程的大致工作流程分析(以speaker为例)二 1.编解码任务的初始化 继续接着流程一分析: 1.1 当连接初始化完成之后,如下所示会调用编解码的初始化任务:这个编解码的任 ...

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

    今天是14号 15号更新,说明,刚开始看程序有点复杂 没办法,必须看代码  建议首先先把ADK3.5.1中的例程tutorials看完,对学习很有帮助 1.csr中的消息机制 1.1 adk3.5.1 ...

  3. 16.U-boot的工作流程分析-2440

    16.U-boot的工作流程分析-2440 分析的流程: 程序入口 第一阶段程序分析 第二阶段程序分析 2440开发板: 1.uboot的入口: 要看uboot工程的入口,首先打开顶层目录的Makef ...

  4. K8S架构设计及工作流程分析

    Kubernetes架构设计 核心组件 api server 功能 controller manager 负责维护集群的状态 scheduler 负责资源的调度按照预定的调度策略将Pod调度到相应的机 ...

  5. kafka的基本概念和工作流程分析

    为什么需要消息队列 周末无聊刷着手机,某宝网APP突然蹦出来一条消息"为了回馈老客户,女朋友买一送一,活动仅限今天!".买一送一还有这种好事,那我可不能错过!忍不住立马点了去.于是 ...

  6. 【SemiDrive源码分析】【X9芯片启动流程】14 - freertos_safetyos目录Cortex-R5 SafetyOS/RTOS工作流程分析

    [SemiDrive源码分析][X9芯片启动流程]14 - freertos_safetyos目录Cortex-R5 SafetyOS/RTOS工作流程分析 一.SafetyOS 工作流程分析 1. ...

  7. 你想要的系列:网络请求框架OkHttp3全解系列 - (二)OkHttp的工作流程分析

    Okhttp系列文章: 你想要的系列:网络请求框架OkHttp3全解系列 - (一)OkHttp的基本使用 你想要的系列:网络请求框架OkHttp3全解系列 - (二)OkHttp的工作流程分析 你想 ...

  8. Zygote工作流程分析

    Zygote 接收客户端创建进程的请求,使用JNI调用linux fork函数创建进程. Zygote是在Init进程中作为Service被启动的.Zygote进程的主体是:ZygoteInit. Z ...

  9. Android 7.0 WifiMonitor工作流程分析

    2019独角兽企业重金招聘Python工程师标准>>> 在wifi启动扫描的分析过程中,出现了多次WifiMonitor的操作,在此分析一下这个函数是如何工作的. 在Android的 ...

最新文章

  1. .NET 数据访问中间件 HyperDAL v1.1 FAQ
  2. 每日问题记录20171117
  3. 《软件工艺师:专业、务实、自豪》一3.7.2 软件工艺概念走向全球
  4. Mysql存储过程中的事务回滚
  5. 转 : 深入解析Java锁机制
  6. linux摄像头内核驱动开发,FS_S5PC100平台上Linux Camera驱动开发详解(一)
  7. HDU 5776 sum (BestCoder Round #85 A) 简单前缀判断+水题
  8. OpenOffice介绍
  9. python识别验证码——PIL,pytesser,pytesseract的安装
  10. SQL2005学记笔记(4)
  11. windows 消息
  12. C# ManualResetEvent 与 AutoResetEvent 区别
  13. CPU idle框架
  14. SpringMVC学习-helloSpringMVC
  15. 【软考 系统架构设计师】计算机组成与体系结构⑥ 流水线
  16. 微信CRM管理系统功能分析
  17. (附源码)springboot毕业论文管理系统 毕业设计 030946
  18. Qt 窗体显示在屏幕最上面
  19. 说下更新百度快照的利弊
  20. 八大常用电子元器件,你知道多少?今天给大家讲个透彻,让你明白

热门文章

  1. objdump使用方法
  2. 搜索关键字变红,指定字段变色 一行代码简单集成 搜索关键字变红,Android字体变红,指定字段变红
  3. 这个js转html,html转js的代码
  4. 蓝桥杯模块四路运算放大器LM324
  5. 寝室环境对大学生睡眠的影响调查
  6. 全球最小的zigbee模块---XBee3微型封装模块
  7. 基于神经网络rnn模型的心脏病预测案例详细教程
  8. el-tree实现仅限叶子节点显示勾选框,并且只能单选
  9. 全球及中国挤塑聚苯板(XPS板)行业研究及十四五规划分析报告
  10. 人工智能巡检机器人十大品牌,值得收藏