2017年10月4日水曜日

Raspberry Pi 3にUSBスピーカーをつなぐ

今回の環境は下記のとおりです。
  • Raspberry Pi 3
  • Raspbian GNU/Linux 9.1 (stretch)
また、今回登場するスピーカーは、サンワサプライのMM-SPU8BKというスピーカーです。amazonで900円でした。(安い!)
値段の割には見た目が良く評価もそこそこなので、例え繋がらなくてもまぁいいかと思って、ダメもとで買ってみました。



デフォルトだと、HDMIに接続されたテレビから音が出てしまうので、
何とかして、USB接続のスピーカーから音を出してみます。

まずは、aplay -lでデバイスの状態を確認します。

カード 0: ALSA [bcm2835 ALSA], デバイス 0: bcm2835 ALSA [bcm2835 ALSA]
  サブデバイス: 8/8
  サブデバイス #0: subdevice #0
  サブデバイス #1: subdevice #1
  サブデバイス #2: subdevice #2
  サブデバイス #3: subdevice #3
  サブデバイス #4: subdevice #4
  サブデバイス #5: subdevice #5
  サブデバイス #6: subdevice #6
  サブデバイス #7: subdevice #7
カード 0: ALSA [bcm2835 ALSA], デバイス 1: bcm2835 ALSA [bcm2835 IEC958/HDMI]
  サブデバイス: 1/1
  サブデバイス #0: subdevice #0

次に、USBスピーカーを接続してからaplay -lを実行してみます。

**** ハードウェアデバイス PLAYBACK のリスト ****
カード 0: ALSA [bcm2835 ALSA], デバイス 0: bcm2835 ALSA [bcm2835 ALSA]
  サブデバイス: 8/8
  サブデバイス #0: subdevice #0
  サブデバイス #1: subdevice #1
  サブデバイス #2: subdevice #2
  サブデバイス #3: subdevice #3
  サブデバイス #4: subdevice #4
  サブデバイス #5: subdevice #5
  サブデバイス #6: subdevice #6
  サブデバイス #7: subdevice #7
カード 0: ALSA [bcm2835 ALSA], デバイス 1: bcm2835 ALSA [bcm2835 IEC958/HDMI]
  サブデバイス: 1/1
  サブデバイス #0: subdevice #0
カード 1: MicroII [Audio Advantage MicroII], デバイス 0: USB Audio [USB Audio]
  サブデバイス: 1/1
  サブデバイス #0: subdevice #0

無事認識しているようで、新たに増えた部分が今回接続したスピーカーということになります。

カード番号が1
デバイス番号が0

なので、aplayの引数に-Dでカードとデバイスを指定してあげれば問題ない・・・と思ったんだけど・・・。

aplay -D hw:1,0 test.wav
再生中 WAVE 'test.wav' : Signed 16 bit Little Endian, レート 48000 Hz, モノラル
aplay: set_params:1305: チャネル数が使用不可能


はいエラー。しかもチャンネル数ってなによ。

この問題を解決するのには、結構時間がかかってしまったけど、下記のようにplugを付ければモノラル音声をステレオに変換して再生してくれるということらしい。要するに明示的に指定しないと、モノラル(1ch)からステレオ(2ch)には、変更してくれないということみたい。

aplay -D plughw:1,0 test.wav

これで、「aplay test.wav」 で HDMI から音声が出力され、「aplay -D plughw:1,0 test.wav」でUSBスピーカーから音声が出力される。

でも、やりたいことはこれじゃない。
デフォルトをスピーカー、指定した時だけHDMI側から再生したいのです。

色々調べると、まず出てくるのは、「/usr/share/alsa/alsa.conf」を直接書き換えるやり方。
大体下記の変更を行って再起動すれば反映されます!のようなドキュメント。
確かにこれをやればできる・・・。できるんだけど、asoundrcを無効にしてしまうのは、ちょっと違うんじゃないかなぁと・・・。

#         "~/.asoundrc"

defaults.ctl.card 1 # 録音するデバイスを指定
defaults.pcm.card 1 # 再生するデバイスを指定


本来は、再起動なんて必要なくてasoundrcを自動的に読み込んでデバイス選択してくれるものなんじゃないのか??

で、色々試したところ下記の内容をasoundrcに書くことで、希望通りデフォルトをスピーカー側にすることに成功しました。

pcm.!default {
    type plug
    slave.pcm "dmixer"
}

ctl.!default {
    type hw
    card 0
    device 0
}

pcm.dmixer {
    ipc_key 1024
    type dmix
    slave {
        pcm "hw:1,0"
    }
}

結構時間掛かっちゃったなー。
ということで一応メモ。

今回、参考にさせていただいたサイト。
この文章は、後で少し校正させていただきます。

0 件のコメント:

コメントを投稿