HummingBoardとCuBox-iの違いは、ハードウェア的に外部ポートがついていることです。
このコーナーでは、GPIOやSPI、I2Cを使った電子工作などの例をもとにHummingBoardならではの検証を行っています。
前回までひと通りGPIO,SPI,I2Cの動作を検証してきました。HummingBoardの基板上を見ると、音声用のオーディオアナログジャックがついています。それなら、とイヤホンとかスピーカーをつないでみましたが、これが全く音が出てきません。結論として、こんな単純なことの割には、アプリで対応していないととても大変だということが分かりました。
Android, UBUNTU, Debian, OpenELEC, GeeXboX などすべて、音はHDMIとSPDIFの出力しかサポートされていません。HummingBoardよりもCuBox-i が先行していたこともあるのでしょうが、HummingBoardのanalog audioだとかAndroidで見かける EARPIECE などは設定のどこを見てもでてきません。今回は、意地になって見出したAndroid でオーディオジャックから音を出すというトリビアを紹介します。
Arduinoとか、RaspberryPi 対応のローレイヤーのドライバやツールの場合、残念なことにHummingBoardには対応されていません。
1. HummingBoardのAndroidでアナログオーディオ
ワンボードマイコンの類で、Android4.4がまともに動くものは珍しい。通常はもっとプリミティブな「マイコン」を工作に使うので、Androidを走らせるにはメモリやCPU性能が足りないからです。そんな性能・機能リッチである特異なHummingBoardですが、いざAndroidを載せてしまうと返って小さな制御が難しくなってしまうこともあります。試していきます。これまでに検証をしてきたGPIOなどのポートを使うことでも、実はroot権限が必要になります。ところがコラムの記事でも紹介してますが、通常のビルドのAndroidではroot権限取得は基本的にできません。
さて、アナログオーディオをLinuxで扱おうとします。基本的にALSAが対応してさえいれば,ただアナログジャックに接続するだけで利用可能となります。
cat /proc/asound/cards
GNOMEのサウンドの設定アプレットによる設定であれば、サウンドデバイスを接続して電源を入れると,ウィンドウ「サウンドの設定」(gnome-volume-control)の「ハードウェア」タブに表示されるようになります。
OpenELECやGeeXboXでは、Settingのページからオーディオ出力が選べます。
HummingBoardでは、i2eX,とi4Pro でしかアナログの音声は出ません。i1, i2 ではCPUがプログラム上で作るビープ音などしか出ないようになっています。ここからは、HB-i2eXで検証を続けます。
Android4.4の場合の結論
1. edit /system/etc/audio_policy_conf でEARPIECEを足す
/system/etc/audio_policy_conf :
# Global configuration section: lists input and output devices always present on the device
# as well as the output device selected by default.
# Devices are designated by a string that corresponds to the enum in audio.h
global_configuration {
attached_output_devices AUDIO_DEVICE_OUT_EARPIECE|AUDIO_DEVICE_OUT_SPEAKER
default_output_device AUDIO_DEVICE_OUT_SPEAKER
attached_input_devices AUDIO_DEVICE_IN_BUILTIN_MIC|AUDIO_DEVICE_IN_BACK_MIC
}
2.AndroidアプリのSoundAboutをインストール
音声の入出力を色々な組合せ変更することができる。
3.tinyalsaの設定 root権限が必要 ->コラム 参照
root のshellコマンドで、
tinymix
と打つと下表の通り。ジャックは25になっている。
tinymix 25 on
とすることで、イネーブルすることができる
2の設定があっていれば、この瞬間にイヤホン(スピーカー)から音がでてきます。
YoutubeでもSkypeでも何でもこれでジャックから聞こえるようになります。
ただし、3のパラメータはroot権限が必要なこと、一度電源を落とすと保存されていないこと、で大変に面倒な作業となります。何かのシステムに組み込んで使うような場合にはメンテナンス上も問題があるでしょう。
もとは、AndroidでSkypeを使う時に、HDMI接続したTVへ流せない場合の着信音を出したいというユースケースだったのですが、結論としては、できなくはないが運用にはむかないということでした。
2. それでは他のOSではどうだろうか
Androidでの結果が結果だったのでついでに他のLinuxではどうかを少し調べたものの紹介をしてみます。
【OpenElec5 official の場合】
audio jackは認識されている。
OpenELEC:/etc # cat /proc/asound/cards
0 [imxhdmisoc ]: imx-hdmi-soc - imx-hdmi-soc
imx-hdmi-soc
1 [Codec ]: On-board_Codec - On-board Codec
On-board Codec
2 [imxspdif ]: imx-spdif - imx-spdif
imx-spdif
OpenELEC:/etc #
OpenELEC:/etc # aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: imxhdmisoc [imx-hdmi-soc], device 0: i.MX HDMI Audio Tx hdmi-hifi-0 []
Subdevices: 1/1
Subdevice #0: subdevice #0
card 1: Codec [On-board Codec], device 0: HiFi sgtl5000-0 []
Subdevices: 1/1
Subdevice #0: subdevice #0
card 2: imxspdif [imx-spdif], device 0: S/PDIF PCM snd-soc-dummy-dai-0 []
Subdevices: 1/1
Subdevice #0: subdevice #0
普通のLinuxであればどうにかできそうだが、SSHでrootでログインしても、filesystemがread-onlyになっていてブロックされてしまう。
【UBUNTUの場合】
Alsaに認識されていないので現状方策なし
【Debianの場合】
Alsaには認識されている。デスクトップツールやAlsaのツールを導入すれば可能だと思われる
【Xbianの場合】
Xbianは、Kodi(XMBC)で唯一pulseaudioが使える状態にあります。Xbianでは、色々なところで色々なトライアルがなされている。
例えば SolidRun Communityの中のディスカッションで
Bluetooth Audio
http://www.solid-run.com/community/post17834.html#p17834
などが参考になる。
種々の対応中に、アナログオーディオジャックからの出力は確めることができた。しかしながら、今回はBluetoothでのオーディオ再生は確かめられなかった。さらなる調査で確認出来次第コラムへ投稿します。
コメントをお書きください