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,决定音频流走哪个设备、哪个音区、以及跟其他音频流怎么混音。

举个例子,电话来了:

  1. 系统检测到USAGE_VOICE_COMMUNICATION的音频流。
  2. 路由策略判断:电话优先级高,需要暂停或闪避媒体。
  3. 电话音频路由到主驾和副驾的通信专用喇叭(通常是头枕或中置)。
  4. 后排媒体继续播放,但音量稍微降低,避免干扰前排通话。

你看,这就是基于应用的路由。它跟音区路由是配合使用的——音区决定“去哪里”,应用决定“怎么去”。

我在项目中遇到过一个问题:语音助手(Assistant)和导航(Navigation)同时发声,结果两个声音都从同一个喇叭出来,互相干扰。后来我加了一条规则:当Assistant激活时,导航音频做Ducking,音量降到20%。这样用户既能听清语音助手,又不会完全错过导航提示。

注意:基于应用的路由,最怕的是“应用冲突”。比如两个应用同时申请同一个音频设备,或者一个应用占用了不该占的音区。我建议在HAL层做一个路由仲裁器,统一管理所有音频流的申请和释放。别让应用层直接操作路由,否则你会被各种奇怪的bug折磨到怀疑人生。

3.4 实战中的坑与建议

最后,分享几个我在实战中踩过的坑:

  • 坑1:音区切换有延迟。有一次,用户从主驾切到副驾打电话,声音延迟了1秒才切换过去。原因是路由策略里做了“淡入淡出”处理,但参数没调好。后来我把淡入时间从500ms改成200ms,问题解决。
  • 坑2:多音区混音导致失真。后排看视频,前排导航,两个音频流在DSP里混音时,因为增益没对齐,出现了削波失真。嗯,这个得靠DSP工程师调参,软件只能给建议。
  • 坑3:应用层绕过路由策略。有些第三方应用直接调用底层音频接口,绕过了系统的路由策略。我建议在HAL层做强制路由,不允许应用直接选择输出设备。

好了,关于音频路由策略,今天就聊这么多。记住三句话:原则定优先级,音区定空间,应用定功能。下一章咱们讲音频焦点管理,那是跟路由策略紧密配合的另一块拼图。