在桌面操作系统中,音频是至关重要的一环,音频的稳定支持直接决定了用户的听感以及使用体验,今天我们就给大家介绍openKylin桌面操作系统背后关于音频的那些故事。

先看一张框架图,这张图大致介绍了openKylin操作系统音频的框架组成,层次从下往上依次递增:

01框架各层次关系

在UKUI桌面环境中,声音(ukui-media)主要用来控制系统的输入输出音量。ukui-media使用pulseaudio-lib 和 alsa-lib库来获取一系列的输入输出设备,以及控制相应输入输出设备的音量。

openKylin系统使用pulseaudio声音服务器来作为操作系统和alsa的通信媒介,pulseaudio声音服务器介于应用程序和声卡驱动之间。当不同的应用调用声音服务器的API来播放声音时,它们把音频数据送到服务器, 服务器将一个以上的播放请求混音后,再发送给底层的声卡驱动(ALSA或OSS)。由ALSA或OSS来驱动声卡播放混音后的数据。

02各层次详细介绍

1、ukui-media

ukui-media的界面如下图所示,其可以对系统声音进行图形化控制。

声音托盘中会显示可用的输出设备,点开“声音设置”字样,我们会进入更全面的声音设置界面。

其功能有:

1、可以选择可用的输入输出设备

2、改变可用的输入输出设备音量

3、输出设备声道平衡功能

4、输入设备降噪功能

5、设置对应系统功能的提示音音效

关于以上功能的实现,其中的底层逻辑就涉及到接下来要讲的 pulseaudio 层。

2、PulseAudio层

ukui-media 的实现,其主要是调用了 pulseaudio-lib 库。PulseAudio是一个声音服务器,也是一个后台进程,其从一个或多个音源(进程或输入设备)接受声音输入,然后重定向到一个或多个槽(声卡,网络音频支持,或其他进程)。

其主要功能有:

1、可对每一个应用程序进行音量控制

2、可扩展的插件与支持可装载模块架构

3、兼容性许多流行的音频应用程序

4、支持多重音源和多重输出

5、低延时操作和支持延迟测量

6、一个对处理器资源效率零拷贝内存架构

7、能够发现本地网络上使用PulseAudio的其他计算机并通过其扬声器直接播放声音

8、能够改变一个应用程序的声音输出设备,就算这个应用程序在播放声音(程序不需要支持这特性,而事实上,程序甚至没有意识到改变)

9、带有脚本功能的命令行界面

10、一个功能完善且带有命令行重新配置功能的守护进程

11、内置采样转换和重采样功能

12、能够合并多块声卡成一个声卡

13、能够同步播放多个音频流

14、动态检测蓝牙音频设备

15、使全系统均衡的能力

在前文有提到,pulseaudio声音服务器介于应用程序和声卡驱动之间,意思是pulseaudio并不是最底层的实现,他是在调用alsa-lib的基础上添加了更丰富的功能,但是其底层实现还是离不开 alsa-lib。

3、ALSA层

从前文可知,真正驱动底层硬件的是ALSA,ALSA是目前Linux主流的音频体系架构,全称(Advanced Linux Sound Architecture, 高级linux音频架构)。如果说PulseAudio是用户级的混音器(mixer),它直接管理你的声卡,那么ALSA就是内核级混音器。在运行时,PulseAudio使用ALSA提供的驱动,管理各种混合、设备、网络音频支持等涉及音频的服务。

说到ALSA,我们就不得不先提到OSS(Open Sound System),这是unix平台上一个统一的音频接口。此前,每个Unix厂商都会提供一个自己专有的API,用来处理音频。这就意味着为一种Unix平台编写的音频处理应用程序,在移植到另外一种Unix平台上时,必须要重写。

不仅如此,在一种平台上具备的功能,可能在另外一个平台上无法实现。但是,OSS出现以后情况就大不一样了,只要音频处理应用程序按照OSS的API来编写,那么在移植到另外一个平台时,只需要重新编译即可。因此,OSS提供了源代码级的可移植性。

ALSA可以看成是OSS的继任者,但是ALSA却没有完全摆脱OSS的影子,ALSA的兼容层是包含OSS的,ALSA支持旧版本的OSS API 接口,能为大多数的OSS应用程序提供兼容,ALSA也因为其透明性、高效性、灵活性,以及了兼容性,使之成为了Linux音频系统的标准,也成为了几乎其他所有的音频架构和硬件通信的桥梁。

03框架实现方案

结合以上,openKylin桌面系统关于声音的框架方案就清晰了:

  • 用户层,使用ukui-media给用户提供方便的可视化图形控制界面
  • 功能层:使用pulseaudio来实现丰富的功能
  • 驱动层:调用alsa-lib 来高效实现底层驱动

如下图所示:

举个例子,针对于一个完整的调节音量过程大致是这样,用户使用面板上的音量调节工具调节音量时,实际上调节的是个虚拟设备,用户调节PulseAudio的虚拟设备,PulseAudio调节ALSA,ALSA调节完底层硬件后,反馈给PulseAudio,PulseAudio再反馈给虚拟设备,按原路返回。大致流程如下图所示:

04具体功能实现举例

1、可用端口搜寻

可用端口的实现,首先需要将所有声卡中能进行输出的端口列出来,然后对所有的端口进行识别判断其可用性。实现可用端口的好处:能够将声卡中识别到所有的可用端口都显示出来,有的声卡有多个可用的输出端口,只是在不同的profile中,这样用户能更简洁到看到声卡支持的输入输出设备,如下图所示:

2、默认输入输出设备逻辑

每当系统的输入输出端口改变时,则有可能会更改默认的输入/输出设备,如右图所示设置默认的输出设备如下图所示:

因此,我们设置了一个不同设备的优先级,即如果有多个可选择设备存在的情况,我们会优先选择优先级高的设备作为默认设备,大致实现流程如下:

今天的讲解到这就结束啦~通过前面的讲解,大致介绍了openKylin系统关于声音这一部分的主要框架逻辑,其使用了ukui-media给用户提供了图形化界面,结合pulseaudio对于各功能的实现,附加上alsa对底层硬件的高效率处理,其体验效果能使音频完美呈现且稳定运行,后期我们也会进一步完善其功能,欢迎感兴趣的小伙伴来与我们进行更深入的探讨~

openKylin(开放麒麟)社区旨在以“共创”为核心,在开源、自愿、平等、协作的基础上,通过开源、开放的方式与企业构建合作伙伴生态体系,共同打造桌面操作系统顶级社区,推动Linux开源技术及其软硬件生态繁荣发展。

社区首批理事成员单位包括麒麟软件、普华基础软件、中科方德、麒麟信安、凝思软件、一铭软件、中兴新支点、元心科技、中国电科32所、技德系统、北京麟卓、先进操作系统创新中心等13家产业同仁和行业机构。

来源:封昭祥

审核:openKylin

Logo

领路信创诚邀您共建高质量内容社区,投稿申请~

更多推荐