BM20をシリアルでつなげる事によって得られる大きなメリットのひとつがAVRCPを使っての情報取得制御が可能となる事です。コマンドを送信する事で音楽プレーヤの再生開始(play), 休止(pause), 停止(stop)といった操作が行えますし、再生中のトラックの曲名やアルバム名を要求するコマンドを送信してやり、その応答としてそれらの情報を取得することができます。
特に何の操作もしなくても、AVRCPがつながると、次のようなイベントが上がってきました。
BM20から上がってくるイベントについては、SPK_Module_UARTCommandParameters.xlsというExcelファイルのそのフォーマットの説明があるのですが、どうも説明内容と実際に出力されるフォーマットが一致していないようです。もともと、フォーマット概要が記されているだけで、その内容の意味まで踏み込んだ説明があるわけでもないので、自分で調べるしかありません。AVRCPの仕様書を元に上記のパケットの意味を調べてみると、どうやらつぎのようになっているようです。
マイコンソフトでは何もAVRCPのコマンドを投入していないのにもかかわらず、プレーヤの現在の状態を報告してくれているようです。最初の INTERIM応答というのは本来であれば、マイコン側から通知(Notification)の要求を出した際に、その暫定応答として帰ってくるべきパケットです。この動きからマイコン側から何もコマンドを出さずともBM20が自動的にプレーヤの状態変化通知の要求を出してくれているであろうことが推察できます。
プレーヤ側で音楽の再生を開始してみると次のような2つのパケットが出てきました。
先に出てきたパケットでは最初のパケットの最初のバイトが 0x0F (INTERIM) から 0x0D (CHANED)に変化し、最後のバイトが 0x02 (PAUSED)から0x01(PLAY)に変化しており、状態変化が発生したことを通知する内容となっています。
後のパケットは最初のパケットと同じように最初のバイトが0x0F (INTERIM)になっているので、BM20が次の状態変化に備えての通知要求を自動的に発行してくれた結果を示す応答であろうことがわかります。
このようにどうやらBM20は状態変化については自動的にAVRCP の通知要求を出してくれることがわかりました。しかし、そのほかの情報についてはマイコン側から明示的に通知要求を出してやる必要があります。そこで次のような内容のAVRCPパケットを組み立ててAVC_SPECIFIC_CMDとして送信してやる title コマンドを用意して、これを実行してみました。このコマンドパケットは、再生中の曲のタイトルとアーティスト名を要求するものです。
取得される情報が長くなるので、応答中の曲名とアーティスト名はデコードして表示するようにしています。
このようにAVRCPを使うことで、プレーヤの状態や再生中の曲に関する情報を取得することができますので、これらの情報をLEDやLCDを使って表示することも可能になります。
特に何の操作もしなくても、AVRCPがつながると、次のようなイベントが上がってきました。
BM20から上がってくるイベントについては、SPK_Module_UARTCommandParameters.xlsというExcelファイルのそのフォーマットの説明があるのですが、どうも説明内容と実際に出力されるフォーマットが一致していないようです。もともと、フォーマット概要が記されているだけで、その内容の意味まで踏み込んだ説明があるわけでもないので、自分で調べるしかありません。AVRCPの仕様書を元に上記のパケットの意味を調べてみると、どうやらつぎのようになっているようです。
0F Response: INTERIM 48 subunit_type: PANEL, subunit_id: 0 00 Opcode: Vendor Dependent 00 19 58 Company ID 31 00 PDU ID: Register Notification 00 02 Parameter Length = 2 01 02 EVENT_PLAYBACK_STATUS_CHANGED = PAUSED
マイコンソフトでは何もAVRCPのコマンドを投入していないのにもかかわらず、プレーヤの現在の状態を報告してくれているようです。最初の INTERIM応答というのは本来であれば、マイコン側から通知(Notification)の要求を出した際に、その暫定応答として帰ってくるべきパケットです。この動きからマイコン側から何もコマンドを出さずともBM20が自動的にプレーヤの状態変化通知の要求を出してくれているであろうことが推察できます。
プレーヤ側で音楽の再生を開始してみると次のような2つのパケットが出てきました。
先に出てきたパケットでは最初のパケットの最初のバイトが 0x0F (INTERIM) から 0x0D (CHANED)に変化し、最後のバイトが 0x02 (PAUSED)から0x01(PLAY)に変化しており、状態変化が発生したことを通知する内容となっています。
後のパケットは最初のパケットと同じように最初のバイトが0x0F (INTERIM)になっているので、BM20が次の状態変化に備えての通知要求を自動的に発行してくれた結果を示す応答であろうことがわかります。
このようにどうやらBM20は状態変化については自動的にAVRCP の通知要求を出してくれることがわかりました。しかし、そのほかの情報についてはマイコン側から明示的に通知要求を出してやる必要があります。そこで次のような内容のAVRCPパケットを組み立ててAVC_SPECIFIC_CMDとして送信してやる title コマンドを用意して、これを実行してみました。このコマンドパケットは、再生中の曲のタイトルとアーティスト名を要求するものです。
00 dbindex = 0 20 PDU ID: GetElementAttribute 00 00 11 length = 17 00 00 00 00 00 00 00 00 Identifier: PLAYING 02 AttributeCount = 2 00 00 00 01 Title of Media 00 00 00 02 Name of the artist
取得される情報が長くなるので、応答中の曲名とアーティスト名はデコードして表示するようにしています。
このようにAVRCPを使うことで、プレーヤの状態や再生中の曲に関する情報を取得することができますので、これらの情報をLEDやLCDを使って表示することも可能になります。