<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>音量 on 栈外随记</title>
    <link>https://btio.cn/tags/%E9%9F%B3%E9%87%8F/</link>
    <description>Recent content in 音量 on 栈外随记</description>
    <image>
      <title>栈外随记</title>
      <url>https://btio.cn/images/logo-arong.svg</url>
      <link>https://btio.cn/images/logo-arong.svg</link>
    </image>
    <generator>Hugo</generator>
    <language>zh-CN</language><lastBuildDate>Fri, 14 Aug 2026 10:38:44 +0800</lastBuildDate>
    <atom:link href="https://btio.cn/tags/%E9%9F%B3%E9%87%8F/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>【中科蓝讯】TWS音量是怎样同步的</title>
      <link>https://btio.cn/posts/2026/08/14/%E4%B8%AD%E7%A7%91%E8%93%9D%E8%AE%AFtws%E9%9F%B3%E9%87%8F%E6%98%AF%E6%80%8E%E6%A0%B7%E5%90%8C%E6%AD%A5%E7%9A%84/</link>
      <pubDate>Fri, 14 Aug 2026 10:38:44 +0800</pubDate>
      <guid>https://btio.cn/posts/2026/08/14/%E4%B8%AD%E7%A7%91%E8%93%9D%E8%AE%AFtws%E9%9F%B3%E9%87%8F%E6%98%AF%E6%80%8E%E6%A0%B7%E5%90%8C%E6%AD%A5%E7%9A%84/</guid>
      <description>&lt;p&gt;这篇梳理音乐音量在应用层的处理：手机下发的音量怎样换算为本地等级，左右耳怎样同时生效，以及耳机按键调节后怎样同步手机音量条。通话音量只作区分，不展开 HFP 细节。&lt;/p&gt;
&lt;h2 id=&#34;section-1&#34;&gt;一、手机调节音量后的主流程&lt;/h2&gt;
&lt;p&gt;一次音量调节要对应下面四处状态：&lt;/p&gt;
&lt;div class=&#34;mermaid-diagram&#34; role=&#34;group&#34; aria-label=&#34;流程图&#34;&gt;
  &lt;pre class=&#34;mermaid&#34;&gt;%%{init: {&amp;#34;flowchart&amp;#34;: {&amp;#34;htmlLabels&amp;#34;: true, &amp;#34;wrappingWidth&amp;#34;: 1000, &amp;#34;rankSpacing&amp;#34;: 30}, &amp;#34;themeVariables&amp;#34;: {&amp;#34;lineColor&amp;#34;: &amp;#34;#71829a&amp;#34;}}}%%
flowchart LR
    N0[&amp;#34;手机音量条&amp;#34;]
    N1[&amp;#34;耳机内部音量级&amp;#34;]
    N2[&amp;#34;左右耳同步状态&amp;#34;]
    N3[&amp;#34;DAC 实际输出音量&amp;#34;]
    N0 --&amp;gt; N1
    N1 --&amp;gt; N2
    N2 --&amp;gt; N3
    class N0,N1,N2,N3 blue;
    classDef blue fill:#e8f2ff,stroke:#7ba4d8,color:#23456b,stroke-width:1.5px;
    classDef green fill:#e7f4ec,stroke:#78aa8b,color:#24563a,stroke-width:1.5px;
    classDef amber fill:#fff3df,stroke:#d5a25b,color:#72501e,stroke-width:1.5px;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;手机和耳机的音量范围并不相同。AVRCP 绝对音量是 0～127，SDK 内部可配置为 16 级或 32 级，最后还要通过音量表转换为 DAC 使用的数字音量。&lt;/p&gt;
&lt;p&gt;因此，手机显示 50% 不等于把数值 50 直接写入 DAC，而是先换算、再查表。&lt;/p&gt;
&lt;p&gt;这里的“绝对音量”指手机音量条和耳机媒体音量相互对应：任一侧调节，另一侧都要更新。&lt;/p&gt;
&lt;p&gt;手机调节音乐音量后，协议栈将新的媒体音量交给应用层，主线如下：&lt;/p&gt;
&lt;div class=&#34;mermaid-diagram&#34; role=&#34;group&#34; aria-label=&#34;流程图&#34;&gt;
  &lt;pre class=&#34;mermaid&#34;&gt;%%{init: {&amp;#34;flowchart&amp;#34;: {&amp;#34;htmlLabels&amp;#34;: true, &amp;#34;wrappingWidth&amp;#34;: 1000, &amp;#34;rankSpacing&amp;#34;: 30}, &amp;#34;themeVariables&amp;#34;: {&amp;#34;lineColor&amp;#34;: &amp;#34;#71829a&amp;#34;}}}%%
flowchart TB
    subgraph R0[&amp;#34;① 接收与换算&amp;#34;]
        direction LR
        R0N0[&amp;#34;收到手机设置的媒体音量&amp;#34;]
        R0N1[&amp;#34;把 0～127&amp;lt;br/&amp;gt;换算为本地音量级&amp;#34;]
        R0N2[&amp;#34;发起 TWS 定时音量请求&amp;#34;]
        R0N0 --&amp;gt; R0N1 --&amp;gt; R0N2
    end
    class R0N0,R0N1,R0N2 blue;
    style R0 fill:#f1f6fd,stroke:#b8cfe8,color:#23456b
    subgraph R1[&amp;#34;② 定时执行与保存&amp;#34;]
        direction LR
        R1N0[&amp;#34;左右耳在约定时间设置 DAC&amp;#34;]
        R1N1[&amp;#34;更新当前音量&amp;lt;br/&amp;gt;后续再延时保存&amp;#34;]
        R1N0 --&amp;gt; R1N1
    end
    class R1N0,R1N1 green;
    style R1 fill:#f0f8f3,stroke:#b9d7c4,color:#24563a
    R0 --&amp;gt; R1
    classDef blue fill:#e8f2ff,stroke:#7ba4d8,color:#23456b,stroke-width:1.5px;
    classDef green fill:#e7f4ec,stroke:#78aa8b,color:#24563a,stroke-width:1.5px;
    classDef amber fill:#fff3df,stroke:#d5a25b,color:#72501e,stroke-width:1.5px;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;TWS 路径不会在当前回调里直接设置 DAC，而是先发起定时请求；到达定时点后，左右耳再一起设置实际音量。&lt;/p&gt;</description>
    </item>
    <item>
      <title>【中科蓝讯】TWS 耳机音量问题单复盘</title>
      <link>https://btio.cn/posts/2026/08/14/%E4%B8%AD%E7%A7%91%E8%93%9D%E8%AE%AFtws-%E8%80%B3%E6%9C%BA%E9%9F%B3%E9%87%8F%E9%97%AE%E9%A2%98%E5%8D%95%E5%A4%8D%E7%9B%98/</link>
      <pubDate>Fri, 14 Aug 2026 00:00:00 +0800</pubDate>
      <guid>https://btio.cn/posts/2026/08/14/%E4%B8%AD%E7%A7%91%E8%93%9D%E8%AE%AFtws-%E8%80%B3%E6%9C%BA%E9%9F%B3%E9%87%8F%E9%97%AE%E9%A2%98%E5%8D%95%E5%A4%8D%E7%9B%98/</guid>
      <description>&lt;h2 id=&#34;preface&#34;&gt;写在开始&lt;/h2&gt;
&lt;p&gt;这篇文章整理项目中比较有代表性的音量问题单。只保留已经写明原因和处理方向的内容，并按音量控制链路归为三类。&lt;/p&gt;
&lt;p&gt;排查音量问题时，可以先确认四个结果：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;1. 收到的目标音量是否正确
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;2. 左右耳保存的音量是否一致
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;3. 两耳应用音量的时间是否一致
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;4. 实际写入硬件的音量是否正确
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;本文围绕下面三类问题，整理对应的现象和排查思路：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&#34;#section-1&#34;&gt;回连后的初始音量不对&lt;/a&gt;
；&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#section-2&#34;&gt;快速调节时双耳音量不同步&lt;/a&gt;
；&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#section-3&#34;&gt;出盒恢复时单耳突然变大&lt;/a&gt;
。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;section-1&#34;&gt;一、回连后的初始音量不对&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;问题现象 1&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;耳机重新组队并连接手机后，预期使用耳机的默认音量，实际却变成手机之前保存的最大音量。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;排查思路 1&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;按时间确认三个值：重新组队后恢复的默认音量、手机首次下发的历史音量，以及最终实际生效的音量。若默认值恢复正确，但最终值变成手机历史值，说明问题出在手机下发后的覆盖。&lt;/p&gt;
&lt;p&gt;耳机重新组队后已恢复到默认音量，但手机连接时下发的历史音量又覆盖了本地值。如果要求重新组队后采用耳机默认音量，可以在首次连接的短暂保护窗口内忽略手机下发的音量，使用耳机的默认音量，同时将默认音量写回给 App。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;问题现象 2&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;一拖二场景下，设备 A 已连接耳机且音量调到最大；设备 B 的音量较小，在播放音乐时抢连耳机。抢连成功后，音乐开始时仍按设备 A 的最大音量播放，随后才突然降到设备 B 的低音量。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;排查思路 2&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;检查抢连后耳机采用的是哪台设备的音量，以及 A2DP 开始播放前硬件音量是否已经更新。&lt;/p&gt;
&lt;p&gt;已有问题中，设备 B 抢连成功后，硬件音量设置晚于音乐开始，导致开始播放时仍保留设备 A 的最大音量。处理时要在 A2DP 出声前，按设备 B 的音量设置好硬件音量。&lt;/p&gt;
&lt;h2 id=&#34;section-2&#34;&gt;二、快速调节时双耳音量不同步&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;问题现象 1&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;长按手机音量键或快速滑动音量条时，声音会短暂偏向一边；从最大音量降到静音时，一只耳机比另一只更晚无声。反复在最大和最小音量之间切换时，还可能出现音量跳变。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;排查思路 1&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;先看手机下发音量后，主从耳是不是在 alarm 到点前就各自更新了本地媒体音量；再对比 alarm 回调里两边实际采用的目标值。&lt;/p&gt;
&lt;p&gt;已有问题中，主从耳在 alarm 到点前更新本地媒体音量的路径不同。快速滑动时，虽然两边在同一时刻进入 alarm 回调，但取到的音量基准已经不一致，所以会出现一边先变大、先变小或更晚静音。&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
