jackdをインストール
Jackの本体でバックグラウンドで起動させて使う。
$ sudo apt-get install jackd
pulseaudio-module-jackをインストール
pulseaudio-module-jackはPulse Audioの出力をAlsaではなくJackに切り替える。Jackを指定できるオーディオプレーヤーには必須ではない。
$ sudo apt-get install pulseaudio-module-jack
Pulse Audioの設定
$ sudo nano /etc/pulse/default.pa
末尾に下記の3行を追加。
load-module module-jack-sink
load-module module-jack-source
set-default-sink jack_out
Pulse Audioを再起動
$ pulseaudio -k
audaciousをインストール
音楽再生アプリ。再生デバイスとしてPulse Audioの他にJackを直接指定することもできる。
$ sudo apt-get install audacious
jackdを起動
オプション
- -R はリアルタイムモード
- -d alsa -d hw:0 で出力にAlsaを使用、2番目の-dはデバイスを指定。デバイスはalsaixserでF6を押すと確認できる。
- -r サンプリング周波数
- -p バッファサイズ
- -n バッファ数 (直結の場合は2、USBの場合は3が推奨らしい。大きいとレイテンシも増えると思う)
$ jackd -R -d alsa -d hw:0 -r 44100 -p 64 -n 2
ハードウェアは名前でも指定できる。cat /proc/asound/cards
でデバイス名を調べる。下記はPCM5102Aをhifiberryのドライバで使用している場合の例。[]内がドライバ名。
$ cat /proc/asound/cards
0 [fmidi ]: MIDI Gadget - f_midi
MIDI Gadget
1 [sndrpihifiberry]: RPi-simple - snd_rpi_hifiberry_dac
snd_rpi_hifiberry_dac
そこで得たデバイス名をhw:の後に指定する。
$ jackd -R -d alsa -d hw:sndrpihifiberry -r 44100 -p 64 -n 2
これでJackを使って複数のオーディオ再生アプリを低レイテインシで同時に使うことができる。それぞれのアプリでJackまたはPulse Audioを指定すれば良い。
なんか良くわからないが、誰かが勝手にデフォルト設定(48kHz, 1024 samples)でjackdを起動してるので、一旦それを殺してPulse Audioを再起動してから自分のシンセを起動してる。
#!/bin/sh
sudo killall jackd
jackd -R -d alsa -d hw:0 -r 44100 -p 64 -n 2 &
sleep 1
pulseaudio -k
MySynthApp <- 走らせたいシンセのプログラム
Bluetoothオーディオレシーバーとしても動作させる場合は下記が必要だった。OS起動時にjackdを起動してるやつが見つかればこんな処理はいらないかもしれない。。。sleepが2箇所入ってるが、これが無いと動かない場合があった。あと、ALSAで使うハードウェアの音量がMAXになってないとイヤなのでそれも追加した(amixerの部分)。
どうしてこんな風に動作するのかは正直わからないが、PulseAudioのALSAモジュール(module-alsa-sink)を入れるとPulseAudioがALSAのデフォルトになり、ハードウェア指定では操作できない。なので、volume-watcherではハードウェア指定なしにデフォルトのデバイス(PulseAudioのALSA Sink)の音量をいじっている。シンセはJackを通じてALSAに流しているのでその音量変化の影響を受けない。良くわからないが偶然に偶然が重なって奇跡的に動いているような感じ。
#!/bin/sh
killall volume-watcher.
killall jackd
jackd -R -d alsa -d hw:0 -r 44100 -p 64 -n 2 &
sleep 1
pulseaudio -k
sleep 1
pulseaudio -D
volume-watcher.py &
amixer -c0 cset numid=3 100%
MySynthApp <- 走らせたいシンセのプログラム