3、音频路由策略:路由策略设计原则、基于音区的路由、基于应用的路由
好,咱们今天聊聊音频路由策略。说实话,这是车载音频系统里最核心、也最容易出幺蛾子的部分。你想想看,一辆车里可能有七八个音区,每个音区同时跑着导航、音乐、电话、语音助手……这些声音怎么分配?谁优先?谁被切断?这就是路由策略要解决的问题。
我个人习惯把路由策略分成三个层次来理解:设计原则是骨架,基于音区的路由是空间维度,基于应用的路由是功能维度。咱们一个一个说。
3.1 路由策略设计原则
先讲原则。没有原则,路由就是一锅粥。我在项目中遇到过好几次,客户说“我要所有声音都能同时播放”,结果一上车,导航和音乐打架,电话进来谁也听不清。嗯,这就是没定好规矩。
我总结了几条核心原则:
- 优先级至上:安全相关的声音永远最高。比如ADAS告警、倒车雷达、紧急电话。这个没得商量。
- 音区隔离:主驾听导航,后排看视频,互不干扰。这是多音区的基本要求。
- 动态切换:用户操作或系统事件触发时,路由要能平滑切换,不能有爆音或断音。
- 可配置性:不同车型、不同配置,路由策略要能灵活调整。写死在代码里?那是给自己挖坑。
核心观点:路由策略的本质是“在正确的时间,把正确的声音,送到正确的位置”。
你可能会问:“那优先级怎么定?” 我一般用一张表来管理:
| 优先级 | 音频类型 | 示例 | 路由行为 |
|---|---|---|---|
| 1(最高) | 安全告警 | ADAS、倒车雷达 | 抢占所有音区,强制播放 |
| 2 | 通信 | 蓝牙电话、VoIP | 暂停或降低其他音频 |
| 3 | 导航 | GPS语音提示 | 混音或闪避(Ducking) |
| 4 | 媒体 | 音乐、视频 | 正常播放,可被更高优先级打断 |
| 5(最低) | 系统音效 | 按键音、提示音 | 仅在空闲时播放 |
这张表看起来简单,但实际落地时坑很多。我曾经在一个项目里,把导航优先级设得比电话还高,结果用户打电话时导航一直插话……嗯,被投诉了。后来改成导航做闪避(Ducking),电话进来时导航音量自动降50%,体验就好多了。
3.2 基于音区的路由
好,原则讲完了,咱们看看具体怎么落地。先说基于音区的路由。
什么叫音区?说白了,就是车里的一个“声音空间”。比如主驾位是一个音区,副驾是另一个,后排左右各一个,甚至第三排也可以独立。每个音区有自己的扬声器组合和声学特性。
基于音区的路由,核心是把音频流定向到指定的音区。举个例子:
- 主驾在导航,导航语音只从主驾头枕喇叭出来,不打扰副驾听歌。
- 后排孩子在用平板看动画片,声音只从后排扬声器播放。
- 副驾在打电话,电话音频只走副驾音区,主驾完全听不到。
我在做某个车型的HAL层时,遇到过一个问题:后排音区的音频路由到前排去了。查了半天,发现是音频策略配置文件(audio_policy_configuration.xml)里,音区映射写错了。你看,这种低级错误,一旦上了车,用户体验直接崩。
这里我贴一段简化版的音区路由配置示例:
<!-- audio_policy_configuration.xml 片段 -->
<audioPolicyConfiguration>
<zones>
<zone name="DriverZone">
<devicePorts>
<devicePort tagName="DriverSpeaker" type="speaker"/>
<devicePort tagName="DriverHeadrest" type="speaker"/>
</devicePorts>
<routingRules>
<rule usage="navigation">
<output device="DriverHeadrest"/>
</rule>
<rule usage="media">
<output device="DriverSpeaker"/>
</rule>
</routingRules>
</zone>
<zone name="RearLeftZone">
<devicePorts>
<devicePort tagName="RearLeftSpeaker" type="speaker"/>
</devicePorts>
<routingRules>
<rule usage="media">
<output device="RearLeftSpeaker"/>
</rule>
</routingRules>
</zone>
</zones>
</audioPolicyConfiguration>
这段配置的意思是:导航只走主驾头枕喇叭,媒体走主驾门板喇叭;后排左区的媒体只走后排左喇叭。你看,逻辑很清楚。
小提示:音区路由的难点不在配置,而在硬件支持。如果你的车没有独立功放通道,或者扬声器布局不支持分区,那软件再怎么配也没用。所以,做路由策略前,先跟硬件团队对齐。
3.3 基于应用的路由
说完空间维度,咱们再看功能维度——基于应用的路由。
什么叫基于应用?就是根据音频的用途(Usage)来决定路由。Android Automotive里,每个音频流都有一个usage属性,比如:
USAGE_MEDIA:音乐、视频USAGE_NAVIGATION:导航语音USAGE_VOICE_COMMUNICATION:电话USAGE_ASSISTANT:语音助手USAGE_ALARM:闹钟、告警
基于应用的路由,就是根据这些usage,决定音频流走哪个设备、哪个音区、以及跟其他音频流怎么混音。
举个例子,电话来了:
- 系统检测到
USAGE_VOICE_COMMUNICATION的音频流。 - 路由策略判断:电话优先级高,需要暂停或闪避媒体。
- 电话音频路由到主驾和副驾的通信专用喇叭(通常是头枕或中置)。
- 后排媒体继续播放,但音量稍微降低,避免干扰前排通话。
你看,这就是基于应用的路由。它跟音区路由是配合使用的——音区决定“去哪里”,应用决定“怎么去”。
我在项目中遇到过一个问题:语音助手(Assistant)和导航(Navigation)同时发声,结果两个声音都从同一个喇叭出来,互相干扰。后来我加了一条规则:当Assistant激活时,导航音频做Ducking,音量降到20%。这样用户既能听清语音助手,又不会完全错过导航提示。
注意:基于应用的路由,最怕的是“应用冲突”。比如两个应用同时申请同一个音频设备,或者一个应用占用了不该占的音区。我建议在HAL层做一个路由仲裁器,统一管理所有音频流的申请和释放。别让应用层直接操作路由,否则你会被各种奇怪的bug折磨到怀疑人生。
3.4 实战中的坑与建议
最后,分享几个我在实战中踩过的坑:
- 坑1:音区切换有延迟。有一次,用户从主驾切到副驾打电话,声音延迟了1秒才切换过去。原因是路由策略里做了“淡入淡出”处理,但参数没调好。后来我把淡入时间从500ms改成200ms,问题解决。
- 坑2:多音区混音导致失真。后排看视频,前排导航,两个音频流在DSP里混音时,因为增益没对齐,出现了削波失真。嗯,这个得靠DSP工程师调参,软件只能给建议。
- 坑3:应用层绕过路由策略。有些第三方应用直接调用底层音频接口,绕过了系统的路由策略。我建议在HAL层做强制路由,不允许应用直接选择输出设备。
好了,关于音频路由策略,今天就聊这么多。记住三句话:原则定优先级,音区定空间,应用定功能。下一章咱们讲音频焦点管理,那是跟路由策略紧密配合的另一块拼图。