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}
に配置することにする。
- 公式
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
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 にする。
これで、音が鳴るようになる。 後は適当にカスタマイズして音楽を視聴する。
PulseAudio サーバの終了
pactl
や pacmd
で終了する。タスクマネージャなどでプロセスを終了させても特に問題ないようだ。