2014-09-12 [長年日記]
LBT-PAR500AVを買った
いままでSONYのMW600を使用していたのだけど、動画再生時の音声の遅延が大きく*1、apt-x対応だとどんなもんなのかなあということで、新しいBTレシーバを探していた。走るときに便利そうということで、ボックスレスタイプも検討したのだけど、単純に高いのと、イヤフォンが壊れた時に交換できないのとで今回は見送り。
MW600では曲名表示が決め手だったんだけど、Androidでの音楽再生環境をJust Playerに移行したことで無意味な機能になっていたので*2、そこは妥協。apt-x対応かつボックスタイプで4,000円をきるお手軽価格だったので購入した。
購入しての第一印象は、思ったより一回り大きくて質感がちょっとチープ。まあ値段なりという感じではある。HTL21はNFCによるペアリングには対応していなかったので、普通にシンプルペアリングで接続。apt-xの効果はどうかというと、音楽を再生した時の最初の出音が早くなり、動画でもリップシンクが違和感がほとんど無いレベルまで合うようになっていた*3。音質に関しては正直なところMW600とくらべて違いがあるようには思えない。こまかく聴き比べれば違うのかもしれないけど、モバイル機器だしなあということで気にしないことにした。
あとはJust PlayerがBluetoothの再生ボタンに対応してくれれば理想の環境になるんだけど。
JUST PLAYERでBluetoothのPLAY/PAUSEボタンが効くようにする
結論から言うと、このアプリを入れてボタンの転送先をJUST PLAYERにすればOK。
以降androidでのAVRCPの関するメモ書き。 上記のソフトは送信先を決めているだけで、キーコードは変えてないんじゃないかなあという疑問があって、さいわいどちらのソフトもコードが公開されているのでちょっと追いかけてみた。
まず、テストアプリを作成して、AVRCPで送信されてくるキーコードを確認。AndroidManifest.xmlでActivityにintent-filterを追加するとAVRCPのボタンを受信できる。
<intent-filter> <action android:name="android.intent.action.MEDIA_BUTTON"/> </intent-filter>
あとは、Activity.onKeyDownで受信。それによると、PLAY/PAUSEボタンを押すと、KeyEvent.KEYCODE_MEDIA_PLAY/KeyEvent.KEYCODE_MEDIA_PAUSEが交互に通知されている。
つぎに、MediaButtonRouterのコードをみてみると、KEYCODE_MEDIA_PLAYとKEYCODE_MEDIA_PAUSEは、KEYCODE_MEDIA_PLAY_PAUSEに変換していることがわかる。
public static int getAdjustedKeyCode(KeyEvent keyEvent) { int keyCode = keyEvent.getKeyCode(); if (keyCode == KEYCODE_MEDIA_PLAY || keyCode == KEYCODE_MEDIA_PAUSE) { keyCode = KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE; } return keyCode; }
一方、JUST PLAYERのソースでは、KEYCODE_MEDIA_PLAY_PAUSEのみをハンドリングしている。
(snip) switch (event.getKeyCode()) { case KeyEvent.KEYCODE_MEDIA_STOP: Logger.d("KEYCODE_MEDIA_STOP"); service.setAction(AppWidgetHelper.CALL_STOP); context.startService(service); break; case KeyEvent.KEYCODE_HEADSETHOOK: Logger.d("KEYCODE_HEADSETHOOK"); // break; case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE: Logger.d("KEYCODE_MEDIA_PLAY_PAUSE"); service.setAction(AppWidgetHelper.CALL_PLAY_PAUSE); context.startService(service); break; case KeyEvent.KEYCODE_MEDIA_NEXT: Logger.d("KEYCODE_MEDIA_NEXT"); service.setAction(AppWidgetHelper.CALL_FF); context.startService(service); break; case KeyEvent.KEYCODE_MEDIA_PREVIOUS: Logger.d("KEYCODE_MEDIA_PREVIOUS"); service.setAction(AppWidgetHelper.CALL_REW); context.startService(service); break; default: { Logger.d("不明なキーコード"); } } (snip)
ということで、結果的にMedia Button Routerを通すことで、PLAY/PAUSEが動作するようになっている。
とりあえず目的は達成したけど、Media Button Routerの動作も不安定なことがあるし*1、issueを投げたので対応してくれるといいなあ。
*1 再生はできるけど、ポーズができないことがある