Music TO GO!

2012年04月11日

iBasso DX100のひみつ2、または、AndroidにおけるALSA利用の実際

一応iBasso DX100インプレからの続きです。(DX100のひみつ1はこちら)
DX100の面白い点の一つはDX100が最近ここで書いているようなAndroidのオーディオ分野への応用のショーケースとなるということです。

前の記事でAndroidの音声システムのことを書いた時に、AudioFlingerではなく、ALSAを使用しているベンダーもあると書きました。もしかしたらiBassoもそうではないかと思い、聞いてみたらやはりDX100ではALSAを使用しているということです。またES9018のドライバーはALSAドライバーを使用しているとのこと。このALSAドライバーはiBassoが作成したものです。
前に書いたようにiBasso DX100では44/16制限のあるAudioFlingerを使わないというのは、音声システムを一からiBassoが新たに書いたと言うよりALSAをうまく利用しているということのようです。ただしそれにしてもかなり作りこんでいます。たとえば他の音楽再生アプリと同時に使うさいにiBasso Musicアプリが96/24を再生して、PowerAmpなど他のアプリが44/16を再生しているときはiBassoのソフトウエア(ミキサー?)で44/16のストリームが96/24にリサンプリングされて同時に混ざってES9018のALSAドライバーに送られるということです。この辺もiBassoが作りこんだところです。iBassoではJNIを用いてALSAを利用しています(後述)。

device-2012-04-09-232917.png
iBasso Musicによる96/24再生

少し整理すると、まずAndroidはJAVAベースなのでアプリを作るためにはJAVAのフレームワークが必要です。それがGoogleが提供するAndroid SDKのMedia Frameworkになります。これはOpenCoreというライセンス条件の緩いライブラリをベースにしています(GPLではなくApache license)。この中に先に書いたPCM出力のためのAudioTrackクラスがあり、さらにミキサーなども加えてAudioFlingerと呼んでいるAndroidの音声システムを構成しているわけです。ところがこの枠組みでは44/16が限界です。(理由はこちらの記事を参照のこと)
それを打開するためにはAndroidはもともとLinuxベースなので、そこにはいっているLinuxの音声システムであるALSAを利用するというわけです。

ただしこのALSA方式は口で言うのは簡単なのですが、問題は実際にどう実装するかということです。
ALSAはJAVAではないので、その繋ぎ目としてJNIを使います。Android NDK(native dev kit)で定義されるJNIのCインターフェースを使用してコードを作成し、そこからALSAのライブラリやドライバーを利用します。iBassoではそうしているようです(これは聞いてみました)。さらにここで生じる問題は、Androidで使われているCライブラリはBionic Libcというもので、普通のGNUなどとは違うということです。これはGPLライセンスを避けるためとかサイズを小さくするためと言われています。つまりALSAが入っているといってもそれがそのままAndroidで使えるかはわからないので、それなりの作り直しが必要かもしれません。ドライバーもAudioFlingerとは異なってきます。

従来のJAVAの世界だけよりは大変ですが、このJNI+ALSA方式ならUSB DACが使えない問題も解決できそうですね、ALSAのオーディオクラスドライバーを使えばよいわけですから。AndroidタブレットでiPadのようにUSB DACを使用して、さらに24bit出力を可能にするためにはこのJNI+ALSA方式が有効となるでしょう。JNI+ALSA方式はAndroidが本格的にオーディオ応用されるキーになるのではないかと思います。

もともとAndroidは携帯電話ですから、リソースに限りがあるというのがまず前提です。その点ではJAVAを使うというのは有効です。つまりAndroidはLinuxベースとよく言われますが、Ubuntuなどのディストリビューションに比べるとリソースやライセンスなどでかなり制約があるということです。
しかし、スマートフォンやタブレットが高性能化していき、オーディオを含めてさらに広い応用範囲が求められるようになると、やはりこのALSA問題をはじめとして、AndroidをLinuxベースのシステムとして再度見直していく必要が出てくるのではないでしょうか?
そのうえでここで書いたようなCによるネイティブコードを実現するNDKとか、Androidカンファレンスのところで書いた外部機器制御のためのADKなどでAndroidの応用というのが拡大していくと思います。iPhoneは100%Apple主導ですが、Androidではそうしてユーザー・ベンダー側で可能性を広げることができるわけです。そうすることでAndroid OSが携帯電話から脱して、あらたなインフラになっていくことができるでしょう。
あ、なんか基調講演みたいになった 笑
posted by ささき at 00:23 | TrackBack(0) | __→ スマートフォンとオーディオ | このブログの読者になる | 更新情報をチェックする

この記事へのトラックバック