いつからだか忘れたけど 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 で音が鳴らない問題はだいたい解決できるはず。