カラクリスタ

「輝かしい青春」なんて失かった人のブログ

Pulseaudio 1.12 と alsa-lib 1.1.9 で Pulseaudio が動かない件への対処法

どういう問題が起きていたか

つい先日 Dell XPS 9560 に入っていた Windows 10 Pro を削除した関係で、 NixOSnixpkgsmaster ブランチの定義で再インストールしたんですが、 その際、

  • Pulseaudio 1.12
  • alsa-lib 1.1.9

と言う組み合わせになった結果、Pulseaudio の module-alsa-card が機能しなくなる、 と言う事態に遭遇し、マシンから音がまったく出ないと言う状態になっていました。

なぜその様な問題が起きていたか

alsa-libAPI (と言うかヘッダの位置)が変わり include すべきファイルが変わった結果、 本来ならリンクされているべき Shared Library への Symbol が Undefined Symbol になっていた、 というのが、modules-alsa-card が動かなくなった原因っぽいです。

どうやって直したか

PulseAudio-14.0

に記載されていた、下記のパッチを適用してなんとかしました:

sed -i "s:asoundlib.h:alsa/asoundlib.h:" src/modules/alsa/*.{c,h} &&
sed -i "s:use-case.h:alsa/use-case.h:" configure.ac &&
sed -i "s:use-case.h:alsa/use-case.h:" src/modules/alsa/alsa-ucm.h

なお NixOS のパッケージ定義では下記の様なファイルを用意し、 これを nixpkgs.overlays 経由で読み込んで対処しました:

self: super: let
  require = path: args: super.callPackage (import path) args ;
in {
  pulseaudio = super.pulseaudio.overrideAttrs (old: rec {
    # copied from http://www.linuxfromscratch.org/blfs/view/svn/multimedia/pulseaudio.html
    preConfigure = ''
      sed -i "s:asoundlib.h:alsa/asoundlib.h:" src/modules/alsa/*.{c,h}
      sed -i "s:use-case.h:alsa/use-case.h:" configure.ac
      sed -i "s:use-case.h:alsa/use-case.h:" src/modules/alsa/alsa-ucm.h
    '' + old.preConfigure;
  });
}

注意点

上記の nixpkgsoverlays は様々なパッケージが依存している pulseaudio パッケージを上書きする関係上、問答無用で様々なパッケージが再コンパイルになります。

つまり、コンパイル時間をめっちゃ消費する Chromium だとか QtWebKit だとか QtWebEngine だとか wine だとかもリコンパイルになるので、時間の無いときにその辺りのパッチを当てたりすると、 コンパイルがいつまで経っても終らないコトになります。なお自分の環境では 5 時間ぐらいは掛かりました。

以上

とりあえず pulseaudio 側の #include のパスを変更しただけでなんとかなったんで良かったんですが、 これが他の要因だったら多分対処できなかった様に思います。

あと他の Linux Distro でこの問題にブチ当たった場合、 上記パッチを当てた Pulseaudio とインストール済み Pulseaudio を入れ替えるだけで直るハズなので、 その辺りは NixOS よりかは楽だと思います。 ただしそれでもコンパイルは必要なんで面倒っちゃあ面倒ですけどね。