ALSA的脉冲仿真。
该程序提供了脉冲API的替代部分实现。它由一个加载程序脚本和许多具有与原始pulseaudio相同名称的共享库组成,因此应用程序可以动态加载它们并认为它们正在与Pulseaudio交谈。在内部,没有使用单独的声音混合守护程序。取而代之的是,Apulse依靠ALSA的dmix , dsnoop和plug插件来处理多个声源,并同时捕获流程。 dmix插件Muxes多个播放流; dsnoop插件允许多个应用程序从单个麦克风捕获; plug插件可以在各种样本格式,样本率和频道编号之间透明地转换音频。十多年来,ALSA随附这些插件,默认情况下配置了这些插件。
apulse并非被设计为脉搏的倒数替换。这是毫无意义的,因为这将仅仅是对原始pulseaudio的重新实现,具有相同的客户端架构,这是完整功能集所需的。相反,仅实施对特定应用程序至关重要的API部分。这就是为什么有一个名为apulse的加载程序脚本的原因。它更新LD_LIBRARY_PATH环境变量的值也将其指向到安装Apulse库的目录,使其可用于应用程序。
名称来自Alsa和Pulseaudio的名称。由于aoss是OSS程序和ALSA之间的兼容层,因此apulse被设计为Pulseaudio应用程序和ALSA之间的兼容层。
您需要安装ALSA库和GLIB。在基于Debian的发行版中,它们位于libasound2-dev和libglib2.0-dev中。
要构建和安装,请在源目录中运行:
$ mkdir build && cd build
$ cmake -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Release ..
$ make
# make install
这将创建名称build目录,并在此处构建。如上所示,只需运行以root make install即可安装。但是您将无法卸载安装的文件。这就是为什么建议将文件包装到软件包中的原因。使用checkinstall或其他替代方案。
如果您想要64位机器上的32位二进制文件(例如,对于Skype),请使用:
$ mkdir build && cd build
$ CFLAGS=-m32 cmake -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Release ..
$ make
# make install
最近的GLIB版本使用i386和amd64的不同.pc文件。要帮助pkg-config查找32位版本,请使用PKG_CONFIG_PATH变量。因此,在Debian上,这将是:
$ PKG_CONFIG_PATH=/usr/lib/i386-linux-gnu/pkgconfig CFLAGS=-m32 cmake -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Release ..
有一种方法可以通过APULSEPATH Cmake变量进行配置安装APULSE库。例如,如果要将库安装到默认路径/usr/lib中,请使用
cmake -DAPULSEPATH=/usr/lib -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Release ..
如果将库安装到常规库路径上,则不需要通过apulse包装器运行应用程序。
$ apulse <program-name> [program-parameters]
环境变量APULSE_CAPTURE_DEVICE和APULSE_PLAYBACK_DEVICE可用于配置捕获和播放设备。尝试hw:0,0 , plughw:0,0等。有关设备名称的完整列表,请参阅《 ALSA用户指南》。
默认情况下, apulse的库被安装到一个单独的目录中,以便将其隐藏在所有应用程序中。
支持Pulseaudio和ALSA的野外大多数应用程序,尝试自动使用哪种声音系统。首先,应用程序尝试从脉冲开始。如果没有脉冲守护程序正在运行或可以启动,则原始客户库会尽早失败。然后他们切换到ALSA。一开始就做出一次决定。它可以与Pulseaudio一起使用,但不适用于apulse 。后者没有守护程序,它很高兴地说一切都很好,并且能够播放音频。然后,应用程序试图调用更多功能,并最终触摸未完成的零件,通常会发生崩溃。因此,只有在通过apulse包装器脚本调用程序时,库是隐藏的,并且才能看到。
可以将Apulse库安装到/usr/lib 。不需要包装器脚本,但是尽管可以使用ALSA,但所有应用程序都将尝试使用pulseaudio api。
Elf可执行格式的RPATH属性,用于指定搜索动态库的路径。就像ld_library_path变量一样,但可以执行。由于apulse Launcher脚本所做的所有功能都是在启动应用程序之前设置LD_Library_Path值,因此可以烘烤路径以将apulse库置于目标可执行文件中。因此,像往常一样启动它,而无需辅助脚本。
例如,对于Firefox,它将是:
# patchelf --set-rpath /usr/lib/apulse /usr/lib/firefox/libxul.so
由于某种原因,如果设置了/usr/lib/firefox/firefox本身,则无效,因此需要一些实验才能使其正常工作。
未实施大部分脉冲API。有些功能无能为力并返回一些仲裁值。通常,如果应用程序试图调用未实施的东西,则在试图放置无效指针时会崩溃。默认情况下,跟踪级别设置为0 ,这意味着没有向标准输出打印任何消息。可以将该值增加到1 ,该值显示未完成的函数调用或2显示所有功能调用。
要更改级别,请在调用cmake时WITH_TRACE参数一起使用。类似cmake -DWITH_TRACE=1 ..
用跟踪级别1构建APULSE不会解决问题,但至少将有助于确定是否没有实现功能引起崩溃。
Apulse充当通用的ALSA客户端。它试图打开音频设备,有时会失败。 Apulse既不进行音频混合也不进行重新采样。取而代之的是,它依赖plug , dmix和dsnoop ALSA插件,这些插件默认情况下通常启用。这些插件处理多个音频源,进行重新采样和透明混合。多年来,ALSA随附了这些插件。音频只是在没有配置任何内容的情况下工作。但是并非每个人都使用默认设置。
在自定义配置上,Apulse可能无法输出和/或捕获音频。根本没有声音,或者只是一次播放一次音频流。还可能无法处理多个捕获流的硬件混合器的适配器(能够播放多个流)。根据硬件,您可能仍然需要dmix或dsnoop插件。或两者兼而有之。
换句话说,要使Apulse工作,您的设置应该能够同时播放和捕获多个流。
如果其他应用程序的输出听起来不错,那么您可能会使用限制本身的应用程序。
例如,Firefox现在有一个沙盒,可以阻止文件访问。它具有预定的允许路径列表,但默认情况下不包含ALSA设备。幸运的是,可以手动添加这些路径。将“/dev/snd/”添加到“ security.sandbox.content.write_path_whitelist”参数in about:config 。请注意,需要“/dev/snd/”中的拖延斜线。
Firefox 58(夜间)将其沙箱拧紧了一点。现在,也禁止使用ioctl()调用,但ALSA库使用。这会导致沙箱违规,随后的过程终止。可以通过设置参数security.sandbox.content.syscall_whitelist in about:config添加异常。该字段接受逗号分开的系统呼叫号码列表。将16添加为X86-64,为X86或ARM的54 。
Firefox 60将其内容沙箱更加详尽,但同时将音频访问从内容过程移至主过程。从Firefox 60开始,不需要更改沙盒设置。
源代码根据MIT许可证的条款分发。请参阅许可证。
/3rdparty/pulseaudio-headers包含Pulseaudio项目的一部分,并根据LGPLV2.1+项分布。有关详细信息,请参见文件的内容。