先日、Raspberry Piとpifmを使って、なんちゃってFMラジオ放送局を作りましたが、ALSAの音声をpifmで再生できたら、もっと面白いことができそうだと思い、調べてみました。
調べてみると同じようなことを考えている人がいました。
Announce: Squeezelite – a small headless squeezeplay emulator for linux (alsa only) – Page 165
Squeezeliteはネットラジオのストリーミングプログラムのようですが、質問者は、その音声をpifmで流そうと考えているようです。結果的に、ALSAの音声をpifmに流す、という方法で解決されていますので、それを参考にやってみます。
まず、ループバックデバイスを作ります。このループバックデバイスにALSAの音声を流し込み、ループバックされたものをpifmに流し込む、という流れです。ループバックデバイスを作るには、snd-aloopモジュールをロードします。’Operation not permitted’とエラーが出た場合は、管理者権限で実行してください。
$ modprobe snd-aloop pcm_substreams=2
ループバックデバイスが作成されたかは、’aplay -l’ で確認できます。以下のようにLoopbackの項目が増えています。
$ aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: ALSA [bcm2835 ALSA], device 0: bcm2835 ALSA [bcm2835 ALSA]
Subdevices: 8/8
Subdevice #0: subdevice #0
Subdevice #1: subdevice #1
Subdevice #2: subdevice #2
Subdevice #3: subdevice #3
Subdevice #4: subdevice #4
Subdevice #5: subdevice #5
Subdevice #6: subdevice #6
Subdevice #7: subdevice #7
card 1: Loopback [Loopback], device 0: Loopback PCM [Loopback PCM]
Subdevices: 2/2
Subdevice #0: subdevice #0
Subdevice #1: subdevice #1
card 1: Loopback [Loopback], device 1: Loopback PCM [Loopback PCM]
Subdevices: 2/2
Subdevice #0: subdevice #0
Subdevice #1: subdevice #1
作成したループバックデバイスを指定して、音声ファイルを再生します。
$ aplay -D plughw:Loopback,0,0 sound.wav
ループバックデバイスを通して出力されたものを、soXを使いpifmに適したフォーマットに変換しつつ、pifmに流し込めば、ラジオから音声が聞こえてきます。
$ sox -t alsa hw:Loopback,1,0 -t wav -b 16 -c 1 -r 22050 - | sudo ./pifm - 89.9
これでは、直接pifmで再生するのと変わりませんので、.asoundrcでデフォルトの出力先をループバックデバイスに変更します。ffmpegのサイトが参考になります。
# .asoundrc
pcm.!default { type plug slave.pcm "hw:Loopback,0,0" }
以上で、ALSAの音声をpifmで再生できるようになります。
$ aplay sound.wav
しかし、複数のプログラムで同時に音声を再生することができません。
ここで行き詰まってしまいましたが、上記の.asoundrc
の設定が良くなかったようです。上記の設定では、ミキサーを飛ばしてしまうようです。下記BBSに.asoundrc
の例を上げてくれている方がいました。
[SOLVED] Software mixing with ALSA / Multimedia and Games / Arch Linux Forums
リンクされていた.asoundrc
を参考に、下記のように書き直したところ、同時に複数の音声を再生できるようになりました。
pcm.dmixed {
type asym
playback.pcm {
type dmix
ipc_key_add_uid true
ipc_key 5678293
ipc_perm 0660
ipc_gid audio
slave {
channels 6
pcm {
format S16_LE
rate 48000
nonblock true
type hw
card Loopback
device 0
subdevice 0
}
period_size 1024
buffer_size 8192
}
}
capture.pcm "dsnoop";
}
pcm.!default {
type plug
slave.pcm "dmixed";
}
この投稿は、ワタシのメモ ALSAから出力された音声をpifmで再生するにて公開していたものを移動したものです。