WSL上で音楽を再生する

WSL上で音楽を再生するコマンド(例えばmplayer)がうまく動作しない。Ubuntu 16.04LTSの場合、ここに書いてある手順でライブラリを差し替えたらうまく動作するようになった。

  • libpulse0を差し替える(libpulse0_8.0-0ubuntu3.3ppa1_amd64.deb)。
  • Windowsホスト上のpulse serverを指定する(PULSE_SERVER=tcp:localhost)。

github.com

Ubuntu 18.04LTSではpulseaudioのベースバージョンが上がっていて16.04LTS用のバイナリは適合しない。18.04LTS用のlibpulse0バイナリは見つけられなかったので以下の手順で自作した。tarballやrpmのリビルドには慣れているけどdebをリビルドしたのは今回が初めてで、数日間試行錯誤した。変な手順になっているかもしれない。

  • WSL上でのリビルドには失敗したのでXubuntu 18.04LTSの仮想マシンを用意。
  • pulseaudioのビルドに必要なパッケージをインストール。
# apt install build-essential pbuilder
# apt install build-dep pulseaudio
  • gpgキーを作成して登録(gpg, apt-key)。
  • pulseaudioのソースパッケージをダウンロード。
$ apt source pulseaudio
  • debian/patches/pulseaudio-11.1-libpulse0-for-wsl.patchを追加。
--- pulseaudio-11.1/src/pulsecore/mutex-posix.c.org     2016-08-23 21:50:11.000000000 +0900
+++ pulseaudio-11.1/src/pulsecore/mutex-posix.c 2018-11-19 15:52:54.056000000 +0900
@@ -21,6 +21,8 @@
 #include <config.h>
 #endif

+#undef HAVE_PTHREAD_PRIO_INHERIT
+
 #include <pthread.h>
 #include <errno.h>
  • debian/patches/seriesの末尾に以下を追加。
# Windows Subsystem for Linux
pulseaudio-11.1-libpulse0-for-wsl.patch
  • pulseaudioをリビルドする。
$ debuild -S -rfakeroot -kXXX
$ debuild -rfakeroot -kXXX
  • リビルドしたlibpulse0パッケージをWSLにコピーして差し替え、更新を禁止する。
# dpkg -i libpulse0_11.1-1ubuntu7.1_amd64.deb
# apt-mark hold libpulse0

これでUbuntu18.04LTSでもmplayerが使えるようになった。