†Linuxなんて大キライ†
作成開始日 2021.07.03
最終更新日 2022.12.12
【注意】基本的にrootではPulseAudioは起動できない
Debian 9では「pulseaudio --start」で起動できたが、自動起動はしない。
Debian 8では一般ユーザーで起動したり、「--system」付けたり、ごちゃごちゃやっていたら起動できた。そもそも、rootを拒否る意味がわからん。
まず、Linuxのオーディオ機能は下図のような階層構造になっている。複数のアプリケーションからの要求をPulseAudioが受け取り、PulseAudioが要求を調整してALSAに渡し、ALSAが実際にハードウェアを機能させるという流れだ。つまり、PulseAudioが共有機能を荷っていることになる。
device | サウンドカード等 | ||
ALSA | ハードウェアとのやりとり | ||
PulseAudio | 複数のアプリからの入力を調整 | ||
Application 1 | Application 2 | Application 3 | 各アプリケーション |
したがって、各アプリケーションはPulseAudioに対して出力するのが原則である。ところが、ウチの環境ではPulseAudioに対して出力しても、全く音が出なかった。使用したアプリケーションはSMPlayer、オーディオ・デバイスは内蔵のIntel HDと外付けのUSBスピーカー。
そこで、SMPlayerのオーディオ・ドライバとして「alsa (0.1 - C-Media USB Headphone Set)」を選んだところ、USBスピーカーから正常に音が出るようになった。これにて一件落着と思ったのだが、これが排他的にしか使えない。他のアプリケーションはもちろん、SMPlayerの別インスタンスも使用できない。これは非常に不便であった。
なぜこんな現象が起きるのかと言うと、恐らく下図のような状況になっていたためだろう。
device | サウンドカード等 | ||
ALSA | ハードウェアとのやりとり | ||
SMPlayer | PulseAudio | 複数のアプリからの入力を調整 | |
Application 2 | Application 3 | 各アプリケーション |
SMPlayerが、共有を管理するPulseAudioを経由せず、直接ALSAと接続してしまったため、(特定のインスタンスの)SMPlayerがALSAを占有してしまったのだと思われる。この状態を以って、私はDebian 8のオーディオ機能は排他的にしか機能しないと、と勘違いしてしまった訳だ。
ところで、SMPlayerのオーディオ出力ドライバ項目には、次のような3種類のALSAドライバの選択肢が出てくる。今回はこの中の3番目の項目を選んだわけだが、他の2つはどんなドライバなのだろうか?
alsa alsa (0.0 - HDA Intel PCH) alsa (0.1 - C-Media USB Headphone set)このうち、2番目の項目は内蔵オーディオに直接出力するドライバで間違いないだろう。しかし、1番目の無印「alsa」はなに? これはどうやらPulseAudioにあるALSAの影武者モードのようだ。つまり、ALSAを直接叩きたがる行儀の悪いアプリがあるが、そんな子はこっちを使ってね、ALSAに直接接続しているように見えて、実はPulseAudioの管理下にあるんで安全だし共有も可能だよ、的なものらしい。逆に言うと、PulseAudioに接続して音が出ない状態ならば、この無印「alsa」を選んでもやっぱり音は出ない。
ということで、大まかな流れみたいのは掴めたわけだが、じゃあ、なんでPulseAudioに接続しても鳴らないの?という根本的な疑問は残る。ちょっとまとめると;
オーディオ機能の誤った設定の典型は;
@出力先が間違っている、
A音量が小さすぎる、
と言うもの。アプリケーションが正常動作しているように見えるのに音だけ出ない場合は、これらの可能性が高い。そして、私のケースでは@が根本問題だったような気がする。
出力先を誤るのは出力先が複数あるからで、そもそもUSBスピーカーを付けた事がトラブルを招いた−−と考えそうな所だが、実は、内蔵オーディオから全く音が出なかったからこそUSBスピーカーを使用したのであって、USBを元凶と見ることはできない。
じゃあ、内蔵オーディオしかない状態で、出力先をどう間違えるのかと言うと、実はHDオーディオには「ライン出力」「アナログ出力」「アナログヘッドフォン」という3系統の出力先がある。この選択を誤るとやっぱり音は出ない。最初に音が出なかった原因はこの辺りにあるのではないかと思っているが、今となっては確認はできない。
で、こうした問題を確認・修正するのが[PulseAudio音量調節]というプログラム。名前だけ見ると、単なるボリューム調節に見えてしまうのが盲点。Xfceの場合、メニューから[マルチメディア|PulseAudio音量調節]を起動して[再生(P)]を開く。図の赤く囲んだ部分をクリックすると、出力先を選ぶことができる。また、内蔵オーディオのように一つのデバイスに複数の出力先がある場合は、[出力装置(O)]の「内部オーディオ」の[ポート]の設定を変更する。
それにしても、USBスピーカー(C-Mediaチップ搭載)が[Audio Adapter アナログステレオ]なのだから、なかなか判りにくい。もう一つの選択肢が[内蔵オーディオ アナログステレオ]だったので、消去法的にこっちがUSBかと判断できるけれど…
これで基本的に音は出るし、ホスト側のオーディオとの共有も可能になる。ただし、OS/2の場合はけっこうな確率で突如音が出なくなる。単に音が出なくなるだけでなく、動画の再生が止まってしまう。原因は不明。サスペンド状態から復帰すると音が出なくなっていた、というような事もあった。対処法は確立していないが、mplayerで「-ao」オプションをガチャガチャ弄ってたら正常に戻った。何かの拍子に初期化されたのだろうか…?
■JACKオーディオサーバのインストールと設定
Debian 8の場合、パケマネからJACKオーディオ・サーバ用のファイル(jackd、qjackctl)をインストールすれば良い…詳しい手順はあまり覚えていないが。
@予め、接続したいアプリを起動して、出力ドライバーを「jack」に変更しておく。
Aメインメニューから[マルチメディア|QjackCtl]を起動する。
B[設定]をクリックして出力デバイスを指定する。
C[接続]をクリックして、アプリ(出力ポート)とスピーカー(入力ポート)を選んで[接続]
をクリックする。これで、アプリとスピーカーが線で結んで表示される。
D[開始]をクリックしてサーバを動作させる。
以上で完了。「出力ポート」と「入力ポート」の名称が何となくしっくりこないが…
■JACKの制限と問題点