Raspberry Piでオーディオデバイスが期待通りに動作しなかったときに確認したnつのこと

Raspberry PiをAirPlay対応の音楽再生機にするために[Volumio](https://volumio.org/)をインストールしましたが、音が鳴ったり鳴らなかったりで動作が安定せず、少し悩みました。
その際に試したこのについてのメモです。
あまり整理できていませんが、何かの参考になれば。

## 1. ハードウェア編

### 1.1. USB電源

動作が不安定な時にまずは疑いたいのは電源。1.5A以上、できれば2.0A以上を供給できるUSB電源に交換してみましょう。
[Raspberry Pi 2 Model B](http://www.amazon.co.jp/exec/obidos/ASIN/B00T356SFO/x7edimv35x-22/)のような新しいモデルでは問題になることが減りましたが、今回使用したのは[Raspberry Pi Model B Rev.2](http://www.amazon.co.jp/exec/obidos/ASIN/B00CBWMXVE/x7edimv35x-22/)という少し古いモデル。古いモデルほど安定した、余裕のある電源が必要です。

### 1.2. USBハブ

原因ははっきりしませんが、今回はUSBハブを使うことでより安定する傾向にありました。
なお、後述するUSB-DACは外部から電源を供給するタイプであり、バスパワードではありません。
外部電源タイプのUSBハブをお持ちであれば、USBオーディオデバイスとRaspberry Piの間に挟んでみると、もしかしたら問題が解決するかもしれません。

### 1.3. USB-DAC / USBスピーカー

今回、利用したかったのは[FOSTEX PC200USB-HR](http://www.amazon.co.jp/exec/obidos/ASIN/B016MLQ2VG/x7edimv35x-22/)というハイレゾ対応のUSB-DAC（Digital to Analog Converter）ですが、MacBook Proに接続すると正常に鳴るのに、Raspberry Piに接続すると鳴らずに悩みました。（これはおそらく、後述する`plughw`が関連するかと）

当たり前ですが、原因の切り分けのために別のマシン、オーディオデバイスがあると便利です。
今回は、USB-DACの他に[Olasonic TW-S7](http://www.amazon.co.jp/exec/obidos/ASIN/B0039YOHJE/x7edimv35x-22/)を使ってみましたが、こちらは何の問題も無く鳴りました。

### 1.4. ケーブル抜き差し

これもありがちな話ですが、ケーブルを抜き差しするだけでオーディオデバイスを認識することがありました。
オーディオデバイス側か、あるいはデバイスドライバ側の作りが甘いのでしょう・・・。

## 2. ソフトウェア編

### 2.1. lsusb / dmesg

オーディオデバイスがUSB接続であれば、`lsusb`コマンドを使って該当のオーディオデバイスが認識されているかどうか確認してみましょう。
`dmesg`も合わせて確認するのが良いでしょう。何かしらエラーメッセージが出力されているかもしれません。

```
root@volumio:~# lsusb
Bus 001 Device 002: ID 0424:9512 Standard Microsystems Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp.
Bus 001 Device 005: ID 1019:0402 Elitegroup Computer Systems (ECS)
Bus 001 Device 004: ID 08bb:2704 Texas Instruments Japan

root@volumio:~# dmesg
[  212.617008] usb 1-1.3.4: new full-speed USB device number 6 using dwc_otg
[  212.780441] usb 1-1.3.4: config 1 has an invalid interface number: 3 but max is 2
[  212.805776] usb 1-1.3.4: config 1 has an invalid interface number: 3 but max is 2
[  212.831149] usb 1-1.3.4: config 1 has an invalid interface number: 3 but max is 2
[  212.856795] usb 1-1.3.4: config 1 has no interface number 2
[  212.902453] usb 1-1.3.4: New USB device found, idVendor=1019, idProduct=0402
[  212.927542] usb 1-1.3.4: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[  212.953259] usb 1-1.3.4: Product: PERSONAL AMPLIFIER
[  212.976458] usb 1-1.3.4: Manufacturer: FOSTER Elec. CO., LTD
[  213.039241] input: FOSTER Elec. CO., LTD PERSONAL AMPLIFIER as /devices/platform/bcm2708_usb/usb1/1-1/1-1.3/1-1.3.4/1-1.3.4:1.0/0003:1019:0402.0001/input/input0
[  213.128294] hid-generic 0003:1019:0402.0001: input,hidraw0: USB HID v1.00 Device [FOSTER Elec. CO., LTD PERSONAL AMPLIFIER] on usb-bcm2708_usb-1.3.4/input0
[  213.391117] snd_usb_audio: unknown parameter 'nrpacks' ignored
[  213.457577] usbcore: registered new interface driver snd-usb-audio
```

### 2.2. proc

ALSA（Advanced Linux Sound Architecture）レベルでオーディオデバイス（ALSAレイヤーでは「サウンドカード」）が認識されているかどうか確認してみましょう。

`/proc/asound/cards`でサウンドカードの一覧を確認することができます。

```
root@volumio:~# cat /proc/asound/cards
 0 [DAC            ]: USB-Audio - USB Audio DAC
                      Burr-Brown from TI USB Audio DAC at usb-bcm2708_usb-1.3, full speed
 1 [ALSA           ]: bcm2835 - bcm2835 ALSA
                      bcm2835 ALSA
 2 [AMPLIFIER      ]: USB-Audio - PERSONAL AMPLIFIER
                      FOSTER Elec. CO., LTD PERSONAL AMPLIFIER at usb-bcm2708_usb-1.2, full speed
```

`/proc/asound/card0/stream0`でサウンドカードのストリームの詳細を確認することができます。`card0`、`stream0`の`0`はデバイス番号、ストリーム番号です。
再生中の場合、`Status: Stop`の箇所が`Status: Running`となり、出力中のサンプリング周波数などの情報が出力されます。

```
root@volumio:~# cat /proc/asound/card0/stream0
FOSTER Elec. CO., LTD PERSONAL AMPLIFIER at usb-bcm2708_usb-1.3, full speed : USB Audio

Playback:
  Status: Stop
  Interface 3
    Altset 1
    Format: S16_LE
    Channels: 2
    Endpoint: 3 OUT (ADAPTIVE)
    Rates: 96000, 88200, 48000, 44100, 32000
  Interface 3
    Altset 2
    Format: S24_3LE
    Channels: 2
    Endpoint: 3 OUT (ADAPTIVE)
    Rates: 96000, 88200, 48000, 44100, 32000
```

### 2.3. alsamixer

オーディオ関係でありがちなのは「ボリュームが絞られていて音が鳴らない」。`alsamixer`コマンドでボリュームを確認、設定しましょう。
なお、複数のオーディオデバイスが存在する場合、F6キーでオーディオデバイスを切り替えることができます。

### 2.4. aplay

シンプルなオーディオプレーヤーで音が鳴るかどうか確認してみましょう。
例えば`aplay`コマンド。このコマンドでは`-D`オプションでオーディオデバイス、ストリームを指定できます。

```
aplay /usr/share/sounds/alsa/Front_Left.wav
aplay -D hw:1 /usr/share/sounds/alsa/Front_Left.wav
aplay -D hw:2,0 /usr/share/sounds/alsa/Front_Left.wav
aplay -D plughw:2,0 /usr/share/sounds/alsa/Front_Left.wav
```

FOSTEX PC200USB-HRの場合、`hw`では鳴らず、`plughw`であれば鳴りました。

### 2.5. shairport-sync

Volumio 1系では`-sync`の付かない`shairport`が使われています。
これは時間の同期を行わないAirPlayエミュレータのため、動画の音声をAirPlay経由で再生すると、音声が遅延して使い物になりません。
開発中のVolumio 2系であれば`shairport-sync`が使われているようですが、Linuxディストリビューションとしてはまだ使い物になるレベルではありませんでした。（評価したのはVolumio 2 Alpha 4）
別途、`shairport-sync`をビルド、インストールすることで、音声と映像が同期された状態で再生できるようになりました。これについては別途[記事](http://qiita.com/yuyakato/items/600f499cf0610bfc1a16)を書きました。

## 関連記事

- [Raspberry Piにshairport-syncをインストールする - Qiita](http://qiita.com/yuyakato/items/600f499cf0610bfc1a16)
- [Raspberry Piの内蔵オーディオデバイスを無効化する方法 - Qiita](http://qiita.com/yuyakato/items/b617340b0092f30a6873)