どういう問題が起きていたか
つい先日 Dell XPS 9560 に入っていた Windows 10 Pro を削除した関係で、
NixOS を nixpkgs
の master
ブランチの定義で再インストールしたんですが、
その際、
- Pulseaudio 1.12
- alsa-lib 1.1.9
と言う組み合わせになった結果、Pulseaudio の module-alsa-card
が機能しなくなる、
と言う事態に遭遇し、マシンから音がまったく出ないと言う状態になっていました。
なぜその様な問題が起きていたか
alsa-lib
の API (と言うかヘッダの位置)が変わり include
すべきファイルが変わった結果、
本来ならリンクされているべき Shared Library への Symbol が Undefined Symbol になっていた、
というのが、modules-alsa-card
が動かなくなった原因っぽいです。
どうやって直したか
に記載されていた、下記のパッチを適用してなんとかしました:
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; }); }
注意点
上記の nixpkgs
の overlays
は様々なパッケージが依存している pulseaudio
パッケージを上書きする関係上、問答無用で様々なパッケージが再コンパイルになります。
つまり、コンパイル時間をめっちゃ消費する Chromium だとか QtWebKit だとか QtWebEngine だとか wine だとかもリコンパイルになるので、時間の無いときにその辺りのパッチを当てたりすると、 コンパイルがいつまで経っても終らないコトになります。なお自分の環境では 5 時間ぐらいは掛かりました。
以上
とりあえず pulseaudio 側の #include
のパスを変更しただけでなんとかなったんで良かったんですが、
これが他の要因だったら多分対処できなかった様に思います。
あと他の Linux Distro でこの問題にブチ当たった場合、 上記パッチを当てた Pulseaudio とインストール済み Pulseaudio を入れ替えるだけで直るハズなので、 その辺りは NixOS よりかは楽だと思います。 ただしそれでもコンパイルは必要なんで面倒っちゃあ面倒ですけどね。