mattintosh note

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

2024-06-05: 現在ホビー関連の記事を hobby.mattintosh-note.jp に移行しています。現在掲載されている画像と今後掲載される画像は一部の環境から閲覧できなくなります。

とりあえずこれだけ知っておけばなんとかなる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 で音が鳴らない問題はだいたい解決できるはず。