Music TO GO!

2012年06月30日

AndroidはUSB DACの夢を見るか パート2

昨日書いたAndroid 4.1でのUSBオーディオサポートですけれども、また少し明らかになってきました。Android端末とオーディオ機器の関係の明確化、44.1k/16bit制限などです。
*ADKについてはこちらのAndroidカンファレンス記事もご覧ください

Android 4.1が発表されたGoogleのセッションでADKの新しいリファレンスであるADK2012(Arduinoベース)が公開されています。
http://developer.android.com/tools/adk/adk2.html
ADK2012については下記のArduinoブログで紹介されています。
http://arduino.cc/blog/2012/06/28/android-adk2012-is-here/

オーディオ部分についてのみ紹介しますが、まずADKのUSB Audio機能を使うにはAndroid 4.1で行うことが必要であると書かれています。
To play audio over USB, you must use a device running Android 4.1 (API Level 16) or higher:
このArduinoベースのADK2012に USB ABを接続して、Android端末(4.1)側にUSB B(デバイス側を示す)を接続します。しかし、音源の再生アプリはAndroidにあり、DACはADK2012側ですから、つまり通常のUSB DACとはA/B関係が逆です。(なぜADKではホストとデバイスが逆かというとAndroid端末側にデバイス側から給電をしたりするためです)
するとADK2012の内蔵スピーカーから音が出るとあります。おそらくADK2012にはなんらかのDACが入っているようですね。Androidでデジタルアウトを取り出すデジタルドックまたはDACはおそらくこのADK2012をベースに製作されるでしょう。(このA/B関係はiTransportのようなiPodデジタルアウト機器と似ています)

このときに下記のAndroid Open Accessory Protocol 2.0の仕様を見てほしいのですが、
http://developer.android.com/tools/adk/aoa2.html
まずAndroid端末側がAndroidAccessoryプロトコルに対応している必要があります。(iPodでいうとiPod Accessoryプロトコル対応のiPod5.5以降に相当しますね)
ソースコードを見るとAndroid側でgetProtocolして上記を確認した後にデバイス情報のハンドシェイクをしますが、ここのUSB IDでこの2.0では新たに従来の1.0ではなかったUSB Audioという項目が追加されています。
audio - A new standard USB audio class interface for streaming audio from an Android device to an accessory.
続いて2.0のプロトコルでは44.1kHz 16bitのフォーマットのみサポートすることが書かれています。つまりAndroid4.1でUSB Audio対応可能といっても、ハイレゾは当面できません。ただし将来的には追加されるだろうとも書かれています。
このUSB Audioを使うときにはやはり新規のSET_AUDIO_MODEで示されるUSBコントロールリクエストが必要になります。

つまり、やはりAndroid端末とDACの関係は通常のUSB DACとは逆になるので、簡単にUSB DACをつなぐというわけではなさそうです。こちらにUSB Audio Dock Implementationとしてそうした機器(USB Audioドック)の例が載っています。
http://developer.android.com/tools/adk/adk2.html#audio-dock
Android側では特別な対応は必要ありませんが、ADK側で初期化してイベントハンドリングします。


* GALAXY SIIIでは

一方で調べてみるとAndroid 4.1でないとUSB Audioは使えないのかというとそうでもないようです。また上のようにiPodデジタルアウトのような形態ではなく、USB DACを直で取ることもできるようです。
Audioサポートはありませんが、Androidでは3.0から上記のAndroid Open Accessory ProtocolでUSBホストモードは可能です。ただ問題は前に書いたようにUSB Audioクラスドライバーが標準では提供されていないという点です。
前に書いた「AndroidはUSB DACの夢を見るか」の記事ではAndroidでは現状USB DACは使えないと書きましたが、これはあくまでベースのAndroidの話で、Androidはそれをベンダーごとにカスタマイズして自社ハードに実装しています。
サムスンとかノキアではこのUSB Audioクラスドライバーを一部機種で実装しているようです。ひとつはこの最新機種のGALAXY SIIIです。

こちらのブログでサムスンのGALAXY SIIIとFiio E7を接続した例が載っていました。
http://www.androidnz.net/2012/06/galaxy-s-iii-usb-audio-is-it-really.html?m=1
はじめFiiO E17では失敗したけど、スピーカーから音が出るわけではなく、認識したっぽかったのでより安定してるE7で試したところうまくいった、とあります。E7はiPadでも素直に動くタイプですね。
またこの文中で引用されていますがデベロッパフォーラムのXDAでも報告があって下記のようにYou tubeに投稿されていました。
ここではGALAXY SIIIをTOPPING TP30というUSB DAC付きのデジタルアンプに接続しています。はじめ内部スピーカーから小さく音が出ていますが、映像を見るとわかるようにUSB OTGアダプター経由でTP30につなげるとそちらを通じで外部スピーカーから音が出る様子がわかります。


つまり簡単に書くとGalaxy SIII → USB OTG → Fiio E7(またはTP30)という感じでしょうか。Nokia N8でも大丈夫ってあるので、やはりベンダーによってはUSBオーディオのクラスドライバーを生かしてるところもあるようです。前に書いたようにJAVAが基本のAndroidではALSAのクラスドライバーならネイティブ環境のNDKが必要なので、ちょっと実装が興味あるところですね。

前に書いたようにAndroid 3.0(タブレット版)からUSBホスト機能がサポートされてるので、スマートフォン側がUSB ポートBでも適切なUSB OTGなどアダプターがあれば良いわけです。
USB OTGとはなにかというと、通常USBはホスト(PC)とデバイスの関係がはっきりしてるのですが、それだとFireWireみたいにPCを介さずに直接デバイス同士を接続できないので出来たのがUSB OTG(On The Go)です。本来USB-Bポートを備えたデバイス側(この場合スマートフォン)はホスト(データを出す方)になることが出来ませんでしたが、このOTGを使えば解決出来ます。USB OTG自体は新しい規格ではありませんし、そもそもiPadのカメラコネクションキットもiPadにUSB OTGアダプターを付けたのと似たようなものです。
ちなみにUSB OTG規格は帯域幅制限があるようなので、ハイレゾ・ハイサンプリング(HD音源)が可能かということについてはUSB OTGもボトルネックになる可能性がありますので念のため(この辺はよくわかりません)。


Appleというひとつの意志が動きを統制しているわけではないので見えにくいところもありますが、Androidではこのように独自に端末ベンダーが作り、あるいはGoogleが標準化したADKなどでアクセサリーメーカーが作り、Androidという世界を形成していくという形でAndroidのデジタルアウトとオーディオの進化は進んでいくのでしょう。
posted by ささき at 23:06 | TrackBack(0) | __→ スマートフォンとオーディオ | このブログの読者になる | 更新情報をチェックする