Raspberry PiからUSBスピーカー経由で、Javaのプログラム経由で音を流す。

HDMIに接続しているRaspberry Piは、音声出力の優先順位がHDMIになっているため、Javaから音を流すプログラムを書いた場合、HDMI接続先のデバイスから音が出ます。家の環境は、HDMIの接続先はテレビになっているので、テレビにRaspberry Pieの画面を出していないと音が出ない状態になってしまいます。

今回Javaプログラムから、定時でチャイムをUSBスピーカーから流すプログラムを組みたいと思っていて、Raspberry Piに接続したUSB スピーカーから音を出せるように、色々思考錯誤しました。

基本的には、以下のページに記載している内容を参考にさせていただいた結果、問題なくテレビのHDMI経由で音が鳴りました。

Javaでmp3を再生する(コード編) - 技術系備忘録
RaspberryPiでUSBスピーカーから音を鳴らす - uepon日々の備忘録

今回は、プログラムから流す音のみをUSBスピーカ側に流したいと考えていたので、Javaソースコードを以下のように追加しました。

// 以下、追加したソース
Mixer.Info[] mixerInfo = AudioSystem.getMixerInfo();
Mixer.Info finalMixerInfo = null;
for (Mixer.Info aMixerInfo : mixerInfo) {
if (aMixerInfo.getName().contains("MicroII")&&!aMixerInfo.getName().contains("Port")) finalMixerInfo=aMixerInfo;
};
Mixer mixer=AudioSystem.getMixer(finalMixerInfo);
line = (SourceDataLine) mixer.getLine(info);
// ここまで追加したソース

// ラインを取得
//line = (SourceDataLine) AudioSystem.getLine (info);
line.open();

上記の赤字については、接続したUSBスピーカーによるので、以下のコマンドで調べて合わせます。

$ cat /proc/asound/cards
0 [ALSA ]: bcm2835 - bcm2835 ALSA
bcm2835 ALSA
1 [MicroII ]: USB-Audio - Audio Advantage MicroII
C-Media INC. Audio Advantage MicroII at usb-3f980000.usb-1.3, full speed

今回接続したUSBスピーカーは以下です。対応OSには記載されていませんが、Raspberry Pi 3(RASPBIAN JESSIE)に接続して問題なく認識しました。