treedown’s Report

システム管理者に巻き起こる様々な事象を読者の貴方へ報告するブログです。会社でも家庭でも"システム"に携わるすべての方の共感を目指しています。

※https化しました。その影響でしばらくリンク切れなどがあるかもしれませんが徐々に修正していきます。 リンク切れなどのお気づきの点がございましたらコメントなどでご指摘いただけますと助かります。

Debianのxrdp環境で音が出るようにセットアップ

Windows同士のRDP接続は、特に何もしなくても画面と音がリモートデスクトップ経由でローカルマシンに再生されますが、xrdp環境では標準ではないようです。
xrdp環境で音が出るようにやってみたのでご報告です。

音が出ないことに気づく

前回の「Debianのxrdp環境を整備してCinnamonとMATEを比べる - treedown’s Report」でセットアップしたRDP接続で利用するDebian環境、xrdp経由で接続していたのですが、リモートデスクトップ接続で音が出ないことに気づきました。

今回はこれに音が出るようにセットアップしていこうという狙いです。

参考にさせてもらったサイト

今回は下記のサイトを参考にさせてもらいました。

itneko.blogspot.com

参考にさせて貰った記事ではDebian 10 Buster環境ですが、今回作業した環境は、「Debian GNU/Linux 11 (bullseye)」環境となります。

追記(23-05-23):

新しいバージョンのPulseAudio 15以降では、今回の./configureを使用したセットアップ方法は非推奨となっています。

./configureを使わないやり方でやってみた記録は以下のリンクの記事になります。

blog.treedown.net

追記ここまで。

makeインストールの準備

xrdp経由でサウンドを再生するために必要なパッケージは「pulseaudio-module-xrdp」になります。

xrdp-build-pulse-modulesのパッケージ解説を読んでみました。

https://manpages.debian.org/stretch-backports/xrdp-pulseaudio-installer/xrdp-build-pulse-modules.8.en.html

PulseAudio(network-capable sound server program)のモジュールにxrdp用のサウンドサーバがあって、それがxrdpでサウンドを再生させる機能を提供してくれるらしい。

まずは、make installのために必要になるパッケージをインストールします。

# apt install libpulse-dev dh-autoreconf git build-essential dpkg-dev

libpulse-devはPulseAudioクライアント開発ヘッダーとライブラリPulseAudioによってPOSIX および WIN32 システム用のサウンド サーバーがインストールされます。

dh-autoreconfは、autoreconfを呼び出して、ビルド後に後始末するdh_autoreconf_cleanを提供するアドオンです。

gitは、gitのリソースを使うために必要になるインストール。

build-essentialは、開発パッケージの一式がインストールされます。

dpkg-devは、build-essentialとやや被りですが、インストールを実行しておきます。

次のコマンドは実際にPulseAudioの導入をする手順です。

# cd /opt/
# apt install pulseaudio pavucontrol
# apt build-dep pulseaudio
# apt source pulseaudio

実施前にカレントディレクトリを「/opt」にしておきました。コマンドの実行終了後にはPulseAudioパッケージがカレントディレクトリに展開されています。

「apt build-dep」では、ソースパッケージの依存関係を満たすようにインストールと削除を実行してくれます。

「apt source」では、pulseaudioのソースコードをダウンロードしています。

ここまで実行が完了すると、カレントディレクトリには以下のようにパッケージが展開されています。

--------------------------------------------------------------
# ls -la
合計 1964
drwxr-xr-x  4 root root    4096  5月 11 19:53 .
drwxr-xr-x 19 root root    4096  5月 11 16:38 ..
drwxr-xr-x 15 root root    4096  5月 11 19:53 pulseaudio-14.2
-rw-r--r--  1 root root   35532  2月 27  2021 pulseaudio_14.2-2.debian.tar.xz
-rw-r--r--  1 root root    3699  2月 27  2021 pulseaudio_14.2-2.dsc
-rw-r--r--  1 root root 1951300  1月 20  2021 pulseaudio_14.2.orig.tar.xz
--------------------------------------------------------------

makeインストールの実行

ここからmakeインストールの実行に入ります。
カレントディレクトリを「pulseaudio-14.2」に移動します。

# cd pulseaudio-14.2/

ここでのフルパスだと「/opt/pulseaudio-14.2/」にディレクトリ移動しています。

# ./configure

makeインストールの実行時の定番「./configure」です。

# cd ..
# git clone https://github.com/neutrinolabs/pulseaudio-module-xrdp.git

いったん上の階層にディレクトリ移動して、gitコマンドでダウンロードを実行。
--------------------------------------------------------------
# ls -la /opt/
合計 1968
drwxr-xr-x  5 root root    4096  5月 11 19:57 .
drwxr-xr-x 19 root root    4096  5月 11 16:38 ..
drwxr-xr-x 15 root root    4096  5月 11 19:55 pulseaudio-14.2
drwxr-xr-x 10 root root    4096  5月 11 20:00 pulseaudio-module-xrdp
-rw-r--r--  1 root root   35532  2月 27  2021 pulseaudio_14.2-2.debian.tar.xz
-rw-r--r--  1 root root    3699  2月 27  2021 pulseaudio_14.2-2.dsc
-rw-r--r--  1 root root 1951300  1月 20  2021 pulseaudio_14.2.orig.tar.xz
--------------------------------------------------------------

これで「pulseaudio-module-xrdp」が増えています。

# cd pulseaudio-module-xrdp/
# ./bootstrap && ./configure PULSE_DIR=/opt/pulseaudio-14.2

カレントディレクトリを「pulseaudio-module-xrdp」に移動して、コンパイルを実行、「PULSE_DIR=」に続けて、一つ前の作業で「./configure」を実行したディレクトリをフルパスで(ここでは</opt/pulseaudio-14.2>の指定)記述します。

これでようやくmakeコマンドとmake installを実行。

# make
# make install

これで必要なpulseaudio-module-xrdpがインストールされました。

インストール確認

以下のコマンドでインストール確認ができます。

# ls $(pkg-config --variable=modlibexecdir libpulse)

実際に実行してみた出力。
----------------------------------------------------------------------------------------------------------------------------
root@hostname:/opt/pulseaudio-module-xrdp# ls $(pkg-config --variable=modlibexecdir libpulse)
libalsa-util.so               module-bluetooth-discover.so      module-filter-heuristics.so      module-remap-sink.so                module-tunnel-sink-new.so
libbluez5-util.so             module-bluetooth-policy.so        module-http-protocol-tcp.so      module-remap-source.so              module-tunnel-sink.so
libcli.so                     module-bluez5-device.so           module-http-protocol-unix.so     module-rescue-streams.so            module-tunnel-source-new.so
liboss-util.so                module-bluez5-discover.so         module-intended-roles.so         module-role-cork.so                 module-tunnel-source.so
libprotocol-cli.so            module-card-restore.so            module-ladspa-sink.so            module-role-ducking.so              module-udev-detect.so
libprotocol-http.so           module-cli-protocol-tcp.so        module-loopback.so               module-rtp-recv.so                  module-virtual-sink.so
libprotocol-native.so         module-cli-protocol-unix.so       module-match.so                  module-rtp-send.so                  module-virtual-source.so
libprotocol-simple.so         module-cli.so                     module-mmkbd-evdev.so            module-rygel-media-server.so        module-virtual-surround-sink.so
librtp.so                     module-combine-sink.so            module-native-protocol-fd.so     module-simple-protocol-tcp.so       module-volume-restore.so
libwebrtc-util.so             module-combine.so                 module-native-protocol-tcp.so    module-simple-protocol-unix.so      module-x11-bell.so
module-allow-passthrough.so   module-dbus-protocol.so           module-native-protocol-unix.so   module-sine-source.so               module-x11-cork-request.so
module-alsa-card.so           module-default-device-restore.so  module-null-sink.so              module-sine.so                      module-x11-publish.so
module-alsa-sink.so           module-detect.so                  module-null-source.so            module-stream-restore.so            module-x11-xsmp.so
module-alsa-source.so         module-device-manager.so          module-oss.so                    module-suspend-on-idle.so           module-xrdp-sink.la
module-always-sink.so         module-device-restore.so          module-pipe-sink.so              module-switch-on-connect.so         module-xrdp-sink.so
module-always-source.so       module-echo-cancel.so             module-pipe-source.so            module-switch-on-port-available.so  module-xrdp-source.la
module-augment-properties.so  module-filter-apply.so            module-position-event-sounds.so  module-systemd-login.so             module-xrdp-source.so
----------------------------------------------------------------------------------------------------------------------------

OSを再起動して、有効になります。

# systemctl reboot

再起動後、改めて、RDP接続でDebian環境に接続してみましょう。

接続して、音が出ることを確認

リモートデスクトップで接続したのち、ブラウザなどでyoutubeの動画を確認してみると、音が出ることが確認できました。リモートデスクトップ接続で音が出るというのは当たり前じゃなかったんだなぁと実感。

ただ、やや品質に問題があるときも…、と確認してみたら、弱点のCeleron847が原因のようです。システムモニターを確認してみたら、

CPU使用率100%のまま、ブラウザ起動だけでもCPU使用率がかなり上昇するのですが、それで動画再生などしてしまうとこうなってしまうのはしょうがないか。

ちなみに、Intel Core i7 4770のゲストOSで動作しているDebianでは、

やはり歴然とした差、このためCeleron847というCPUがネックになって品質に影響していると判断しました。