ESP32 esp-idf bluetooth a2dp_sink への aptx decode 実装の考察 #3

ESP32 esp-idf bluetooth a2dp_sink への aptx decode 実装の考察 の続き、 #3 です。

まだ、Bluetooth の a2dp aptx のソース側のハードが揃わないので、取り敢えず、現状の アンドロイド Version 5 でのログを集めてみました。
手順は、先に ESP32 a2dp_sink (SBC版) を立ち上げておきます。

次に、Andoriod スマホ を起動させた時のログ

次に、chromeで、Youtube での音楽を開始した時のログです。

一度、スマホでBluetooth のペアリングを解除して、
再度、スマホ側でペアリングをする。と同時に、接続を完了させる。但し、ペアリングを完了しただけで、ブラウザーで、
Youtubeなどを開いていないが、前回、聞いていた、中島美嘉 『雪の華』 の情報が送られてきた。

1) I (1558118) BT_AV: A2DP connection state: Connecting, [a0:00:00:0e:d7:d6]  から、A2DPプロトコルが始まり。
2) I (1558138) BT_AV: A2DP audio stream configuration, codec type 0
3) I (1558138) I2S: PLL_D2: Req RATE: 44100, real ..... で I2Sの初期化
4) I (1558148) BT_AV: Configure audio player 21-15-13-4b
5) I (1558158) BT_AV: Audio player configured, sample rate=44100
で、コンフィグ設定が行われているように見えます。
つまり、ここら辺のプログラムに当りをつけられます。

上に続けて、再度、Youtubeを開いてみる。但し、音楽はミュート状態です。

続けて、ミュートを解除しみます。

その他、色々操作を変えて、おんちゃんは、ログを取ってみましたが、掲載は割愛します。
詳しく知りたい場合は、自分でどうぞ。
これで、コンフィグ設定場所の当たりが取れたので、ログを吐き出している箇所のプログラムを追ってみます。

1),2),4),5) は、どれも、bt_app_av.c ライン92 static void bt_av_hdl_a2d_evt(uint16_t event, void *p_param)
の中で、event の値に応じて、ログをだしているようです。
つまり、そのイベントコードを設定しているところが、大本のフレームワーク内のルーチンに当たります。
ESP_A2D_CONNECTION_STATE_EVT, ESP_A2D_AUDIO_STATE_EVT, ESP_A2D_AUDIO_CFG_EVT をシンボル検索すると、 該当箇所が出てきます。

ESP_A2D_CONNECTION_STATE_EVT をセットしている箇所は、
bt/bluedroid/btc/profile/std/a2dp/btc_av.c

更に辿っていくと、
同じく bt/bluedroid/btc/profile/std/a2dp/btc_av.c

もとい、コンフィグだから、ESP_A2D_AUDIO_CFG_EVT を検索か
これも、上の、static BOOLEAN btc_av_state_opening_handler(btc_sm_event_t event, void *p_data)
の中にありました。なので、大本は、ここか?或いは、此処もイベントで処理されているので、此処のイベントコードをセットしている箇所か?
取り敢えず、此処のコードを見てみます。

ここで、ESP_A2D_AUDIO_CFG_EVT 等がどこで定義されるか、検索してみます。
bt/bluedroid/api/include/api/esp_2adp_api.h
にありました。
中を少し垣間見てみます。

bt/bluedroid/api/include/api/esp_2adp_api.h

定義されている、ESP_A2D_MCT_SBC, SP_A2D_CIE_LEN_SBC, cie.sbc[ 当たりがそれらしいので、同じく検索してみます。
やっと、見つかったようす。
btc_av.c の bte_av_media_callback(tBTA_AV_EVT event, tBTA_AV_MEDIA *p_data) がそれらしいです。



1185 a2d_status = A2D_ParsSbcInfo(&sbc_cie, (UINT8 *)p_data, FALSE);
で、内容をチェックして、SBCコーデックであれば、
1186 if (a2d_status == A2D_SUCCESS) {
以降の処理を行っています。

これで、コーデックの判定処理の場所が判かりました。
a2d_sbc.c の ライン 271 tA2D_STATUS A2D_ParsSbcInfo(tA2D_SBC_CIE *p_ie, UINT8 *p_info, BOOLEAN for_caps)
のようです。

これに、APTX,APTX-HD のコーデック対応を組み込めば、出来そうな気がしますが、該当場所が、bt/bluedroid/stack/a2dp/a2d_sbc.c (SBC コーデック向け) なので、
APTX,APTX-HD 向けとするには、今回の A2D_ParsSbcInfo() に相当する関数を組み込んだ、bt/bluedroid/stack/a2dp/a2d_aptx.c  なる物を用意する事になるのか?。
A2D_ParsSbcInfo() -> A2D_ParsAptxInfo() なる判定ルーチンを新たに用意する?。

bt/bluedroid/stack/a2dp/a2d_sbc.c


ここにきて、素朴な疑問だが、巷で公開されている、A2DP(プロファイル)  には、SBCコーデックは定義されているが、APTX,APTX-HD が定義されていのを見かけない。
APTX,APTX-HD を定義しているA2DPプロファイル資料が見つからなければ、ここでストップじゃ。
非常に残念。
APTX,APTX-HD 自体のフォーマットは、なんとかあるようじゃが。

このブログ記事について

このページは、おんちゃんが2018年12月21日 11:58に書いたブログ記事です。

ひとつ前のブログ記事は「ESP32 esp-idf bluetooth a2dp_sink への aptx decode 実装の考察 #2」です。

次のブログ記事は「ESP32 esp-idf bluetooth a2dp_sink への aptx decode 実装の考察 #4」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

カテゴリ

ウェブページ

サイトナビ