mattintosh note

どこかのエンジニアモドキの備忘録

とりあえずこれだけ知っておけばなんとかなるRaspberry Piのオーディオ設定

いつからだか忘れたけど Arch Linux ARM では /boot/config.txtgpu_mem=64 以外何も書かれなくなった。(RPi2 と RPi3 で設定が異なるからだろうか)

んで、音楽を再生しても音が鳴らないことがしばしば。いい加減この辺の設定ちゃんと調べないとなと思ったので調べた。

/boot/config.txt に dtparam=audio=on が無いとそもそも音が鳴らない

サウンドカードを調べる方法は色々あるけど、わかりやすいのは aplay -l

$ aplay -l
aplay: device_list:268: no soundcards found...

サウンドカードが無いと言われます。

aplay -L も見てみます。

$ aplay -L
null
    Discard all samples (playback) or generate zero samples (capture)
pulse
    PulseAudio Sound Server
default
    Default ALSA Output (currently PulseAudio Sound Server)

PulseAudio はあるので PULSE_SERVER 環境変数を使えば他のマシンで音を鳴らすことはできます。が、コレジャナイ。

さて、では dtparam=audio=on って何さ?っていうのは /opt/vc/bin/dtparam で調べることができる。

/opt/vc/bin/dtparam -h audio
audio                   Set to "on" to enable the onboard ALSA audio
                        interface (default "off")

on にするとオンボードALSA オーディオインターフェイスが有効になるよ!」

つまり dtparam=audio=on を設定しない限り、Raspberry PiHDMI やイヤホンジャックから音は鳴らないわけですね。

これを /boot/config.txt に書いて再起動します。

再び aplay -l を見てみると ALSA が使えるようになっているのがわかります。

$ 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 0: ALSA [bcm2835 ALSA], device 1: bcm2835 ALSA [bcm2835 IEC958/HDMI]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
$ aplay -L
null
    Discard all samples (playback) or generate zero samples (capture)
pulse
    PulseAudio Sound Server
default
    Default ALSA Output (currently PulseAudio Sound Server)
sysdefault:CARD=ALSA
    bcm2835 ALSA, bcm2835 ALSA
    Default Audio Device

この辺の設定は /etc/asound.conf に書いてある。

amixer cset numid=3 って何さ?

「音が鳴らない時にはこれを試してごらんよ!」と、よく言われる amixer cset numid=3 1 とか amixer cset numid=3 2 というコマンド。

これ、単体でみるとよくわからんのだが、amixer で色々試してみるとわかる。

$ amixer controls
numid=4,iface=MIXER,name='Master Playback Switch'
numid=3,iface=MIXER,name='Master Playback Volume'
numid=2,iface=MIXER,name='Capture Switch'
numid=1,iface=MIXER,name='Capture Volume'

ふむ。numid=3 というのは Master Playback Volume らしい。

ん?なんか違わね?

実は PulseAudio を入れている場合、amixer では PulseAudio のコントロールが出てきてしまう。例えば PulseAudio を使っていない root の場合だと、

$ sudo amixer controls
numid=3,iface=MIXER,name='PCM Playback Route'
numid=2,iface=MIXER,name='PCM Playback Switch'
numid=1,iface=MIXER,name='PCM Playback Volume'
numid=5,iface=PCM,name='IEC958 Playback Con Mask'
numid=4,iface=PCM,name='IEC958 Playback Default'

となり、numid=3 は PCM Playback Route となる。つまり、よく見かける cset numid=3 というのはこの PCM Playback Route のことを指している。

PulseAudio がインストールされており、なおかつ一般ユーザーで amixer cset numid=3 1 とかやると単にボリュームが変わる可能性が高い。ちなみ Switch 系はミュート切り替え用。

では一般ユーザーが PCM Playback Route を操作するにはどうするのか?

それはカードを正しく指定してあげるだけ。

$ amixer -c ALSA controls
numid=3,iface=MIXER,name='PCM Playback Route'
numid=2,iface=MIXER,name='PCM Playback Switch'
numid=1,iface=MIXER,name='PCM Playback Volume'
numid=5,iface=PCM,name='IEC958 Playback Con Mask'
numid=4,iface=PCM,name='IEC958 Playback Default'

さらに amixer contents を見てみる。

$ amixer -c ALSA contents
numid=3,iface=MIXER,name='PCM Playback Route'
  ; type=INTEGER,access=rw------,values=1,min=0,max=2,step=0
  : values=1
numid=2,iface=MIXER,name='PCM Playback Switch'
  ; type=BOOLEAN,access=rw------,values=1
  : values=on
numid=1,iface=MIXER,name='PCM Playback Volume'
  ; type=INTEGER,access=rw---R--,values=1,min=-10239,max=400,step=0
  : values=399
  | dBscale-min=-102.39dB,step=0.01dB,mute=1
numid=5,iface=PCM,name='IEC958 Playback Con Mask'
  ; type=IEC958,access=r-------,values=1
  : values=[AES0=0x02 AES1=0x00 AES2=0x00 AES3=0x00]
numid=4,iface=PCM,name='IEC958 Playback Default'
  ; type=IEC958,access=rw------,values=1
  : values=[AES0=0x00 AES1=0x00 AES2=0x00 AES3=0x00]

numid=3values=1 になっているため、アナログオーディオが有効になっている状態。これを HDMI に切り替えるには、

$ amixer -c ALSA cset numid=3 2

とすればよい。

ボリュームやスイッチの操作は以下のように行うことができる。ボリュームに負の値を指定する場合はオプションとして誤認されないよう -- を付ける必要がある。

$ amixer --card ALSA cset numid=1 -- -10239 # Mute
$ amixer --card ALSA cset numid=1 400       # Max
$ amixer --card ALSA cset numid=1 mute      # Mute
$ amixer --card ALSA cset numid=1 100%      # Max
$ amixer --card ALSA cset numid=2 0         # Off (Mute)
$ amixer --card ALSA cset numid=2 1         # On

PulseAudio の場合はボリュームの指定方法が少し異なる。

$ amixer contents
numid=4,iface=MIXER,name='Master Playback Switch'
  ; type=BOOLEAN,access=rw------,values=1
  : values=on
numid=3,iface=MIXER,name='Master Playback Volume'
  ; type=INTEGER,access=rw------,values=2,min=0,max=65536,step=1
  : values=65536,65536
numid=2,iface=MIXER,name='Capture Switch'
  ; type=BOOLEAN,access=rw------,values=1
  : values=on
numid=1,iface=MIXER,name='Capture Volume'
  ; type=INTEGER,access=rw------,values=2,min=0,max=65536,step=1
  : values=65536,65536
$ amixer cset numid=3 0       # Mute
$ amixer cset numid=3 65536   # Max
$ amixer cset numid=3 65536,0 # Left max, Right mute

PulseAudio の場合は pactl set-sink-volume 0 50% などでもボリューム変更ができる。(alsamixer を使った方が楽)

この辺を覚えておけば Raspberry Pi で音が鳴らない問題はだいたい解決できるはず。