自学内容网 自学内容网

pulseaudio概述

PulseAudio 是一个针对 POSIX 操作系统的音频服务器系统,是音频应用程序的代理。它是所有相关现代 Linux 发行版的核心组成部分,并被多个厂商用于各种移动设备中。在音频数据从应用程序传输到硬件的过程中,PulseAudio 可以执行高级操作,例如将音频传输到另一台机器、更改采样格式或声道数量,以及将多个声音混合到一个输入/输出流中,这些都可以通过 PulseAudio 轻松实现,pulseaudio运行于音频驱动之上。

sink / source / sink-input / source-output

sink和source顾名思义,sink表示音频流的目的,即播放的输入,source为录音的源头,即录音的输入,分别如图1所示。播放的过程就是创建一个sink-input,把它连接到对应的sink上;录音的过程就是创建一个source-output,把它写到对应的source上。

图1

sink/source指的是设备,sink-input/source-output指的是流。如sink指的是播放设备,source指的是输入设备,sink-input连接到sink设备上,source-output连接到source设备上。

如下在bash中执行pact list sinks,可以看到有两个sinks设备,一个状态suspend,一个是running。

再执行pactl list sink-inputs,可以看到sink-inputs连接的是Sink #1。

同理也可以用pactl list sources和pactl list source-outputs查看source设备和对应流的情况,如果source-output和sink-input的参数和source/sink的参数不一致,例如采样率不一致,source-output/sink-input会转换为source-output/sink-input的参数。pulseaudio会自动为每一个播放流创建一个sink-input,也会为每个录制流创建一个source-output。

modules

PulseAudio启动时会加载各种modules,daemon与modules相互配合一起成为声音系统作为底层设备的封装为上层提供服务。modules实际上是一些动态链接库,在"/usr/lib/pulse-***/modules"目录下。pulseaudio的具体操作(不管是通过命令还是API)都是基于modules,modules是pulseaudio提供基本功能的基石。

Backend

backend指pulseaudio的之下的audio driver,一般pulseaudio的backend都是alsa,所以这里以alsa backend为例。pulseaudio中与alsa相关的module为module-udev-detect,module-alsa-{card,source,sink}。PulseAudio后端使用alsa,则PulseAudio会自动创建PulseAudio cards,devices,sinks,sources。PulseAudio cards/devices和alsa cards/devices相关联。PulseAudio的sources和sinks和PulseAudio的device相关联,如何创建我们后面会详细说明。

pulseaudio的组件框图

pulseaudio的组件框图如图2,默认后端用的是alsa。libpulse-simple,libpulse,libpulse-common是给client或者server提供的library(如libpulse-simple,libpulse,libpulsecommon等)。而这些库又依赖于pulseaudio的相关组件。

client可以理解为app,我们写代码都是在client侧,server是pulseaudio内部的机制。client和server类似于rpc通信机制,

server可以是本地的,也可以是远端的,如图2中有1个local server和2个remote server。

图2

API

这里的API指C API [1],API中实现了libpulse,libpluse-simple library的interface,API中的所有接口都是异步调用的,采用event loop和callback的方式,API的使用的流程如图3所示。

图3

  • Create Main Loop

创建Main Loop实例,Main Loop在非主线程中运行,处理和server通信的所有消息,可以在MainLoop中注册回调函数或者采用周期轮询的处理方式。

  • Create Context

创建上下文,上下文指和server连接的上下文,可以设置回调函数,当上下文状态发生改变时触发回调函数。

  • Create Streams

创建流,包括播放流和录音流,设置回调函数,在流的状态或者有IO事件时触发。

  • Sample Cache Operations

Sample Cache是在内存中存储,短期命名的样本批次的空间,这些样本可以一次性上传到服务器,然后多次播放。它通常用于事件声音。

  • Introspection Operations

每个服务器端对象都有一个属性列表,应用程序和模块可以获取和设置这些属性。Server可以调用相应的API查询和修改这些属性。

  • Subscribe Event

Client可以收到两类来自Server的事件:

    • subscription events

subscsription event 提供了通过API订阅服务器端对象触发的事件的方法。每个事件都有一个整型类型和任意的payload。

    • stream events

stream event是在确认流状态发生变化或要求客户端执行某些操作(例如暂停流)时生成的。此类事件有一个文本名称和任意的二进制负载。

Card和Device

Card和Device的框图如图4所示,card对应一个物理的声卡或者一个虚拟声卡;card profile为系统所有声卡的配置,定义了声卡的后端(如alsa)以及可用的device等。

一个card可以对应多个device,device一般和流关联,一个source/sink流关联一个device设备。在device下还有sub device,sub devices共享device的流,sub devices一般用于混音。

图4

隧道

隧道即stream的通道,它涉及module有module-tunnel-{source,sink}和module-tunnel-{source,sink}-new。隧道的数据流如图5所示,每个playback/record stream包括两个pulseaudio server,一个server与应用程序(client)相连,一个server与device相邻,两个server通信通过native协议。

图5

配置文件

读取配置文件的顺序是:先查看 ~/.config/pulse;如果没有,在查看 /etc/pulse

daemon.conf

这个文件定义了Server相关的静态配置,包括但不限于:默认采样率,重采样的方法,实时调度策略等。一旦Server开始运行,这些配置就无法改变,除非重启PulseAdudio daemon。

default.pa

这个文件在 daemon.conf 之后被解析,用于在启动时对module做配置。这些配置可以在运行时通过 pactl 或者 pacmd 进行修改( pactlpacmd 的子集),也有部分可以被client的配置所覆盖。

client.conf

这个文件在PulseAudio client library启动的时候被解析,用于控制Client端的一些配置,包括但不限于:default sink, default source等。注意,Client端的一些配置( client.conf )会覆盖Server端的配置( default.pa ),例如:default sink/source。

参考

https://gavv.net/articles/pulseaudio-under-the-hood/ [1]


原文地址:https://blog.csdn.net/yixinuestc/article/details/142990007

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!