tsutsuiの作業記録置き場

NetBSDとかPC-6001とかの作業記録のうち、Twitterの140字では収まらない内容や記事としてまとめるべき内容をとりあえず置いてみる予定

NetBSD + pkgsrc における oss, alsa, pulseaudio についてのメモ


Live Image 設定
firefox 関連のサウンド設定をいろいろ試行錯誤しているのですが、メモとしてつぶやいている Twitter だと情報としてすぐに埋もれてしまうし、Togetter でまとめても微妙に参照しづらいので、「冬休みの自由研究」ということでざっとまとめてみます。

記憶に頼って一気に書いたのでいろいろ間違いも含まれると思いますが、指摘があれば適宜修正します。

定義

困った時は「とりあえず Wikipedia」ということで要点をピックアップ

OSS

Open Sound System (OSS) は Unix オペレーティングシステムで音を作成したりキャプチャしたりするための標準インターフェイスである。標準 Unixバイスに基づいている(例えば、POSIX の read、write や ioctl など)。

ALSA

Advanced Linux Sound Architecture (ALSA) は、サウンドカードデバイスドライバを提供するOpen Sound System (OSS)を置き換えるために開発されたLinuxカーネルコンポーネントである。ALSAプロジェクトの初期の目標は、サウンドカードハードウェアの自動設定や、複数のサウンドバイスのスマートな取扱いなどであったが、それらは概ね達成された。

PulseAudio

PulseAudioはバックグラウンドで動作するサウンドサーバであり、 一つまたは複数の音声入力(プロセスや録音デバイスなど)からデータを受け取って一つまたは複数の音声出力(サウンドカードやネットワーク上のPulseAudioサーバ、他プロセスなど)に送る。

PulseAudioの目標の一つは、旧来のOSSを利用したアプリケーションなどのようにハードウェアに直接アクセスする代わりに、すべての音声ストリームをPulseAudio経由で扱うようにすることである。 そのために、aRtsやESDなど他のオーディオシステムの利用するアプリケーションに対してアダプターを提供する。

オレオレ解釈

Wikipedia の説明を適当に解釈すると以下

OSS

「たとえば、 POSIX の read、 write や ioctl など」という記述から、
カーネルデバイスドライバ」と「ユーザーランドアプリ」との間をつなぐシステムコールAPIの定義
と解釈されると思われる。

アプリ的には
カーネルaudio のデバイスファイルに対して何をどうアクセスするか」
という API定義への対応、というところか。

ALSA

OSSを置き換えるために開発されたLinuxカーネルコンポーネントである」という記述からすると
OSS と同様のシステムコールAPI定義」
のように見えるが、実は Wikipedia には以下の記述もある。

ALSAデバイスドライバの他に、カーネルドライバと直接やりとりせずに高レベルのAPIを使ってドライバ機能を使いたいという開発者のために、ユーザ空間ライブラリも提供している。ハードウェアの能力を直接反映しようとするカーネルAPIとは違って、ALSAのユーザ空間ライブラリは、異なるハードウェア間でも可能な限り同じように扱えるよう、抽象的なインタフェースを提供している。

アプリケーションの設定で「ALSA」という項目がある場合、ほとんどの場合はこの「ユーザー空間ライブラリ用のAPI」への対応を指していると思われる。

PulseAudio

「バックグラウンドで動作するサウンドサーバ」という記述の通り、完全にユーザーランド上で動作するデーモン的アプリケーションで、「デーモンに対するAPI」への対応を指していると思われる。

各アプリでのサウンド再生実装と設定

OSS

アプリケーションは「OSSに対応するデバイスのデバイスファイル名」を知っている必要がある。

NetBSD であれば /dev/audio だけれども、オーディオデバイスが複数載っているマシン(旧来のサウンドボードHDMI 対応グラボ、とか)の場合は /dev/audio1 等を選択する必要があるので、動的に設定できる方が良い。Linux だと /dev/dsp とかになる? (よく知らない)

なので、アプリケーションユーザーの立場でも「デバイスファイル名は何か」というところは設定しなければいけない項目として現れてくる。(設定項目が無ければビルド時にデフォルト決め打ちで変更できないということ)

アプリケーション実装者の立場としては以下?

  • オーディオフォーマット等は OSS の規格で定義されていると思われる
  • 実際にハードウェアおよびカーネルがどういうフォーマットをサポートしているかは環境依存
    →アプリが適切な API を叩いて取得する必要がある?

例えば NetBSD だと "audioctl encodings" 等で表示される。

% audioctl encoding
sencodings=slinear_le:16,slinear_be:16*,ulinear_le:16*,ulinear_be:16*,mulaw:8*,alaw:8*
%

audioctl(1) のソース を見ると、 audio(4) の man 等に記載のある AUDIO_GETENC, AUDIO_GETPROPS, AUDIO_GETINFO あたりの ioctl を叩くことになると思われる。

「wav 再生はどうすれば可能か」で考えると audioplay(1) で鳴らせるので、せっかちならば audioplay(1) のソース を見ればわかる、ということになる。

ALSA

アプリケーションユーザーとしては、たぶん「ALSAを使う」を設定するだけで良い?
(「ALSA 自身をどう設定するのか」は後述)

アプリケーション実装としては ALSA 的な流儀で抽象化された API が存在すると思われるので、それに沿って実装?

「wav 再生はどうすれば可能か」で考えると aplay(1) で鳴らせるので、 aplay のソース を読めばなんとなくわかる? (全部が1つのファイルに入ってて斜め読みには向かない感じだが……)

PulseAudio

アプリケーションユーザーとしては、たぶん「PulseAudioを使う」を設定するだけで良い?
(「PulseAudio 自身をどう設定するのか」は後述)

「wav 再生はどうすれば可能か」で考えると paplay(1) (実態は pacat(1) へのシンボリックリンク) で鳴らせるので、 pacat のソース を読めばなんとなくわかる?

pkgsrc の firefox での実装と設定

pkgsrc としてのオプション

pkgsrc/www/firefox/options.mk の中に以下の選択肢がある。

PKG_SUPPORTED_OPTIONS+= alsa oss pulseaudio dbus

.if ${OPSYS} == "Linux"
PKG_SUGGESTED_OPTIONS+= alsa mozilla-jemalloc dbus
.elif ${OPSYS} == "NetBSD"
PKG_SUGGESTED_OPTIONS+= alsa dbus
.else
PKG_SUGGESTED_OPTIONS+= dbus pulseaudio
.endif

firefox 50 への更新時 から、上記の通り NetBSD でも ALSA がデフォルトになった。

しかし、 pkgsrc-users メーリングリストのポストを見ると
「オプションで oss に変えてビルドしている」
という人が多いような気も?

オプション指定時の動作

上記のオプションにより、 firefox ビルド時に configure へ渡すオプションが切り替わる。

それぞれの configure オプションが排他なのか、仮に同時に指定できる場合それぞれをどうやって切り替えられるのか、は調べていない。しかし、記述として排他になっているということは動的な切り替えはできない?

OSS

.if !empty(PKG_OPTIONS:Moss)
CONFIGURE_ARGS+= --with-oss
.include "../../mk/oss.buildlink3.mk"
.else
CONFIGURE_ARGS+= --without-oss
.endif

ALSA

.if !empty(PKG_OPTIONS:Malsa)
CONFIGURE_ARGS+= --enable-alsa
.include "../../audio/alsa-lib/buildlink3.mk"
.else
CONFIGURE_ARGS+= --disable-alsa
.endif

PulseAudio

.if !empty(PKG_OPTIONS:Mpulseaudio)
.include "../../audio/pulseaudio/buildlink3.mk"
CONFIGURE_ARGS+= --enable-pulseaudio
.else
CONFIGURE_ARGS+= --disable-pulseaudio
.endif

adobe-flash-plugins11 の設定

悪名高い(?) Flash Player であるが、 NetBSD + pkgsrc の場合はほぼ firefox とセットで使われていると思われる。

Adobe からは Linux用のバイナリしか提供されていないので、 NetBSD 上の firefoxLinux 用のプラグインを利用する黒魔術(?)として nspluginwrapper というものが使われているのであるが、最終的なサウンド出力はプラグインとそれを支援する nspluginwrapperLinux バイナリが行う。

よって、 Flash プラグインサウンドの設定は firefox 本体の設定とは無関係で、「Linuxプラグインが何を見てどう切り替えているか」ということになると思われる。

pkgsrcとしてのオプション

pkgsrc/multimedia/adobe-flash-plugins11/options.mk には以下の選択肢がある。

PKG_SUPPORTED_OPTIONS= nspluginwrapper pulseaudio

オプション指定時の動作

pulseaudio の選択肢だけであるが、実際に切り替わるのは以下である。

DEPENDS+= nspluginwrapper>=1.4.4:../../www/nspluginwrapper
. if !empty(PKG_OPTIONS:Mpulseaudio)
EMUL_MODULES.linux+= pulseaudio
MESSAGE_SRC+= ${PKGDIR}/MESSAGE.pulseaudio
. else
DEPENDS+= libflashsupport>=4.2.2011:../../multimedia/libflashsupport
. endif

つまり、以下と思われる。

  • pulseaudio を使う場合は、 Linux エミュレーションの pulseaudio のモジュールを入れるだけ
  • pulseaudio 以外 (実際はおそらく OSS の想定) を使う時は libflashsupport のライブラリを追加で入れる

libflashsupport

libflashsupport 関連については、検索してもまともに整理された情報がないのでよくわからないのだが、以下の動作のようである。

  • デフォルトでは pulseaudio に出力される?
    ALSA 経由で /emul/linux/etc/asound.conf の設定が pulseaudio になっているだけかも)
  • /usr/lib/libflashsupport.so (NetBSDLinux エミュレーション的には /emul/linux/usr/lib/libflashsupport.so) が存在する場合は、サウンド出力部分がプラグイン的にオーバーライドされる?

「pkgsrc/multimedia/libflashsupport は何物なのか」というと、実はこれの今の pkgsrc のメンテナは私だったりするのであるが、 OSS の本家(?)である 4Front Technologies が一応いまでも公開している libflashsupport のソース で、中身を見ると OSS に対してサウンド出力をする実装のようである。

ちなみにいまどきの Linux ではでデフォルトの pulseaudio で事足りるせいか libflashsupport の x86_64 バイナリは存在しないようだったので、 pkgsrc では私が OpenSUSE 12.1 上で自前でビルド したバイナリが使われている。 (nspluginwrapperLinux バイナリも 私がビルドしたもの だったりする)

実態としては以下のようである。

  • Linux では当たり前のように標準の pulseaudio (or ALSA) を使っている?
  • NetBSD では pulseaudio がうまく動かなかった過去がある(?) ので OSS がデフォルト?

OSS/ALSA/PulseAudio 自体の設定

各アプリの設定はだいたいわかったとして、今度は OSS/ALSA/PulseAudio そのものについてもそれなり設定をしてやる必要がある。

しかし、冒頭に載せたツイートにあるとおり、 ALSA と PulseAudio のいずれも以下に挙げる問題があるため、 pkgsrc ユーザーとしては混乱しているようである。

  • アプリ実装が Linux を前提にしていて NetBSD 上での実装にそれなりに無理がある
    (=デフォルト設定ではいろいろと問題がある)
  • ALSA, PulseAuido とも設定記述にクセがある
    (もっとも、 man や Arch の Wiki 等は充実しているのでちゃんと調べればわかるのであるが)

OSSの設定

OSS の場合は各アプリが直接デバイスファイルを叩くので、各アプリの設定はあっても OSS そのものの設定というのは基本的にはないはず。

強いて言えば、システムとして /dev/audio のシンボリックリンク先を標準の audio0 以外に変えるかどうか、くらい?

ALSAの設定

ALSA の設定」といっても、 NetBSD の場合はカーネル側の ALSA 実装はなく、抽象化層のライブラリである alsa-lib の設定のみである。

「抽象化層の設定」というのが具体的に何かというと、
「アプリが ALSA に対して渡してきたサウンドデータを最終的にどこに出力するのか」
ということである。 NetBSD の場合、実質的には OSS or PulseAudio という二択と思われる。

ALSA 設定には(他のアプリと同様に)「システム全体の設定ファイル」と「ユーザー別の設定ファイル」がある。

システム全体の ALSA 設定

/etc/asound.conf に記述する。

注意すべきこととして、 Adobe Flash Plugin を含む Linux バイナリの場合は pkgsrc の suse_alsa のパッケージによりインストールされる /usr/pkg/emul/linux/etc/asound.conf の方が参照される、という点がある。

ユーザー別の ALSA 設定

~/.asoundrc に記述する。
このファイルは (/emul/linux/home 以下に個別のホームディレクトリを作成していない限りは) Linux バイナリでも NetBSD ネイティブバイナリでも共通で参照される、というところに注意する必要がある。

ALSA 設定ファイル記述

ググっても 過去の netbsd-users ML の記述 くらいしか出てこないのであるが、以下でよいようである。

OSSを使う場合
pcm.!default {
type oss
device /dev/audio
}

ctl.!default {
type oss
device /dev/mixer
}
PulseAudioを使う場合
pcm.!default {
type pulse
}

ctl.!default {
type pulse
}


実際にはほかにも設定可能な項目もあるのかもしれないが、 Arch の Wiki 等では Linux 固有の設定の説明のほうが多く、きちんと調べられていない。

ちなみに suse_alsa のパッケージでインストールされる /usr/pkg/emul/linux/etc/asound.conf は asound-pulse.conf を使っており、その内容は以下である。

# PulseAudio plugin configuration

pcm.!default {
type pulse
hint {
show on
description "Default ALSA Output (currently PulseAudio Sound Server)"
}
fallback "sysdefault"
}

ctl.!default {
type pulse
fallback "sysdefault"
}

なお、 pkgsrc/emulators/suse131_alsa/files 以下には 06-oss.conf として以下の設定もある。 OSS と PulseAudio との切り替えを容易にするのであれば default 項に device を書くのではなく、この記述にあるように個別設定を書くべきなのかもしれない。(このあたり未検証)

# Add a specific named OSS pcm and ctl (typically useful for testing)

pcm.oss {
type oss
device /dev/audio
hint {
show on
description "OSS"
}
}

ctl.oss {
device /dev/audioctl
type oss
}

PulseAudioの設定

PulseAudio の場合、 ALSA 等を経由するとしても PulseAudio 自身が最終的にカーネルのデバイスに対して出力をする。

よって、「PulseAudio の設定」といった場合は「PulseAudio 自身の制御の設定」ということになる。なお、「PulseAudio がどうやって実際の音を鳴らすのか」という設定もあるが、デフォルト設定は PulseAudio のビルド時に OS別に設定されている。(設定ファイルでの変更も可能)

設定ファイル詳細

PulseAudio の設定は「ビルド時のコンフィグ設定」「システム全体の設定ファイル」「ユーザー別の設定ファイル」があるようである。

しかし、「ビルド時にしかできない設定」というのは特に存在せず、必要な部分はシステムおよびユーザー別で柔軟に設定変更が可能な構成になっているように見える。

man pulseaudio とすると SEE ALSO の項目に出てくるが、 PulseAudio には以下の3種類の設定ファイルがある。

  • pulse-daemon.conf(5) - PulseAudio デーモンの設定
  • pulse-client.conf(5) - PulseAudio クライアントの設定
  • default.pa(5) - PulseAudio スタートアップスクリプト

それぞれ man のエントリ名と実際のファイル名とが対応していないので紛らわしいが、各 man の先頭の SYNOPSIS にあるように「システム全体の設定ファイル」「ユーザー別の設定ファイル」は以下である。

  • PulseAudio デーモン設定
    • /usr/pkg/etc/pulse/daemon.conf
    • ~/.config/pulse/daemon.conf
  • PulseAudio クライアント設定
    • /usr/pkg/etc/pulse/client.conf
    • ~/.config/pulse/client.conf
  • PulseAudio スタートアップスクリプト
    • /usr/pkg/etc/pulse/default.pa
    • /usr/pkg/etc/pulse/system.pa
    • ~/.config/pulse/default.pa

設定内容

/usr/pkg/etc/pulse というパスを見ればわかるように、デフォルトの設定ファイルは pkgsrc の枠組みでインストールされる。よって、「デフォルトで問題がなければ」ユーザー別の設定ファイルは特に設定不要である。

しかし、実際にはデフォルトの設定には(現在は対処されているものを含め)いろいろと問題が存在したため、 pkgsrc ユーザーの間では全般的に pulseaudio の評判は良くないようである。

実際に Live Image で参照用として設定している内容は以下のとおりである。

基本はデフォルトの /usr/pkg/etc/pulse 以下のファイルがベースであるが、 NetBSD として変更したほうが安定動作する項目、サウンドカードによって変更したほうがよい(かもしれない)項目を適当に修正およびピックアップしてある。

これらの内容については NetBSD における PulseAudio の問題点にも関わるため詳細は後述する。

どれを使うべきなのか

oss, alsa, pulseaudio と 3つが並列で書かれているが、ここまで説明してきたように、3つはまったく異なるレイヤーの概念である。

選択肢としての考え方

開発者視点

「アプリケーション実装者」にとっては「どれを使って実装するのか」という三択になる。

「単に音が出ればよい」のであれば、どれで実装するにしてもそれぞれの仕様を理解する必要があるという点ではあまり変わらない?

一般ユーザー視点

「アプリをインストールして設定する一般ユーザー」の立場としてはどうかと考えると、先に説明したように「ALSA を使うようにすれば、実態として OSS にも PulseAudio にも切り替え可能」である。

よって、(少なくとも NetBSD であれば) pkgsrc の firefox が選択したように「ALSA を選択する」のが妥当のように思われる。
(実態として pulseaudio ユーザーと oss ユーザーと 2極化しているようなので)

なお、 ALSA を使う場合、 OSS および PulseAudio のいずれを使うにしても alsa-plugins-oss もしくは alsa-plugins-pulse のそれぞれのプラグインのインストールが必要になる。

OSS or PulseAudio

ALSA ライブラリ層には演奏機能の実態は無いため、残る選択としては OSS と PulseAudio とどちらがよいのか、ということである。

とりあえず適当に私自身の経験ベースで良い点と悪い点を列挙してみる。

OSS利用時の利点

  • 設定項目がデバイスファイルだけ
  • 実装も PCM のような音源データを流し込むだけ

OSS利用時の不利な点

  • 単機能であるがゆえに機能的には貧弱
  • Linux としてはもはや推奨されない I/F なので各種アプリは対応が怪しい
  • NetBSD 7.x 以前では)複数アプリの同時再生(ミキシング)が不可能
カーネルレベルオーディオミキシング

NetBSD-current ではカーネルレベル (=OSS層の内部に相当) でのオーディオミキシングが実装されていて、 複数のアプリケーションが /dev/audio を同時オープンして出力する」ことで複数アプリでのミキシングが可能になっている。(私自身は生活マシンで -current を使っていないので試していない)

ただ、(根拠のない私見であるものの)以下のような問題はあると思われる。

NetBSD 固有の問題で

  • どこまでの機能(異なる周波数のミキシング等)が実装されているのか、といった説明ドキュメントは用意されるのか?
  • 設定変更のたびにカーネル再構築が必要になったりしないか?

という心配も……。(偏見です)

PulseAudio利用時の利点

  • 事実上 Linux 標準なのでアプリ側はたいてい対応している?
  • 複数アプリのミキシングも標準でサポートしている
  • man や Arch Wiki 等の説明も豊富

PulseAudio利用時の不利な点

  • PulseAudio のメインターゲットが Linux なので NetBSD では実装として最適化されていない
  • 同様に設定ファイルのデフォルトも NetBSD 向きでない
  • 機能が豊富であるがゆえにAPIが複雑、かつ、全体的に重い
  • ビルドおよびインストール時に必要な依存パッケージが多く容量が必要

概ね利点と欠点とが相反事項であるが、「NetBSD においては」というところが曲者という感じ。

NetBSD で PulseAudio を使う場合の問題点とその対処

現在では解決している問題も含め、 NetBSD で PulseAudio を使う場合は以下の5つの問題がある(あった)と思われる。

  • PulseAudio 使用時に CPU 負荷が 100%になる問題
  • PulseAudio および NetBSD の shm_open(3) の実装の問題
  • x86_64 の Linux エミュレーションでの問題
  • 起動時のメッセージの問題
  • 依存パッケージの問題

PulseAudio 使用時に CPU 負荷が 100%になる問題

pulseaudio-5.0 の頃までずっと発生したように思うが、 pulseaudio を使うアプリ (SDL を使う onscripter や xnp2 など) を使うと top(1) 等で表示される CPU負荷が 100%近くに貼りつくという問題があった。いつから発生していたのかの記憶はあやふやであるが、普段遣いのアプリでは使う気が萎える程度には鬱陶しかったように思う。

ただし、この問題は 2015年12月にコミットされた NetBSD 固有部分の処理の修正 でとりあえず解決されている。なお、この問題の対処はスタートアップスクリプト (/usr/pkg/etc/default.pa もしくは ~/.config/pulse/default.pa) に以下の記述をすることに相当する。

load-module module-oss mmap=0 device="/dev/audio"

本題とは外れるが、 PulseAudio で /dev/audio 以外のデバイスに最終音声出力させる場合もこの行を編集すればよいと思われる。

PulseAudio および NetBSD の shm_open(3) の実装の問題

PulseAudio は内部の再生処理において POSIX で定義されている shm_open(3) を使用している。

NetBSD 6.x では shm_open(3) が実装されていなかったため、 pulseaudio ビルド時にも shm_open(3) を使用しない設定になっていたようである。

NetBSD 7.x では他のアプリの需要もあり shm_open(3) が実装され、 pulseaudio も自動的にこれを使うようになったらしいのであるが、ここで以下のような問題が発生したようである。

  • shm_open(3) を使うためには /var/shm が tmpfs でマウントされている必要がある
    →sysinst での新規インストールやアップグレードインストール時には自動で /etc/fstab に必要な設定が追加されるが、手動インストールや手動アップグレード時は手で書かない限り設定されない
    → 結果として shm_open(3) が失敗する?
  • PulseAudio はクライアントを 1つ起動するたびに shm_open(3) で 32MB を確保しようとする
    Linux実装および今時のマシンでは問題無いのかもしれないが、NetBSD の実装では /var/shm に 32MB のファイルを作成しようとする
    → /var/shm の tmpfs 容量は「搭載RAMの 25%」で取られるので、仮にメモリ 512MB のマシンだと 128MB、つまり 4クライアント目が起動するとあふれて再生できなくなる。
    さらに、 pulseaudio を強制終了したりすると /var/shm のファイルが消されずに残ったままになり、それに気づかないと pulseaudio での再生がまったくできなくなる。

この問題は PulseAudio デーモン設定ファイル (~/.config/pulse/daemon.conf) で「shmを使わない」という以下の設定を記述すれば回避は可能である。

enable-shm = no

現状では pkgsrc の標準でインストールされる /usr/pkg/etc/pulse/daemon.conf では上記はデフォルトのままで shm_open(3) が使われる設定のままになっている。

x86_64 の Linux エミュレーションでの問題

Linux バイナリが NetBSD 上で PulseAudio で再生を行う場合は、 /emul/linux 以下にインストールされている Linux の実行ファイルバイナリおよびライブラリにより再生処理が実行される。

NetBSD/i386 の場合はこの Linuxバイナリによる PulseAudio 再生は問題なく動作する。しかし、 NetBSD/amd64 の場合は Linux バイナリによる PulseAudio 再生が失敗するという問題があり、これhが現在でも解決されていない。(-current での動作は未確認)

問題の詳細および再現手順については PR port-amd64/50603 を参照してもらいたいが、 Linux の場合システムコール実装が CPUアーキテクチャごとに異なるため、 Linuxエミュレーション実装の詳細まで追っていかないとなかなか調査は難しそうである。

実態としてこれが問題として現れるのは Adobe Flash Plugin だけと思われる。 Flash が必要な Webコンテンツとしては(個人的には)ニコニコ動画だったのだが、ここに来てニコ動にも HTML5 プレーヤーが導入されつつあり、かつ自分自身が NetBSD/amd64 を常用していないこともあり、モチベーションとしては下がりつつある(すいません)。

残る Flash コンテンツとしては艦これくらいであるが、艦これ自体も最新の Flash Player では動作しない(古いバージョンだと動く?)と聞いているのでこれも微妙である。

この微妙な課題に対して手を上げる人がいるかどうか? (そこに目をつぶって pulseaudio を推すのか?) というところ。

起動時のメッセージの問題

これは実際のオーディオ再生とは直接関係のない、見た目だけの問題。

pulseaudio での音楽再生が実行されてデーモンが起動する際、毎回クライアントを起動したコンソールに以下のメッセージが表示される。

W: [(null)] caps.c: Normally all extra capabilities would be dropped now, but that's impossible beause PulseAudio was built without capabirities support.

"capabilities" というのは一般名詞ではなく Linux で実装されている権限設定関連の機能実装である。詳細は Linux Programmer's Manual (7) にあるが、要は「Linux向けに実装していてこの機能はほぼ必須である」という警告である。

上記 man によれば「ケーパビリティに関する標準はないが、 Linux のケーパビリティは廃案になった POSIX.1e 草案に基づいて実装されている」ということで、「標準ではないが Linux独自というわけでもない」という程度の機能のようである。

NetBSD でこれらの実装に対するモチベーションがあるのかどうかはわからないが、 kauth(9) と一部重複しそうな気もするし、なかなか難しそうな気はする。なお PulseAudio のソースによれば FreeBSD では「<sys/capability.h> のヘッダは存在するものの実装が未」という状態のようである。

すぐにアーカイブのリンクを探すことができないが、あやふやな記憶によれば、 pkgsrc 開発者の小野寺さんが upstream にこの警告を消す修正を送ったものの明示的に却下され、それを尊重して pkgsrc でも警告をそのまま残した、という流れだったと思う。なので、この警告が消えることは当面ないと思われる。

依存パッケージの問題

これも機能とはまったく関係なく、ビルド時間およびディスク容量だけの話である。

何もインストールされていない状態の NetBSD/amd64 7.0.2 に pkgsrc-2016Q4 で
pkg_add pulseaudio
とすると以下のパッケージがインストールされる。

libffi-3.2.1nb2 Foreign function interface
mozilla-rootcerts-1.0.20160610 Root CA certificates from the Mozilla Project
python27-2.7.12nb4 Interpreted, interactive, object-oriented programming language
py27-expat-2.7.12 Python interface to expat
perl-5.24.0 Practical Extraction and Report Language
libelf-0.8.13nb1 ELF object file access library
pcre-8.39 Perl Compatible Regular Expressions library
glib2-2.50.2 Some useful routines for C programming (glib2)
xmlcatmgr-2.2nb1 XML and SGML catalog manager
libxml2-2.9.4nb2 XML parser library from the GNOME project
shared-mime-info-1.8 Core database of common types
atk-2.22.0 Set of interfaces for accessibility
jbigkit-2.1 JBIG-KIT lossless image compression library
jpeg-9b IJG's jpeg compression utilities
tiff-4.0.7nb1 Library and tools for reading and writing TIFF data files
png-1.6.27 Library for manipulating PNG images
gdk-pixbuf2-2.36.0 Image loaders for gtk2
icu-58.2 Robust and full-featured Unicode services
harfbuzz-1.3.4 OpenType text shaping engine
lzo-2.09 Portable lossless data compression library
cairo-1.14.8 Vector graphics library with cross-device output support
cairo-gobject-1.14.8 Vector graphics library with cross-device output support
pango-1.40.3 Library for layout and rendering of text
gtk2+-2.24.31 GIMP Toolkit v2 - libraries for building X11 user interfaces
libdaemon-0.14nb1 C library that eases the writing of UNIX daemons
dbus-1.10.14 Message bus system
avahi-0.6.32nb3 Facilitate service discovery on a local network
nspr-4.13.1 Platform-neutral API for system level and libc like functions
spidermonkey17-17.0.0nb1 Standalone JavaScript implementation in C
polkit-0.113nb3 Authorization Manager
dbus-glib-0.108 GLib bindings for the D-BUS message bus system
consolekit-1.0.2nb1 Framework for defining and tracking users, login sessions, and seats
libogg-1.3.2 Ogg project codecs library
flac-1.3.1 Free lossless audio codec
libvorbis-1.3.5 Library for the Ogg Vorbis audio encoding format
libsndfile-1.0.27 Library for reading and writing audio files
speex-1.2.0 Open-source, patent-free voice codec
speexdsp-1.2rc3 Open-source, patent-free voice codec DSP library
gdbm-1.12 The GNU database manager
libltdl-2.4.2 Generic shared library support (libltdl abstraction library)
json-c-0.12.1 JSON library in C
pulseaudio-9.0nb1 Sound server for POSIX and Win32 systems

大部分は firefox 等の定番アプリでも必要なので問題ないとはいえ、 speex などの codec 関連は余分という気がしてしまうし、 pkgsrc-2016Q2 あたりから必要になった spidermonkey17 についてはやたらと巨大なので「なぜ必要なのか?」と思わざるを得ない。

いまどきのマシンではそんなことを気にすべきではないかもしれないが、単に PCM 再生がしたいだけのアプリにとっては「割鶏牛刀」という感じではある。

まとめ

ずっと頭の中で整理できていなかったことを一気に吐き出したのでやたらと長くなってしまったが、まとめると以下である。

  • OSS と PulseAudio を切替可能」ということで ALSA が使えるならそれがよさそう
  • ALSA の切り替え先としては PulseAudio の方が高機能で Linux向けアプリでも楽

検討・考慮すべき点は以下である。

  • PulseAudio を NetBSD上でうまく動かすには各種追加設定が必要
  • PulseAudio は重いので「大は小を兼ねる」と割り切る必要がある?
  • NetBSD/amd64 では Flash Player Plugin の pulseaudio 再生は動作しない