Skip to content

Instantly share code, notes, and snippets.

@ll0s0ll
Created March 25, 2018 12:48
Show Gist options
  • Save ll0s0ll/5425aedbb3f2bb3b682ae674837d98c8 to your computer and use it in GitHub Desktop.
Save ll0s0ll/5425aedbb3f2bb3b682ae674837d98c8 to your computer and use it in GitHub Desktop.
ALSAから出力された音声をpifmで再生する

ALSAから出力された音声をpifmで再生する

先日、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で再生するにて公開していたものを移動したものです。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment