ひとさまから遅れること何年かにして、ようやくとスマホデビューしました。購入した端末は累積販売台数1000万台とかで話題のGalaxy S3 SC-06Dです。この端末、Android 4.0対応しているだけでなく、Samsungが独自にAVRCP 1.3に対応しているらしいとの情報があったために選択しました。iPhone以外でAVRCP 1.3機能がまっとうに使える数少ない端末であると見込んで購入したのにもかかわらず、曲名等のメタデータをWM600やBlueSAM上で表示できないという問題に遭遇しました。きょうは、その顛末の報告です。
まずは、現在のAndroidにおけるAVRCPプロファイルサポートに関する背景を簡単にまとめておきましょう。AndroidはLinuxベースであり、そのBluetooth機能については
BlueZプロジェクトの成果を取り入れたものがベースとなっています。
このブログ記事の説明によれば現行の4.0 ICSで使用されているBlueZのバージョンは4.94であり、そのAVRCPサポートはプロファイルバージョン1.0のようです。AndroidにおいてAVRCP 1.3がサポートされるのは、次の4.1 Jerry Beanになるようです。しかしながら、これは素のAndroid環境を用いた場合の話であり、自分で機能強化を行えばもちろん4.0 ICS(あるいはそれ以前の版)でもAVRCP 1.3対応することは可能となります。実際にシャープ製の端末では、IS01のころからAVRCP 1.3対応しているようですし、世の中には勝手ROMでAVRCP 1.3対応しているものもあるようです。
Galaxyの場合も同様にSamsungが独自にAVRCP 1.3に対応しているらしく、
こちらの記事によればGalaxy S2でメタデータの送信ができているとの報告があります。この情報からわたしはS3においても当然同様の機能がサポートされているに違いないと確信したわけです。このようにベンダーが独自に機能拡張をおこなっている場合には、ベンダーが提供するMedia Playerを使用しないとその機能は利用できない可能性があります。他の評判のいいプレーヤがあっても、端末ベンダが提供する拡張APIに対応していなければメタデータ送信はできないからです。
ここからは実証編です。まずはAVRCPのプロファイル・バージョンを確認してみます。別のUbuntuマシン上からsdptoolを使ってSC-06DのSDP情報をbrowseしてみた結果です。
Browsing 0C:71:5D:10:85:1E ...
Service RecHandle: 0x10000
Service Class ID List:
"PnP Information" (0x1200)
Profile Descriptor List:
"PnP Information" (0x1200)
Version: 0x0102
Service Name: Audio Source
Service RecHandle: 0x10001
Service Class ID List:
"Audio Source" (0x110a)
Protocol Descriptor List:
"L2CAP" (0x0100)
PSM: 25
"AVDTP" (0x0019)
uint16: 0x102
Profile Descriptor List:
"Advanced Audio" (0x110d)
Version: 0x0102
Service Name: AVRCP TG
Service RecHandle: 0x10002
Service Class ID List:
"AV Remote Target" (0x110c)
Protocol Descriptor List:
"L2CAP" (0x0100)
PSM: 23
"AVCTP" (0x0017)
uint16: 0x103
Profile Descriptor List:
"AV Remote" (0x110e)
Version: 0x0103
Service Name: Voice Gateway
Service RecHandle: 0x10003
Service Class ID List:
"Headset Audio Gateway" (0x1112)
"Generic Audio" (0x1203)
Protocol Descriptor List:
"L2CAP" (0x0100)
"RFCOMM" (0x0003)
Channel: 11
Profile Descriptor List:
"Headset" (0x1108)
Version: 0x0102
Service Name: OBEX Object Push
Service RecHandle: 0x10004
Service Class ID List:
"OBEX Object Push" (0x1105)
Protocol Descriptor List:
"L2CAP" (0x0100)
"RFCOMM" (0x0003)
Channel: 12
"OBEX" (0x0008)
Profile Descriptor List:
"OBEX Object Push" (0x1105)
Version: 0x0100
Service Name: OBEX Phonebook Access Server
Service RecHandle: 0x10005
Service Class ID List:
"Phonebook Access - PSE" (0x112f)
Protocol Descriptor List:
"L2CAP" (0x0100)
"RFCOMM" (0x0003)
Channel: 19
"OBEX" (0x0008)
Profile Descriptor List:
"Phonebook Access" (0x1130)
Version: 0x0100
Service Name: Voice Gateway
Service RecHandle: 0x10006
Service Class ID List:
"Handsfree Audio Gateway" (0x111f)
"Generic Audio" (0x1203)
Protocol Descriptor List:
"L2CAP" (0x0100)
"RFCOMM" (0x0003)
Channel: 10
Profile Descriptor List:
"Handsfree" (0x111e)
Version: 0x0105
AVRCP Protocol Descriptor内のVersionが0x0103になっていることから、バージョン1.3になっていることが確認できます。Androidのアプリケーション管理で実行中プロセスを見てみると....
明らかにSC-06DではSamsung独自のAVRCPサービスが走っていますので、このサービスがAVRCP 1.3に関連した機能を提供している可能性があります。Samsungが提供するプレーヤでは、このサービスを介してメタデータを送信することができるのではないかと推測されます。
ところが実際にSC-06Dにインストールされている「メディアプレイヤー」を使ってWT32でAVRCPの動作を確認してみると。。
メタデータを要求しても、拒否されてしまいます。場合によっては、拒否はされなくてもデータとしてヌル文字列が返される場合もあるようです。orz
この「メディアプレイヤー」ですが確認してみると、上図のようにDoCoMo提供になっています。Samsungの純正プレイヤーだと思っていなのですが、違ったようです。あるいは、実際の開発はSamsungだけど開発費DoCoMo持ちのためドコモ提供になっているだけ?いずれにしても、動作検証はDoCoMoの責任ですよね。このメディアプレイヤーがちゃんとメタデータ送信に対応できていないんじゃないでしょうか? 良く見てみるとSC-06Dにはもうひとつ音符アイコンに「音楽」と記したアプリが用意されており、こちらもプレイヤーになっているようです。
こちらのプレイヤーを使うと正常にメタデータが送信されるようになりました。
日本語文字列の送信も問題ないようです。SonyのWM600とつないでもちゃんと曲名が表示されます。つまり、
ドコモ純正の「メディアプレイヤー」がダメダメじゃん!! というオチだったのです。
このようにAVRCPを使うアプリの機能仕様は、残念ながらAndroidのバージョンだけでは判断できません。Androidは共通プラットフォーム機能を提供してはいますが、各ベンダは差別化のためにサービスやライブラリのレベルで機能仕様を強化して、それに対応したアプリを用意しているかもしれません。これら3つの層が正しく協調動作してくれないと期待した機能を提供してくれないことになります。ドコモ純正プレーヤは、良くできたSamsungの下位層をちゃんと使いこなせていない悪いお手本になっていたようです。次のJBでは、すべての層がGoogle提供のもので統一されることにより、このような問題が無くなれば良いのですが。。。
2012-07-03 10:52:30 追記
「音楽」と表示されるプレイヤーアプリはGoogle標準プレイヤーなのですね。つまり標準プレイヤーだとAVRCP 1.3に対応できて、DoCoMo純正プレイヤーでは対応できていないという当初予想とは真逆の結果になっているようです。APIの仕組みの都合でしょうか。
AvrcpServiceSamsungは、プレイヤーから受信したメタデータをキャッシュしており、Bluetooth経由での要求があった際にそのデータを送信しているようです。そのため、最後に標準プレイヤーで再生した曲のデータを保持しており、そのあとでDoCoMo純正プレーヤーで再生をすると、キャッシュされていたデータを送信します。そのため、純正プレイヤーを使用していると再生されている曲とは違うメタデータが表示され、しかも曲送りをしてもデータが変化しないという症状を引き起こすこととなります。