然后,我们创建一个脚本,命名为 nxesd,并且给它加上可执行属性。这样,nxclient 在调用 nxesd 的时候,调用到的就是我们编写的脚本了,脚本内容如下:
#!/bin/sh
# Replace "padsp" below to your actual OSS wrapper
exec padsp /usr/NX/bin/nxesd.bin "$@"
记得将其中的 padsp 替换为你真实的 OSS wrapper 程序,并将 /usr/NX/ 替换为你真实的 NX 安装路径。
4.2 服务端
NX 在服务端会虚拟出一个 ESD 服务器来,因此,我们需要将所有支持 ESD 的程序设置为通过 ESD 来发声。
KDE 系统设置里的“多媒体”中能够直接识别出“Esound (ESD)”,直接将该选项提到设备列表的最前方即可。
GNOME 默认就是支持 ESD 的,无须进行特别配置。但 GNOME 下还有很多程序是通过 GStreamer 来发声的,因此我们需要对 GStreamer 作一些配置。运行 gstreamer-properties,在“音频”的“Default Output”下拉框中选择:“ESD - Enlightenment 声音守护程序”即可。至于“Default Input”,随便选一个就行,譬如“静音”,不会有人想用远程的服务器来录音的。
配置了 KDE 和 GNOME 的声音环境之后,绝大部分程序应该就可以正常发声了。还有一个最棘手的,就是网页里的 Flash。虽然我们不会在服务器上看网络视频,但能听到网络聊天程序通过 Flash 发出的提示音也是很重要的事情。Flash 发声是通过 alsa 接口进行的,并且无法配置成别的接口。因此,为了让 Flash 能发声,我们必须在远程包装一个 alsa。
ESD 是无法被直接包装成 alsa 的,但我们可以先把 ESD 包装成 PulseAudio,然后再把 PulseAudio 包装成 alsa,这样 Flash 就能正常播放了。
首先,我们将 ESD 包装成 PulseAudio,要做到这点,我们需要启动一个 PulseAudio 服务器,使用 ESD 作为 PulseAudio 服务器的输出接口。由于 NX 模拟的 ESD 每次启动监听的端口都不一样,因此我们需要通过一个脚本来创建 PulseAudio 的配置文件,以便 PulseAudio 能找到正确的 ESD 端口来进行输出:
#!/usr/bin/env bash
# Set up the pulseaudio remote sound
cat > ~/.pulse/default.pa <<EOF
#!/usr/bin/pulseaudio -nF
load-module module-esound-sink sink_name=esdoutput server=$ESPEAKER rate=44100
set-default-sink esdoutput
load-module module-esound-protocol-unix
load-module module-native-protocol-unix
load-module module-stream-restore
load-module module-rescue-streams
.nofail
load-module module-x11-publish
EOF
pulseaudio -k
pulseaudio -nF ~/.pulse/default.pa &
将这段脚本设置为每次登录系统的时候自动运行,这段脚本会从环境变量中获得正确的 ESD 端口,创建相应的 PulseAudio 配置文件,杀死之前启动的 PulseAudio 服务器并启动新的服务器。运行了这段脚本之后,我们就获得了一个能够将声音成功重定向到 ESD 上的 PulseAudio 服务器。
接下来,我们配置 alsa 让它能将声音输出到 PulseAudio 上来。在用户主目录下创建 alsa 的配置文件 ~/.asoundrc,内容如下:
pcm.pulse {
type pulse
}
ctl.pulse {
type pulse
}
pcm.!default {
type pulse
}
ctl.!default {
type pulse
}
至此,我们成功模拟出来了一个 alsa 声音系统,可以将所有来自 alsa 的声音重定向给 PulseAudio,然后 PulseAudio 把声音发到虚拟 ESD,然后送回本地的 nxesd,再通过本地的 OSS wrapper 发给本地的声音服务器然后我们就听到声音了。终于,网页中的 Flash 可以正常发声了。