†Linuxなんて大キライ†

オーディオの排他モードの回避【改訂版】

ALSA/PulseAudio/JACKの機能と使い方

作成開始日 2021.07.03
最終更新日 2022.12.12

Debian 8では排他モードでしか音が出ない−−と思っていた。実際、ウチの環境ではそうした状況になったし、似たような勘違いをしているユーザーは少なくないようだ。しかし、オーディオ・ドライバが正常に機能していれば、DebianだろうがPuppyだろうが、共有モードでの再生は可能になる。問題は、Debian 8ではオーディオ・ドライバを正常に機能させるのが意外に難しい、と言うこと。引っ掛からなければ問題ないだろうが、ハマると自分が何をやっているのか判らなくなる。

【注意】基本的にrootではPulseAudioは起動できない
Debian 9では「pulseaudio --start」で起動できたが、自動起動はしない。
Debian 8では一般ユーザーで起動したり、「--system」付けたり、ごちゃごちゃやっていたら起動できた。そもそも、rootを拒否る意味がわからん。

ALSAとPulseAudioの基本的な関係

まず、Linuxのオーディオ機能は下図のような階層構造になっている。複数のアプリケーションからの要求をPulseAudioが受け取り、PulseAudioが要求を調整してALSAに渡し、ALSAが実際にハードウェアを機能させるという流れだ。つまり、PulseAudioが共有機能を荷っていることになる。

deviceサウンドカード等
ALSAハードウェアとのやりとり
PulseAudio複数のアプリからの入力を調整
Application 1Application 2Application 3各アプリケーション

したがって、各アプリケーションはPulseAudioに対して出力するのが原則である。ところが、ウチの環境ではPulseAudioに対して出力しても、全く音が出なかった。使用したアプリケーションはSMPlayer、オーディオ・デバイスは内蔵のIntel HDと外付けのUSBスピーカー。

そこで、SMPlayerのオーディオ・ドライバとして「alsa (0.1 - C-Media USB Headphone Set)」を選んだところ、USBスピーカーから正常に音が出るようになった。これにて一件落着と思ったのだが、これが排他的にしか使えない。他のアプリケーションはもちろん、SMPlayerの別インスタンスも使用できない。これは非常に不便であった。

なぜこんな現象が起きるのかと言うと、恐らく下図のような状況になっていたためだろう。

deviceサウンドカード等
ALSAハードウェアとのやりとり
SMPlayerPulseAudio複数のアプリからの入力を調整
Application 2Application 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に接続しても鳴らないの?という根本的な疑問は残る。ちょっとまとめると;

どれだけ当たっているか判らんが、とりあえず私の経験からの結論。

PulseAudioの設定

さて、問題は最初に戻るが、なぜオーディオドライバとしてPulseAudioを選んでも音が出なかったのだろうか? 結果的にハードウェア的な故障やデバイスドライバ・ファイルの破損などはなかったので、結論は一つ;設定が間違っていた。そして、間違った設定を修正する方法が判らなかった、と言うことに尽きる。

オーディオ機能の誤った設定の典型は;

@出力先が間違っている、
A音量が小さすぎる、

と言うもの。アプリケーションが正常動作しているように見えるのに音だけ出ない場合は、これらの可能性が高い。そして、私のケースでは@が根本問題だったような気がする。

出力先を誤るのは出力先が複数あるからで、そもそもUSBスピーカーを付けた事がトラブルを招いた−−と考えそうな所だが、実は、内蔵オーディオから全く音が出なかったからこそUSBスピーカーを使用したのであって、USBを元凶と見ることはできない。

じゃあ、内蔵オーディオしかない状態で、出力先をどう間違えるのかと言うと、実はHDオーディオには「ライン出力」「アナログ出力」「アナログヘッドフォン」という3系統の出力先がある。この選択を誤るとやっぱり音は出ない。最初に音が出なかった原因はこの辺りにあるのではないかと思っているが、今となっては確認はできない。

で、こうした問題を確認・修正するのが[PulseAudio音量調節]というプログラム。名前だけ見ると、単なるボリューム調節に見えてしまうのが盲点。Xfceの場合、メニューから[マルチメディア|PulseAudio音量調節]を起動して[再生(P)]を開く。図の赤く囲んだ部分をクリックすると、出力先を選ぶことができる。また、内蔵オーディオのように一つのデバイスに複数の出力先がある場合は、[出力装置(O)]の「内部オーディオ」の[ポート]の設定を変更する。

それにしても、USBスピーカー(C-Mediaチップ搭載)が[Audio Adapter アナログステレオ]なのだから、なかなか判りにくい。もう一つの選択肢が[内蔵オーディオ アナログステレオ]だったので、消去法的にこっちがUSBかと判断できるけれど…

OS/2@VirtualBoxのオーディオ出力

VirtualBoxのOS/2でも基本的な設定は同じ。「ホストオーディオドライバー」を「PulseAudio」とすれば良い。もちろん、オーディオ出力が有効になっていて、ゲスト側のドライバが正常に組み込まれていることが前提(私は「Intel HD」をUniaudioドライバで組み込んでいる)。

これで基本的に音は出るし、ホスト側のオーディオとの共有も可能になる。ただし、OS/2の場合はけっこうな確率で突如音が出なくなる。単に音が出なくなるだけでなく、動画の再生が止まってしまう。原因は不明。サスペンド状態から復帰すると音が出なくなっていた、というような事もあった。対処法は確立していないが、mplayerで「-ao」オプションをガチャガチャ弄ってたら正常に戻った。何かの拍子に初期化されたのだろうか…?

JACKオーディオ・サーバ

当初、PulseAudioの設定方法が(と言うより、PulseAudioの設定が原因だと)判らなかったので、ネットでいろいろ調べたところ、共有モードを実現するにはJackオーディオ・サーバをインストールすれば良い、という記事がいくつも見つかった。で、私も使用してみたのだが、あまり芳しい結果にはならなかった。

■JACKオーディオサーバのインストールと設定

Debian 8の場合、パケマネからJACKオーディオ・サーバ用のファイル(jackd、qjackctl)をインストールすれば良い…詳しい手順はあまり覚えていないが。

@予め、接続したいアプリを起動して、出力ドライバーを「jack」に変更しておく。
Aメインメニューから[マルチメディア|QjackCtl]を起動する。
B[設定]をクリックして出力デバイスを指定する。
C[接続]をクリックして、アプリ(出力ポート)とスピーカー(入力ポート)を選んで[接続]
 をクリックする。これで、アプリとスピーカーが線で結んで表示される。
D[開始]をクリックしてサーバを動作させる。

以上で完了。「出力ポート」と「入力ポート」の名称が何となくしっくりこないが…

■JACKの制限と問題点


【Linuxなんて大キライ目次】 【ホーム】