openKylin论坛

 找回密码

【小白课程】openKylin系统音频大体框架介绍 [复制链接]

在桌面操作系统中,音频是至关重要的一环,音频的稳定支持直接决定了用户的听感以及使用体验,今天我们就给大家介绍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



楼主
发表于 2022-12-29 09:54:47
回复

使用道具 举报

【小白课程】openKylin系统音频大体框架介绍 [复制链接]

本帖最后由 okylin 于 2022-12-31 03:21 编辑

很不错的小白课程。

openKylin系统默认似乎还安装了pipewire,例如pipewire-pulse。可否简单的介绍一下pipewire与pulseaudio的关系,并将pipewire也加入到上面的图示里面呢?
沙发
发表于 2022-12-31 03:13:54
回复

使用道具 举报

【小白课程】openKylin系统音频大体框架介绍 [复制链接]

okylin 发表于 2022-12-31 03:13
很不错的小白课程。

openKylin系统默认似乎还安装了pipewire,例如pipewire-pulse。可否简单的介绍一下p ...

谢谢支持,该需求已经反馈给研发人员,很快就会收到回复奥~
地板
 楼主| 发表于 2023-1-3 11:26:31
回复

使用道具 举报

【小白课程】openKylin系统音频大体框架介绍 [复制链接]

爱吃西红柿 发表于 2023-1-3 11:26
谢谢支持,该需求已经反馈给研发人员,很快就会收到回复奥~

不知关于pipewire-pulse和pipewire是否有技术人员可以沟通?我使用openkylin系统发现耳机和设备自身麦克在播放和录音方面存在问题,一时不好解决
5#
发表于 2023-6-27 11:23:07
回复

使用道具 举报

openKylin

GMT+8, 2024-4-20 21:14 , Processed in 0.037943 second(s), 19 queries , Gzip On.

Copyright ©2022 openKylin. All Rights Reserved .

ICP No. 15002470-12 Tianjin

快速回复 返回顶部 返回列表