Linux PluseAudio で 複数スピーカーから同時に音を出す

概要

デスクトップ Linux のデフォルトの状態で複数のスピーカー、音声の出力先があった場合、 「出力先の選択はできる」が「複数の出力先を同時に使えない」という状況だった。 PluseAudio の module-combine-sink モジュールを読み込み、仮想的な出力先を作り pavucontrol でアプリケーションごとにある音声出力先を仮想的な出力先に切り替えることで、 複数の出力先で同時に音がなるようになった。

課題

  • ウーファーとイヤフォン両方で聞けるようになったので、概ね満足しているが bluetooth イヤフォンでの遅延が気になった。 現在はケーブルのイヤフォンを使って聞いている。
  • MIDI キーボードからの遅延が大きい。この用途の場合は Jack を試したい。

環境

  • Ubuntu Studio 21.04
  • Jack ではなく PluseAudio を利用

手順

$ pactl load-module module-combine-sink
$ pavucontrol

pavucontrol 起動後、複数スピーカーから出力したいアプリの「出力先」を、 「Simultaneous output to hoge , hogege , hogegege( サウンドカード名 )」に変更する。

ウーファー

pulseaudio --dump-conf でエラー確認できるが、 ~/.config/pulse/daemon.conf に

enable-lfe-remixing = yes

と追加していると

E: [pulseaudio] daemon-conf.c: [/home/kaoru/.config/pulse//daemon.conf:1] Deprecated option 'enable-lfe-remixing' found.
E: [pulseaudio] daemon-conf.c: [/home/kaoru/.config/pulse//daemon.conf:1] Please migrate to 'remixing-produce-lfe' and 'remixing-consume-lfe', set both to 'yes'.

というエラーが出た。古い設定のようなので、オススメされている設定 remixing-consume-lfe = yes を追加した。

また私は CM106 Live Sound Device Analog Surrond 7.1 として認識されているがウーファーのポートから音が出ていなかった。 このデバイスのウーファーのポートをを活かすには更に、

remixing-produce-lfe = yes

が必要だった。

この remixing-produce-lfe は lfe-crossover-freq の値によってローパスフィルタを行い、 ウーファーに必要な重低音だけを作り出す、とあるように読めるのだが、ローパスフィルターかかってるかな? この部分は私はうまくいかなかったので物理的なローパスフィルターを使っている。 ポートが一つ使えるようになったのは嬉しいけど、できればローパスフィルタ機能が使えるとデバイスが一個減って嬉しいのだができていない。

~/.config/pulse/daemon.conf は

default-sample-channels = 8 # 7.1chにする
remixing-consume-lfe = yes
remixing-produce-lfe = yes
lfe-crossover-freq = 50

に切り替えた。 少し話がずれるが、 ~/.config/pulse/default.pa はシステム標準の設定ファイルをインクルードする必要があるが、 ~/.config/pulse/daemon.conf ではその必要がない。

更に。

以前は複数の USB サウンドデバイスをつないで両方から音を出し、片方をローパスフィルタを経由してウーファーにつないでいる。

手元に(箱を捨ててしまって不明だが) CM106 Like Sound Device Analog Surround 7.1 で認識可能な USB デバイスがある。 これを 7.1ch で動作させて、複数の USB デバイスを使うことなく、ウーファーとスピーカー、イヤフォンでそれぞれ使いたい。

まず PulseAudio は最初はデフォルトで 2ch で設定するので、pavctrol の[設定]から [Analog Surround 7.1 出力 + アナログステレオ 入力]を選択した。

次に 7.1 を 5.1+2.0 に分割 を参考にしつつ、7.1ch を分割した。

下記のようになる。オプション( 参考 )は

オプション 意味
module-remap-sink 出力先(sink)を再構成する
shink_name sink 名
sink_properties sink のプロパティ、表示されるデバイス名を変える。pavucontrol で確認するとき便利
remix 仮想ストリームのリミックスを許可します。奇妙な理由でデフォルトは「yes」ですが、おそらくこれを「no」に設定する必要があります(機械翻訳)
master 元になるデバイス
channels チャンネル数、master_channel_map と channel_map でも分かるがチャンネル数
channel_map ソースのチャンネル名、master_channel_map と同じ個数になる、ここでの列挙の順番で remap されるようだ。私は揃えた。
  • master で指定するデバイス名は pacmd list-sinks | grep -e 'name:' -e 'index:' で確認できる。
  • どのようなチャンネル名があるかは pacmd list-sinks で確認できる。
  • 下記の例は side-left,side-right だけ切り出して、Stereo という名前で sink を作った。
  • module-combine-sink sink_name=combined slaves=Stereo,Surround で複数の sink をまとめないと「両方に同じ音がでない」
load-module module-remap-sink sink_name=Surround sink_properties="device.description='Surround'" remix=no master=alsa_output.usb-0d8c_USB_Sound_Device-00.analog-surround-71 channels=6 master_channel_map=front-left,front-right,rear-left,rear-right,front-center,lfe channel_map=front-left,front-right,rear-left,rear-right,front-center,lfe
load-module module-remap-sink sink_name=Stereo sink_properties="device.description='Stereo'" remix=no master=alsa_output.usb-0d8c_USB_Sound_Device-00.analog-surround-71 channels=2 master_channel_map=side-left,side-right channel_map=front-left,front-right
load-module module-combine-sink sink_name=combined slaves=Stereo,Surround

現在の設定

~/.config/pulse/daemon.conf
default-sample-channels = 8
remixing-consume-lfe = yes
remixing-produce-lfe = yes
lfe-crossover-freq = 30
~/.config/pulse/default.pa
.include /etc/pulse/default.pa

load-module module-equalizer-sink
load-module module-dbus-protocol

load-module module-remap-sink sink_name=Surround sink_properties="device.description='Surround'" remix=no master=alsa_output.usb-0d8c_USB_Sound_Device-00.analog-surround-71 channels=6 master_channel_map=front-left,front-right,rear-left,rear-right,front-center,lfe channel_map=front-left,front-right,rear-left,rear-right,front-center,lfe
load-module module-remap-sink sink_name=Stereo sink_properties="device.description='Stereo'" remix=no master=alsa_output.usb-0d8c_USB_Sound_Device-00.analog-surround-71 channels=2 master_channel_map=side-left,side-right channel_map=front-left,front-right

load-module module-combine-sink sink_name=combined-stereo-surround slaves=Stereo,Surround

参考

Ubuntu で1つの音声を2系統の音声出力から同時出力する方法はありますか? ここの紹介でできるようになった。