[转]Linux上的音频驱动及wineASIO与foobar2000

Posted by Tee on March 18,2020

题=Linux上的音频驱动及wineASIO与foobar2000

Linux上的音频驱动还很混乱,说实话,Linux根本不适合做专业的音频软件,想在Linux上听歌看视频都很不方便,除非只使用一些简单的功能。
Linux上的音频驱动有oss,alsa,pulse audio,jack1,jack2,oss是较老的音频驱动了已经不怎么使用了,alsa是目前直接与底层设备交流的,pulse audio是基于alsa的主流音频服务,基本上所有Linux发行版都使用pulse audio作为音频服务,系统的所有声音都经由它送到alsa再驱动设备,pulse audio提供了alsa访问,使用alsa音频的软件不直接访问alsa驱动而是访问pulse audio(软件并不知道其访问的是alsa还是pa),jack是Linux上专业音频解决方案,分为jack1和jack2,前者是由c写成,后者是c++重新写就,jack具有低延迟的特点,而pa延迟较高,虽然alsa也是低延迟的。

                  oss   +--pulseaudio---apps
devices<          |
                 alsa--+--jack---pulseaudio
                         \    /
                        apps


C"linux音频驱动图解"(这里没有对齐显示)

一、pulseaudio的调教
使用pavucontrol调整pa音频音量。安装:sudo apt install pavucontrol

使用pulseeffects控制pa音效,包括均衡器。安装:
sudo proxychains add-apt-repository ppa:mikhailnov/pulseeffects
sudo proxychains apt install pulseeffects
注意,pulseeffects的黑名单设置可能不会生效。不建议使用音效调节。

pasystray,pa音频控制托盘。安装:sudo apt install pasystray

这些软件使用起来很简单,就不多做介绍了。

二、jack驱动的安装和使用
Linux制作音乐见:https://www.zhihu.com/question/30437234
哆啦咪的博客:https://lado.me
安装jack2,如下:
sudo apt install jackd2
图形端可以使用Qjackctl和Cadence,推荐使用功能更强大的Cadence,安装如下:
访问:https://kx.studio/Repositories,下载kxstudio-repos.deb并安装。执行:
sudo proxychains apt-get update
sudo proxychains apt-get install cadence

我们要配置jack服务,并启用它。
ALSA Audio使用ALSA->Jack(Plugin)或者ALSA->PulseAudio->Jack(Plugin),这里更推荐使用后者以和系统本身搭配,这是指定alsa音频如何与jack连接。
在Linux上,不能同时使用pa和jack连接alsa驱动,因为两者是独占alsa驱动的。

先配置一下jack服务,启动服务后是不能更改配置的,更改配置后需要重新启动jack服务。
只关心Driver页面的设置:
    第一栏ALSA,用来设定alsa设备,Device/Interface指定使用的硬件设备(包括输入输出设备)。
    Input Device用来设定音频输入设备,如麦克风。
    Output Device用来设定音频输出设备,如耳机。
    Input Channels和Output Channels使用默认值即可。
    Peroids/Buffer使用默认值即可,越大延迟越高。
    Buffer Size也使用默认值,越大延迟越高。
    Sample Rate根据声卡选用,越大延迟越高,建议选用声卡支持的最大值。
    其他栏不知如何使用。
注:需要安装以下(到这一步默认已经安装了):sudo apt-get install pulseaudio-module-jack libasound2-plugins
把用户名添加到audio用户组:sudo usermod -aG audio <user>
勾选Auto-start JACK or LADISH at login,点击Start启动jack服务。

相关文档详见:https://kx.studio/Documentation
Start 如果没有运行则开启JACK服务。这是启动JACK的推荐方法。
Stop 停止JACK服务。 应该保存音频工作后停止JACK服务。
Force restart 应该在Start失败后使用。这可能会丢掉最后配置的JACK设置。
Configure 打开JACK的设置窗口
Switch Master 告诉JACK服务应用JACK的设置窗口的任何改变。

cadence的小工具:
Catia A2J连线工具
Claudia LADISH图形用户界面,管理Session
Meter In/Out 查看输入/输出的声道音量
等工具。

三、wineASIO的安装配置及foobar2000使用wineASIO
这一步可以直接使用apt安装最新的wineasio了,执行:sudo proxychains apt install wineasio

不过还是推荐编译安装wineasio,如下:
教程:https://lado.me/2017/04/27/compile-wineasio/

先是编译环境配置,需要安装wine的开发环境,结合你安装的wine版本来。
sudo proxychains apt install wine-stable-dev
再安装jack2的开发环境:sudo apt install libjack-jackd2-dev

下载WineASIO:https://sourceforge.net/projects/wineasio/
下载ASIOSDK:http://www.steinberg.net/sdk_downloads/asiosdk2.3.zip
由于缺少一个头文件,所以还需下载:https://raw.githubusercontent.com/wine-mirror/wine/master/include/wine/unicode.h

解压下载的wineasio,解压asiosdk文件。
把解压的asiosdk里的common文件夹的asio.h文件复制到wineasio根目录。
把下载的unicode.h复制到wine的包含目录。如:sudo cp unicode.h /opt/wine-stable/include/wine
修改wineasio文件夹里的prepare_64bit_asio文件 第一行改成:#!/bin/bash
修改Makefile64文件 PREFIX 那一行修改成wine-stable的路径(/opt/wine-stable)
PREFIX                = /opt/wine-stable
注:以上修改根据安装的wine情况来。最好修改CEXTRA以去掉"-g"参数,使用O3或O2优化。

开始编译WineASIO,执行:
./prepare_64bit_asio
make clean
make -f Makefile64
复制wineasio.dll.so,执行:
sudo cp wineasio.dll.so /opt/wine-stable/lib64/wine
注册wineasio到Wine容器:
    如果是32位的Wine系统目录
    regsvr32 wineasio.dll
    如果是64位的Wine系统目录
    wine64 regsvr32 wineaiso.dll
    如果使用的Wine系统目录不是默认目录,需要添加路径,如
    env WINEPREFIX=~/wineprefix regsvr32 wineasio.dll

可以使用REAPER进行测试,下载win64版的便携安装,详见:https://wiki.linuxaudio.org/wiki/wineasio_and_reaper

安装好了wineasio,就可以在wine里面使用ASIO直通JACK了,这是在wine里面得到最好音质的方法。可以在cadence里面设置wineASIO,在foobar2000里面使用需要代理ASIO,设置如下:
下载:https://sourceforge.net/projects/sacddecoder/
解压ASIOProxyInstall-0.9.4.zip,并双击安装到wine容器。
这样,在foobar2000里面检测不到的wineASIO可以在ASIOProxy里面被发现,配置foo_dsd_asio,以使用wineASIO,在输出设备里面选用ASIO:foo_dsd_asio即可。

这样,配置的foobar2000只能播放一种采样率的音频,所以在DSP管理器里面加入Resampler(SRC),设置Target sample为JACK服务设定的采样率,设置Mode为Best Sinc Interpolator,这样就可以放心听音乐了。
注:Resampler(SRC)是foobar2000的一个重采样插件foo_dsp_src_resampler,还可以使用其他重采样插件。使用ASIO听音乐时声音会很大,可以用alsamixer调节音量,在终端运行alsamixer,选择设备到合适的调节音量。可以发现,不进行音量调节的话,声音会很大,所以其实所有设备都应该进行音量调节,除非播放端有合适的硬件调节音量。


附:
ALSA到JACK的桥接设置:
在Ubuntu上,ALSA是默认被桥接到pulseaudio上的,无论在~/.asoundrc如何设置,都不会改变。这是因为文件/usr/share/alsa/alsa.conf.d/pulse.conf:
@hooks [
    {
        func pulse_load_if_running
        files [
            "/usr/share/alsa/pulse-alsa.conf"
        ]
        errors false
    }
]

它指定了唯一的pulse-alsa桥,只要pulseaudio在运行,这个桥就会生效。所以要让~/.asoundrc生效,需要先终止pulseaudio,但是这并不是一个好方法。

下面给出一个更好的方案:
注:cadence给出的pulse-alsa桥的~/.asoundrc配置在Ubuntu上是不能连通的,所以删除/usr/share/alsa/alsa.conf.d文件夹的方法会使pulse-alsa桥无法搭建。另外,firefox使用pulseaudio也使用ALSA音频,由于我开始误以为firefox只使用ALSA音频,所以一直在寻找关闭pulseaudio自带的alsa桥。
修改/usr/share/alsa/alsa.conf.d/pulse.conf的后缀:sudo mv /usr/share/alsa/alsa.conf.d/pulse.conf /usr/share/alsa/alsa.conf.d/pulse.conf.bak
然后,创建alsa2pa文件,用以设置pulse-alsa桥。如下:
文件:/usr/bin/alsa2pa
#! /bin/sh
cat /usr/share/alsa/alsa.conf.d/pulse.conf.bak > ~/.asoundrc

然后,赋予文件可执行权限:sudo chmod +x /usr/bin/alsa2pa
这样,如果要设置alsa的默认设备是pulse-alsa桥,就在终端执行:alsa2pa
这样就可以使用alsa-jack桥,或者使用alsa-loop-jack连接:(这里我试图开机自启snd-aloop模块没有成功)
终端执行sudo modprobe snd-aloop,然后在cadence中选用ALSA->Loop->JACK作为ALSA Audio的设置。

注:wine推荐使用ALSA驱动,终端执行regedit,然后修改注册表:
    找到HKEY_CURRENT_USER->Software->Wine->Drivers,添加Audio项,值为alsa保存并退出。也可以使用winetricks修改该设置。

为了更加方便,推荐设置ALSA Audio为ALSA->JACK(Plugin),这样的坏处是jack服务无法知道使用ALSA音频的软件是否中途暂停了播放,所以会一直保持连接直到该软件退出为止。与jack有关的音频连接可以在Catia里看到。

与jack有关的Linux音频驱动图解:


图=C"~/Linux音频驱动图解.png"
————————————————
版权声明:本文为CSDN博主「qq_25675517」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_25675517/article/details/104944467


本作品采用知识共享署名 4.0 国际许可协议进行许可。