WSL2 上の ArchWSL で音を鳴らす

折角歯車も回ったことだし、音も鳴らしてみることにしよう。

PulseAudio ライブラリのインストール

リモートサーバで音を鳴らすので、ライブラリだけをインストール。wine で音を鳴らしたい場合は lib32-libpulse が必要かも知れない。

sudo pacman -S libpulse

ユーザ設定ディレクトリを作成して設定スケルトンをコピーする。

mkdir ~/.pulse
cp /etc/pulse/client.conf ~/.pulse/

設定ファイルを開き、デフォルトサーバを設定する。

vim ~/.pulse/client.conf

編集するところはここ。

...
default-server = <<ホストのマシン名>>.mshome.net
...

PulseAudio サーバのインストール

ホストに PulseAudio サーバをインストールする。入手可能なウェブサイトはいくつかある。ここでは、C:\wsl\pulseaudio\{bin,etc\pulse} に配置することにする。

  • 公式

www.freedesktop.org

mingw32 向け spec が付いているので、自分でビルドすると精神衛生上良いかもしれない。

  • Cendio ThinkLinc

https://www.cendio.com/pulseaudio

クライアントパッケージに同梱されている。

  • Open e-Goverment

https://osdn.net/projects/sfnet_open-egov/

MingW/MSYS とのこと。

PulseAudio サーバのセットアップ

C:\wsl\pulseaudio\etc\pulse\daemon.conf で、共有メモリ無効(エラーで使えない)、待機時間無限(接続しないでいると勝手に落ちる)を設定する。

enable-sm = no
exit-idle-time = -1

PulseAudio サーバ起動時にデフォルトスクリプトが読み込まれて各種 PulseAudio モジュールをロードするのだが、$Env:UserProfile\.config\pulse\default.pa になっているらしい。

mkdir $Env:UserProfile\.config\pulse\
ni $Env:UserProfile\.config\pulse\default.pa
notepad $Env:UserProfile\.config\pulse\default.pa

サウンド出力と、TCP 入力を設定する。

load-module module-waveout sink_name=output source_name=input record=0
load-module module-native-protocol-tcp auth-cookie-enabled=false auth-ip-acl=<<WSL2 のアドレス空間>>

遅延が気になるようであれば、module-waveout モジュールのオプションである fragments (デフォルト 12 (個)) や fragment_size (デフォルト 1024 (bytes)) を調整すると良い。

PulseAudio サーバの起動

以下のコマンドで PulseAudio サーバを起動する。

.\pulseaudio.exe -D

これだと PulseAudio がコンソールセッションを終了時まで奪ってしまうので、start (Start-Process コマンドレット) を使うとそのまま手順を続けられる。

start .\pulseaudio.exe -D

ArchWSL で何か音を鳴らす

音を鳴らすアプリは色々あるが、libpulse には paplay という WAV ファイルを読み込んで音を鳴らすだけのテストコマンドがあるので、これで慣らすのがお手軽だ。

しかし、単純に音を鳴らすだけではさみしいので、DeaDBeeF で音楽を聴いている体にしたい。

まずは、DeaDBeeF と依存ライブラリをインストールする。

sudo pacman -S deadbeef libmad gtk3

DeaDBeeF を起動し、Edit > Preference > Sound で Output plugin を PulseAudio output plugin にする。

f:id:anon_193:20200601222518p:plain

これで、音が鳴るようになる。 後は適当にカスタマイズして音楽を視聴する。

f:id:anon_193:20200601222040p:plain

PulseAudio サーバの終了

pactlpacmd で終了する。タスクマネージャなどでプロセスを終了させても特に問題ないようだ。