いつからだか忘れたけど Arch Linux ARM では /boot/config.txt
に gpu_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 Piの HDMIやイヤホンジャックから音は鳴らないわけですね。
これを /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=3
は values=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で音が鳴らない問題はだいたい解決できるはず。