RaspberryPiでUSBスピーカーから音を鳴らす

RaspberryPiで音を鳴らす

こいつも結構毎回設定しているのでメモ。以下ののコマンドを実行してCONFIGを起動。コマンドラインでもできるけどこっちのほうが簡単。

出力先の設定

~ $ sudo raspi-config

メニューが表示されるので、

f:id:ueponx:20160409161558j:plain

【(8)Advanced Options】を選択。

f:id:ueponx:20160409161606j:plain

更に【A9 Audio】を選択。

f:id:ueponx:20160409161611j:plain

すると

f:id:ueponx:20160409161618j:plain

音声出力先の設定になります。 【Auto】にすると接続されているなかでHDMI→HeadPhoneの順で接続を確認し出力を行います。 HDMIで出力を行うのが前提であれば【Auto】でよいですが、外部スピーカーなどを使う場合には 【Force 3.5mm('headphone')jack】を選択するのがよいでしょう。

出力のテスト

設定が終わったら以下のコマンドでテストします。

~ $ speaker-test -t sine -f 1000

1kHzの正弦波を出力してくれるので意図したところからピーっと音が鳴るか確認します。

USBスピーカーを接続してみる

基本的には上で接続するパターンがほとんどなのですが、家にUSBスピーカーがあったのでそれも接続してみました。 USBデバイスなので自動認識するとは思うのですが・・・

初期状態は以下のようになっているのですが、

~ $ sudo 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 004: ID 05e3:0608 Genesys Logic, Inc. USB-2.0 4-Port HUB
Bus 001 Device 005: ID 2019:1201 PLANEX
Bus 001 Device 006: ID 0a12:0001 Cambridge Silicon Radio, Ltd Bluetooth Dongle (HCI mode)

USBスピーカーを接続すると以下のようになります。

~ $ sudo 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 004: ID 05e3:0608 Genesys Logic, Inc. USB-2.0 4-Port HUB
Bus 001 Device 007: ID 0c76:1619 JMTek, LLC.
Bus 001 Device 005: ID 2019:1201 PLANEX
Bus 001 Device 006: ID 0a12:0001 Cambridge Silicon Radio, Ltd Bluetooth Dongle (HCI mode)

Bus 001 Device 007: ID 0c76:1619 JMTek, LLC.が追加されているのがわかります。

aplayでもチェックしてみます。

~ $ aplay -L
null
    Discard all samples (playback) or generate zero samples (capture)
default:CARD=ALSA
    bcm2835 ALSA, bcm2835 ALSA
    Default Audio Device
sysdefault:CARD=ALSA
    bcm2835 ALSA, bcm2835 ALSA
    Default Audio Device

USBスピーカーを接続すると以下のように変化して、USB Audioが追加していることがわかります。

~ $ aplay -L
null
    Discard all samples (playback) or generate zero samples (capture)
default:CARD=ALSA
    bcm2835 ALSA, bcm2835 ALSA
    Default Audio Device
sysdefault:CARD=ALSA
    bcm2835 ALSA, bcm2835 ALSA
    Default Audio Device
default:CARD=Device
    USB PnP Audio Device, USB Audio
    Default Audio Device
sysdefault:CARD=Device
    USB PnP Audio Device, USB Audio
    Default Audio Device
front:CARD=Device,DEV=0
    USB PnP Audio Device, USB Audio
    Front speakers
surround40:CARD=Device,DEV=0
    USB PnP Audio Device, USB Audio
    4.0 Surround output to Front and Rear speakers
surround41:CARD=Device,DEV=0
    USB PnP Audio Device, USB Audio
    4.1 Surround output to Front, Rear and Subwoofer speakers
surround50:CARD=Device,DEV=0
    USB PnP Audio Device, USB Audio
    5.0 Surround output to Front, Center and Rear speakers
surround51:CARD=Device,DEV=0
    USB PnP Audio Device, USB Audio
    5.1 Surround output to Front, Center, Rear and Subwoofer speakers
surround71:CARD=Device,DEV=0
    USB PnP Audio Device, USB Audio
    7.1 Surround output to Front, Center, Side, Rear and Woofer speakers
iec958:CARD=Device,DEV=0
    USB PnP Audio Device, USB Audio
    IEC958 (S/PDIF) Digital Audio Output

あとは出力をチェックするのですが…

~ $ aplay /usr/share/sounds/alsa/Front_Center.wav

音声は出力されません。(先ほど設定したデバイスから出力されます。)

続・設定

音声が出なかったのはサウンドデバイスの優先順位がUSBデバイスのほうが低かったからです。この優先順位をUSBスピーカーを優先(デフォルト設定)にしなければいけません。 USBスピーカーでの出力有線設定はalsa側で行います。

ここからはOSによって設定がかわります。

Wheezyの場合

~ $ sudo vi /etc/modprorbe.d/alsa-base.conf

このファイルを開き以下の部分をコメントアウトします。

options snd-usb-audio index=-2

#options snd-usb-audio index=-2

または

options snd-usb-audio index=0

-2はありえない値のため設定がされないようです。設定部分を0にする設定か、あるいは設定そのものをコメントアウトします。 その後、一度alsaのモジュールをunloadして再度loadし直します。

~ $ sudo alsa unload
Unloading ALSA sound driver modules: snd-usb-audio snd-usbmidi-lib snd-hwdep snd-seq-midi snd-seq-midi-event snd-rawmidi snd-bcm2835 snd-pcm snd-seq snd-seq-device snd-timer.
~ $ sudo modprobe snd_usb_audio
~ $ sudo modprobe snd_bcm2835
~ $ cat /proc/asound/cards
 0 [Device         ]: USB-Audio - USB PnP Audio Device
                      USB PnP Audio Device at usb-bcm2708_usb-1.3, full speed
 1 [ALSA           ]: bcm2835 - bcm2835 ALSA
                      bcm2835 ALSA

それでもスピーカーから音がなりません・・・予想ですがドライバが対応していないのかもしれません。

使用したのはこのスピーカーでした↓

ネットの情報ではこちら↓は行けるみたいなんすけどね。残念。追って実験してみようと思います。

Jessieの場合

/etc/modprorbe.d/alsa-base.confを編集すればいいんだろうなあと思ったのですが、該当のファイルがありません。alsaのバージョンがかわったのでしょう。しかし、設定の情報がほとんどなくこまっていたのですが以下のブログで情報があったので実験してみました。

【参考】 www.tapun.net

/usr/share/alsa/alsa.conf を編集します。

~ $ sudo vi /usr/share/alsa/alsa.conf

ファイル内に以下の部分があるのを確認します。

…中略…
@hooks [
   {
      func load
      files [
         {
            @func concat
            strings [
               { @func datadir }
               "/alsa.conf.d/"
            ]
         }
         "/etc/asound.conf"
         "~/.asoundrc"
      ]
      errors false
   }
]
…中略…
defaults.ctl.card 0
defaults.pcm.card 0
…中略…

これを以下のように編集。

…中略…
@hooks [
   {
      func load
      files [
         {
            @func concat
            strings [
               { @func datadir }
               "/alsa.conf.d/"
            ]
         }
         "/etc/asound.conf"
#         "~/.asoundrc"
      ]
      errors false
   }
]
…中略…
defaults.ctl.card 1
defaults.pcm.card 1
…中略…

編集後に再起動します。

~ $ sudo reboot

起動したら音声が出力されるかテストしてみると…

~ $ aplay /usr/share/sounds/alsa/Front_Center.wav

無事に再生されました。Wheezyで動作しなかったスピーカーも動くようになったのでラッキーでした。

これでUSBスピーカーで音声を鳴らす設定は完了です。 余計なケーブルがないのでUSBスピーカーは予想以上に便利ですがRaspberryPiの電源が弱いとリブートすることもあるそうなので電源には注意してください。

/* -----codeの行番号----- */