为了让应用程序产生声音,系统必须包含几个组成部分:
这整个系统被称为QNX声音架构(QSA)。QSA设计在很大程度上借鉴了高级Linux声音架构(ALSA)版本0.5.2,继承了大量ALSA的内容,但随着两个系统的持续发展和扩展,它们之间的直接兼容性丢失了。QSA还提供音频并发管理,可以管理音频降低、音频抢占和音量渐增。
本文档集中于定义API并提供如何使用它的示例。但在定义API调用之前,你需要先了解一些关于架构的背景知识。如果你想立刻开始,可以参见附录中的“wav”播放器和“wav”录音机的示例,分别在wave.c和waverec.c中。
QNX声学管理平台(AMP)实现了从捕获到播放的音频路径,该路径针对低延迟、高帧率、小帧尺寸的实时声学信号处理应用进行了优化。
QNX AMP通过使用io-audio低延迟音频架构扩展了QSA的信号处理功能。在这个架构中,可以加载一个或多个AMP功能模块(AFMs)和声学处理扩展库(APXs)。
AFM(AMP功能模块)是音频处理模块,它们在数字领域内连接到PCM(脉冲编码调制)设备,以执行专门的音频处理功能。在大多数情况下,AFM被配置为从PCM输入分离器获取数据,并将数据发送到PCM软件混音器。这种配置允许AFM与使用同一音频PCM硬件设备的其他音频功能和应用程序并行运行。AFM为各种功能提供解决方案,例如声学回声消除、安全警报监控、发动机降噪(engine order reduction)、发动机声音增强、外部行人警报、车内通信和噪声降低。AFM还可以简单地充当捕获在一个PCM设备上和播放在另一个PCM设备上的桥梁。
与AFM不同,APX(声学处理扩展库)位于PCM软件混音器和输入分离器中,在这里,它们扩展并优化音频流的感知质量,并为音频流的采集和注入提供接入点,以便于分析目的。
这种低延迟软件框架使得在应用处理器上实现要求严苛的声学算法成为可能,而不是依赖于专用的数字信号处理器(DSP)。它以模块化、完全向后兼容的方式扩展了QNX Neutrino现有的音频基础设施,因此像电话、语音识别、导航和媒体播放这样的应用程序都能完全不修改地运行,并与系统的声学信号处理功能积极互动。
这种设计允许QNX系统灵活地处理各种音频处理任务,同时保持低延迟和高性能。这对于需要实时音频处理的应用程序尤为重要,例如在汽车环境中的语音控制系统、先进的噪声控制系统,或是其他需要实时音频处理的环境。通过在软件层面实现这些功能,QNX提供了一种更加灵活和成本效益高的解决方案,相比于使用专用的硬件DSP。
QSA(QNX Sound Architecture)允许单个音频输入和输出硬件控制器同时服务于一个或多个麦克风以及一个或多个扬声器,这些设备位于您的目标环境中。为了能够在模块/进程/线程之间同时共享这些设备,播放路径上的PCM(脉冲编码调制)软件混音器将多个音频流混合成一个单一的输出音频流,这个流被发送到主扬声器。同时,在捕获路径上的PCM输入分离器复制并分发来自单一麦克风(单声道或多声道)的音频流到不同的模块/进程/线程。在播放路径上并发访问的一个例子是媒体播放器、车内通信(ICC)模块和QNX声学用于语音(QAV)模块同时向一个或多个车厢扬声器的播放设备写入音频。在捕获路径上的一个例子是语音识别应用程序、ICC模块和QAV模块同时从一个或多个车厢麦克风的捕获设备获取数据。如果没有播放用的PCM软件混音器和捕获用的PCM输入分离器,任何给定时间只有单个模块/进程/线程可以访问硬件设备。
这种架构使得多个音频源和目标能够在不冲突的情况下共存和操作,极大地增强了系统的灵活性和多功能性。它对于需要处理多种音频输入和输出的复杂应用场景,如汽车娱乐和通信系统,尤其有用。通过这种方式,QSA为开发人员提供了一个强大的框架,用于创建高度集成和响应性的音频应用程序。
QNX AMP包括LiveAMP,这是一套调优、诊断和分析工具,它允许对系统参数进行实时调整,能够在系统中多个接入点进行信号流的流式传输和注入,以及提供实时频谱和波形显示。AFM(AMP功能模块)通过声学控制服务器(ACS)进行远程控制,ACS无缝链接LiveAMP到io-audio中的AFM和APX(声学处理扩展库)模块。
LiveAMP的功能使得工程师和开发者能够在系统运行时对音频处理参数进行实时的调整和优化。这对于实时音频应用(如车载系统、高级通信设备等)至关重要,因为它们需要在不同的环境和条件下保持最佳的音频性能。
ACS作为控制中心,它提供了一个界面,通过这个界面,可以远程操控和调整AFM和APX模块的设置。这种远程控制能力特别适用于需要精细调校的复杂音频系统,如在汽车中对噪声控制和声音增强系统的调整。
通过将LiveAMP和ACS结合使用,QNX AMP提供了一个强大且灵活的工具集,用于高级声学信号处理的实时监控、分析和调整。这样的集成解决方案可以显著提高音频系统的性能和用户体验,尤其是在需要高度定制和实时反馈的应用中。
除了QSA支持的音频设备外,AMP还提供了以下设备:
AFM设备是控制和检查AFM状态的入口点。可以使用snd_afm_*()函数来打开和与AFM交互。为了简化AFM访问,还发布了与相关声学处理库相对应的符号链接(例如,对于车内通信模块,为/dev/snd/icc)。
某些AFM会创建一个PCM设备,为应用程序提供与AFM处理的音频接口。这个设备简单地作为一个新的播放、捕获或播放和捕获PCM设备出现,其卡和设备编号与关联的AFM相匹配。写入此类PCM播放设备的数据在传递给PCM硬件或软件混音器设备之前,会经过AFM处理算法。可以使用snd_pcm_*()函数以与非AFM PCM设备相同的方式打开和交互PCM设备。为了简化PCM访问,也发布了符号链接(以“p”结尾代表播放,或以“c”结尾代表捕获),例如,对于QNX声学用于语音模块,会添加/dev/snd/voicep和dev/snd/voicec。
创建PCM设备的AFM如果启用了音量控制,也可以创建混音器设备。混音器设备的卡和设备编号与关联的AFM匹配。可以使用snd_mixer_*()函数以与非AFM混音器设备相同的方式打开和交互混音器设备。
由于声学处理扩展(APX)库位于PCM软件混音器或输入分离器内,因此它们不作为单独的设备存在。然而,仍然可以通过关联的PCM设备使用snd_apx_*()函数与它们交互。
AMP通过snd_afm_()和snd_apx_()函数得到支持。除了基本控制和状态之外,这些函数还提供了一个接口来输入车辆输入(VIN)数据,这些数据来自CAN总线,供AFM使用。更多信息,请参见音频库。
io-audio的-c选项允许您使用在启动时加载的配置文件来配置低延迟软件框架。
您使用配置文件来加载提供QNX AMP功能的DLL(动态链接库)。
音频设备索引基于各自音频驱动程序在io-audio进程中的挂载顺序。在创建音频配置文件时,请牢记这一点。[ctrl]部分的顺序决定了音频驱动程序挂载到io-audio进程的顺序,从而决定了每个音频设备的索引。通常,这意味着您希望主音频设备(主麦克风和扬声器)的[ctrl]部分是音频配置文件中的第一个[ctrl]部分,任何次要音频设备(蓝牙、无线电调谐器等)及与这些设备连接的AFM应该跟随其后。
音频设备索引使用卡和设备编号。每个[ctrl]或[afm]创建一个卡片,卡片索引从0开始,每个[ctrl]或[afm]类型的部分递增。每张卡下面有0个或多个设备。(如果有[audiomgmt]部分,它被分配卡0,除非使用unit键指定了不同的值。)
您可以在音频配置文件中使用[acs]部分来加载deva-acs-link DLL。这个DLL创建了一个afm入口点,并实例化了ACS链接。
有关io-audio配置文件的详细描述,请参见Utilities Reference中的io-audio。
音频鸭音特性[X1] 对AFM音频流的影响与通过PCM软件混音器的AFM混音路径(默认路由)路由的其他音频流不同。
QSA音频并发管理从不降低AFM的音频流量。
ASD、CSA和ICC AFM不降低任何其他音频流(在典型配置中,这些AFM始终处于开启状态,如果允许,它们会永久降低车舱中的其他音频)。
您可以配置QAV和Bridge AFM降低通过主混音器音频路径播放的特定音频流(例如,媒体播放)。然而,通过AFM混音路径路由Bridge AFM并不是该AFM的典型用例。
产生或捕捉(即录制)声音所需的基本硬件是音频芯片或声卡,简称为卡。QSA可以同时支持多个卡,并且甚至可以“即时”挂载和卸载卡(稍后将详细介绍)。所有声音设备都连接到一个卡上,因此要访问一个设备,首先必须知道它连接到哪个卡上。
设备包括:
控制器Control
混音器Mixer
脉冲编码调制 (PCM)
PCM 设备负责将数字声音序列转换为模拟波形,或将模拟波形转换为数字声音序列。每个设备只能以一种模式运行。如果它将数字信号转换为模拟信号,那么它是一个播放通道设备;如果它将模拟信号转换为数字信号,那么它是一个捕获通道设备。
PCM 设备通常以播放和捕获成对的形式创建,在同一个卡下创建两个具有相同设备索引的条目,并带有方向标识符后缀('p' 表示播放,'c' 表示捕获)。
每个 deva-ctrl-* DLL 创建一个逻辑声卡。对于每张卡,都有一个控制器(controlCx),以及一个或多个混音器(mixerCxDy)和 PCM 设备(pcmCxDyz)条目。卡号(x)从零开始,并按照 DLL 加载的顺序递增。io-audio 命令的 driver(unit=number)选项可用于指定在命令行上跟随它的 DLL 使用的特定卡号。
您可以使用 ls 命令列出系统上的设备。例如:
# ls -l /dev/snd
total 0
lrw-rw-rw- 1 root root 0 May 31 11:11 capture -> pcmC0D0c
-rw-rw-rw- 1 root root 0 May 31 11:11 controlC0
-rw-rw-rw- 1 root root 0 May 31 11:11 mixerC0D0
-rw-rw-rw- 1 root root 0 May 31 11:11 pcmC0D0c
-rw-rw-rw- 1 root root 0 May 31 11:11 pcmC0D0p
lrw-rw-rw- 1 root root 0 May 31 11:11 pcmPreferredc -> pcmC0D0c
lrw-rw-rw- 1 root root 0 May 31 11:11 pcmPreferredp -> pcmC0D0p
lrw-rw-rw- 1 root root 0 May 31 11:11 playback -> pcmC0D0p0p
"C" 代表声卡(Card)。每个声卡都有一个唯一的编号,如 "C0"、"C1" 等。
"D" 代表设备(Device)。在每个声卡上,可以有多个不同的设备,每个设备也有一个唯一的编号,如 "D0"、"D1" 等。
"p" 代表播放(Playback)。如果设备用于播放声音,它的标识符会以 "p" 结尾,表示这是一个播放通道。
"c" 代表捕获(Capture)。相应地,如果设备用于录音或捕获声音,它的标识符会以 "c" 结尾,表示这是一个捕获通道。
因此,看到类似 "pcmC0D1p" 的命名时,它指的是声卡 0 上的设备 1,用于播放功能。
系统中的每张声卡都有一个控制设备。
这个设备很特别,因为它并不直接控制任何实际的硬件。它是关于其声卡及与该声卡连接的其他设备信息的聚集点。控制设备保存的主要信息包括与声卡连接的其他设备的类型和数量。
您可能有一个应用程序需要监控音频并发管理事件,并在事件发生时得到通知。
这些事件跟踪活跃的音频流,并让您知道系统上哪些音频类型处于活跃状态。您必须在select()之后调用snd_ctl_read()来从队列中读取事件。
如果它是一个SND_CTL_READ_AUDIOMGMT_STATUS_CHG事件,请使用snd_ctl_ducking_status_read()来获取所有活跃音频子通道的列表以及有关它们的优先级和压缩状态的信息。
已被用户暂停的音频流(例如,snd_pcm_*_pause())被认为是活跃的。
有关如何监控事件并确定系统上活跃音频流的状态的示例,请参阅“audiomgmt_monitor.c示例”附录。
您可以在音频配置文件的[AUDIOMGMT]部分使用audiomgmt_id键来指定您想要监控的输出(音频并发管理上下文或输出)。更多信息请参阅Utilities Reference中的io-audio。
混音器设备
混音器设备负责将声卡上的各种模拟信号组合或混合。
混音器还可能提供一系列控制,用于选择哪些信号被混合以及它们是如何混合在一起的,调整信号的增益或衰减、静音。
PCM设备负责将数字声音序列转换为模拟波形,或将模拟波形转换为数字声音序列。
PCM设备通常成对创建,以播放和捕获的形式,这样在同一卡下的同一设备索引会创建两个条目,且带有方向标识符后缀(“p”代表播放,"c"代表捕获)。每个设备只在一种模式下操作。如果它将数字转换为模拟,则是一个播放通道设备;如果它将模拟转换为数字,则是一个捕获通道设备。
PCM设备的属性包括:
设备支持的数据格式(例如,16位有符号小端格式、32位无符号大端格式等)。有关更多信息,请参见下文的“数据格式”。
设备宣称支持的子通道数是针对最佳情况定义的;在现实世界中,设备可能支持较少的子通道。例如,如果所有客户端都以48 kHz运行,一个设备可能支持32个同时客户端,但如果速率是44.1 kHz,可能仅支持8个客户端。在这种情况下,设备一般会宣称支持32个子通道。
QNX声音架构支持多种数据格式。
数据格 式常量
SND_PCM_SFMT_*
这是数据格式集合中的单一选择。有关支持的格式列表,请参见“音频库”章节中的 snd_pcm_get_format_name()。
SND_PCM_FMT_*
单个变量中的一组(一个或多个)格式。例如,这对于指定设备的格式能力很有用。
通常,SND_PCM_FMT_* 常量用于传达有关原始潜力的信息,而 SND_PCM_SFMT_* 常量用于选择和报告特定配置。
您可以通过调用 snd_pcm_build_linear_format() 来根据其宽度和其他属性构建格式。
您可以使用以下函数来检查格式的特性:
snd_pcm_format_big_endian()
snd_pcm_format_linear()
snd_pcm_format_little_endian()
snd_pcm_format_signed()
snd_pcm_format_unsigned()
24位音频格式
24位音频的数据以3字节或4字节的形式表示。
在大多数情况下,音频文件将24位数据存储为3字节。
因为您的硬件可能需要32位对齐的数据访问,所以通常会将24位数据转换为4字节。32位整数中的24位样本可以具有以下类型之一的对齐方式:
左对齐 — QSA识别并处理32位整数中左对齐的24位值作为32位样本值,没有效率损失。
右对齐 — 如果硬件需要24位样本在32位容器中右对齐,请使用24_4数据格式常量。对于播放,QSA将24位数据上采样为32位进行所有处理,然后在传递给硬件之前将其从32位转换为24_4。同样,对于捕获,QSA可以接受24_4并将其转换为32位进行处理。
PCM设备最简单的形式是一个数据缓冲区,通过数字模拟转换器(DAC)或模拟数字转换器(ADC)逐个样本转换,这取决于数据传输的方向。
在QSA中,这个简单的想法因为PCM子通道在任何给定时刻都处于某种状态的概念而变得更加复杂。这些状态定义如下:
SND_PCM_STATUS_NOTREADY
设备的初始状态。
SND_PCM_STATUS_READY
设备已为其将操作的数据设置了参数。
SND_PCM_STATUS_PREPARED
设备已准备好操作并能够运行。
SND_PCM_STATUS_RUNNING
设备正在运行,向缓冲区传输数据或从缓冲区传输数据。
SND_PCM_STATUS_UNDERRUN
这种状态只发生在播放设备上,当缓冲区没有更多数据可播放时进入此状态。
SND_PCM_STATUS_OVERRUN
这种状态只发生在捕获设备上,当缓冲区没有空间存放数据时进入此状态。
SND_PCM_STATUS_PAUSED
设备已暂停,不再播放音频流。要恢复播放,必须显式调用相应的 snd_pcm_*_resume() 函数。
当用户显式调用 snd_pcm_*_pause() 函数时,会发生这种状态。它也可能因为放置的音频并发管理策略将之前处于 SND_PCM_STATUS_SUSPEND 的子通道移动到 SND_PCM_STATUS_PAUSED 状态。
SND_PCM_STATUS_SUSPENDED
基于系统上配置的当前音频并发管理策略,音频并发管理已暂停音频流的播放。
SND_PCM_STATUS_SUSPENDED 是一个受系统上运行的音频并发管理策略控制的短暂或临时状态。这个短暂状态有两种模式,称为软暂停和硬暂停。有关这些模式及其工作方式的更多信息,请参见本指南中的“理解抢占”部分。
SND_PCM_STATUS_UNSECURE
应用程序标记流为受保护,硬件级别支持安全传输(例如,用于HDMI的HDCP),并且认证丢失。
SND_PCM_STATUS_ERROR
发生硬件错误,流必须再次准备。
SND_PCM_STATUS_CHANGE
流已更改,音频流必须重新配置。
当子通道被置于 SND_PCM_STATUS_CHANGE 状态时,客户端必须重新配置音频流,因为硬件能力已更改。例如,对于HDMI连接,HDMI源(显示器、放大器等)的音频模式可能已从立体声更改为5.1环绕声,因此,您的子通道必须重新配置以启用语音转换插件。
要重新配置音频流,您必须调用 snd_pcm_plugin_params() 或 snd_pcm_channel_params(),然后调用相应的 snd_pcm_plugin_setup() 或 snd_pcm_channel_setup() 函数。如果您想检查有哪些新的硬件功能可用,可以调用 snd_pcm_channel_info(),它直接从硬件获取信息。
重新配置音频流后,您可以调用 snd_pcm_plugin_prepare() 或 snd_pcm_channel_prepare(),以移至 SND_PCM_STATUS_PREPARED 状态,并继续向子通道写入音频数据。
调用 snd_pcm_plugin_params() 或 snd_pcm_channel_params() 函数可能会导致片段大小发生变化。因此,请确保在写入音频数据之前,您在进行 snd_pcm_*_params() 调用后,调用 snd_pcm_*_setup() 和 snd_pcm_*_prepare() 函数。
SND_PCM_STATUS_PREEMPTED
音频被阻塞,因为另一个 libasound 会话已启动播放,音频驱动程序已确定该会话具有更高优先级,因此较低优先级的会话以 SND_PCM_STATUS_PREEMPTED 状态终止。仅当系统上没有足够的资源可用时,才会发生此状态。当客户端接收到此状态时,应放弃播放,并在要生成的声音提高优先级或用户发起重试之前不要尝试恢复。
不要将 SND_PCM_STATUS_PREEMPTED 状态与 SND_PCM_STATUS_SUSPENDED 状态混淆。当子通道因发生音频并发管理而被抢占时,它会转移到 SND_PCM_STATUS_SUSPENDED 状态。
图 1. PCM 设备的一般状态图
在上面的图中,椭圆将Underrun/Overrun、Error和Unsecure状态组合在一起,以表示每个状态都可以过渡到准备好的状态。
状态之间的过渡是执行 API 调用的结果,或在硬件中发生的条件的结果。有关更多详细信息,请参见“播放和捕获音频数据”章节
PCM 软件混音器允许多个应用程序流同时在单个硬件设备上播放,通过混合所有应用程序流的音频样本。当您在音频配置文件中启用 PCM 软件混音器参考流(使用 sw_mixer_max_references)时,它还会创建一个捕获设备,提供混合后的播放音频流作为参考音频流/信号。
对于每个硬件 PCM 播放设备,自动创建一个 PCM 软件混音器实例,即使硬件支持多个硬件子通道。客户端应用程序对硬件设备的请求会自动路由到 PCM 软件混音器。您可以使用 -o disable_sw_mixer 选项禁用 PCM 软件混音器。
当 PCM 软件混音器未被禁用时,即使只有一个流,使用 CPU 的程度也会超过直接使用没有混音器的硬件设备。PCM 软件混音器不使用单独的 PCM 设备。相反,它直接覆盖由 deva-ctrl-* DLL 创建的硬件 PCM 设备。这种覆盖意味着您无法直接访问硬件。
当您启用 PCM 软件混音器媒体参考时,会创建一个新的 PCM 捕获设备,其索引比软件混音器大一。当您从这个设备捕获时,您会得到来自应用程序混音阶段的混合音频流。如果 PCM 软件混音器没有积极混合音频流,您无法从 PCM 软件混音器参考中捕获。
客户端应用程序片段大小
附加到 PCM 软件混音器设备的客户端应用程序可以使用片段大小(以字节为单位),该大小是 PCM 软件混音器底层片段大小的任意倍数。例如,如果 PCM 软件混音器的片段大小为 4 KB,则应用程序的片段可以是 4 KB 的倍数。
您可以使用以下选项之一来设置 PCM 软件混音器片段的大小:
sw_mixer_ms
使用此选项时,io-audio 根据请求的周期和音频控制器配置计算片段大小。您只能在音频配置文件中指定此选项。使用以下格式:
sw_mixer_ms=<每个片段的毫秒数>
<每个片段的毫秒数> 必须是整数。
sw_mixer_samples
使用此选项通过样本而不是毫秒值指定片段大小。使用以下格式:
sw_mixer_samples=<每个片段的样本数>
使用以下公式计算 <每个片段的样本数>:
音频控制器采样率 * 期望时间周期 / 音频控制器的通道数
例如,如果音频控制器的采样率是 48 kHz,时间周期是 16 毫秒,音频控制器的通道数是两个,<每个片段的样本数> 是 768:
48000Hz * 16ms / 1000 = 768
如果您正在使用 PCM 输入分离器,则不能使用 sw_mixer_samples。
暂停软件混音器音频流
当您的子通道通过软件混音器("sw_mixer")并且您暂停音频流(通过调用 snd_pcm_pause())时,snd_pcm_pause() 调用会阻塞,直到软件混音器完成将音量降至零。子通道只有在音量降至零后才过渡到 PAUSED 状态。如果您不使用软件混音器,则不会发生减音。
使用预测限制器避免失真
PCM 软件混音器操作 16 或 32 位 PCM 数据。在混合多个音频流时,累积的音频数据可能会溢出,并且可能需要将其夹持到 16 或 32 位值的最小/最大值。这种夹持会导致失真,信号溢出到越界区域的程度越高,失真就越明显。随着同时混合的音频流数量的增加,溢出的程度和频率也会增加。
为了避免失真,您可以在累积的混音器输出上启用预测限制器(sw_mixer_limiter),它使用一毫秒的延迟来提前观察输出音频信号的即将到来的振幅。使用该信息,它计算出一个衰减值,将信号降低到 PCM 限制以下。如果输出信号低于限制,则逐渐将衰减减少到零。这提供了比直接夹持更平滑的信号响应,并允许同时混合许多音频流而不会产生任何可察觉的听觉失真。
在目标系统上播放多个音频流并且音频流使用完整的 16 或 32 位 PCM 范围时,建议使用限制器。如果通常只播放一个音频流,或者被混合的音频流振幅较低,则不需要限制器。需要注意的是,如果启用限制器,则播放输出会延迟一毫秒。有关更多信息,请参阅 sw_mixer_limiter 配置选项。
PCM输入分离器是一种虚拟的、仅用于捕获的设备,它直接覆盖在PCM捕获设备上,使得原本只支持单个子通道的硬件可以支持多个子通道。PCM输入分离器最多可以同时支持10个附加的子通道。
这个分离器允许多个进程和线程同时从同一硬件设备捕获音频。例如,你可以使用不同的进程同时进行语音识别和录音。PCM输入分离器可以通过音频配置文件中的input_splitter_enable键来启用。默认情况下,PCM输入分离器是禁用的。
PCM输入分离器和PCM软件混音器必须在相同的数据片段大小上运行,这可以通过sw_mixer_ms选项来设置。由于你不能使用样本值来指定PCM输入分离器使用的片段大小,因此在使用输入分离器时,你不能使用样本(sw_mixer_samples选项)来设置PCM软件混音器的片段大小。
关于使用输入分离器的更多信息,可以在QNX Neutrino Utilities Reference指南的“io-audio”部分的“音频配置文件”章节中找到input_splitter_enable键的描述。
[X1]音频鸭音(Audio Ducking)是一种音频处理特性,用于在一个音频流(如语音或警报)出现时自动减小其他音频流(如背景音乐或媒体播放)的音量。这种特性在多种音频和多媒体应用中很常见,尤其是在需要突出特定音频信号时。
例如,在汽车系统中,如果驾驶员接听电话或导航系统发出指示,音频鸭音功能可以自动降低车载娱乐系统的音量,以便驾驶员可以清晰地听到电话或导航指令。通话或导航指令结束后,背景音乐或媒体的音量会自动恢复正常水平。
在QSA(QNX Sound Architecture)和相关的音频管理系统中,音频鸭音功能可以精确控制不同音频流之间的交互,确保重要信号(如安全警告或语音通信)优先,同时提供良好的用户体验。