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

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

その後、あちこち、DEBUG表示を行って、調べてみました。
AVDTP(AUDIO/VIDEO DISTRIBUTION TRANPORT PROTOCOL SPECIFICATION) や、GAP(Generic Audio/Video Distribution Profile) 上の、
Idle -> Cofigured -> Open に至る部分が、下記のようです。

(LL_OPEN_EVT は、チャネルの確立なので、そこからトレースされています。)
なので、MSG_GETCAP_CMD_EVT の応答で、codec_type=APTX を返すと
APTX のMSG_SETCONFIG_CMD_EVT が送られてきそうです。

プログラムに手を加えて、実際に、こうなるか試してみます。
詳しい所は、省きますが、
bta_av_co_init()::bta_av_co.c で、APTX 用の codec_info を設定するコードを追加すれば、出来そうです。

A2DP_BuildInfoAptx() は、fluoride の中のコードを流用して、A2D_BldSbcInfo() に似せて自分で追加します。
bta_av_co_aptx_caps が、肝心の、APTX 用の codec_info ですが、これも、SBC用のbta_av_co_sbc_sink_caps をまねて追加します。

上記、修正を加えて、Windows10 の Bluetooth ドングルで試してみました。
ビンゴ!! OK でした。

この後、Android Ver5.0 スマホで試してみました。

の様になりました。

こちらは、一度、L2CAP チャネルが切断されて、再度、LL_OPEN_EVT がきて、
今度は、MSG_GETCAP_RSP_EVT(codec_type=SBC) が送られきます。
なので、これに対応すれば、SBCコーデックでの受信ができそうです。

次は、APTX のstream data の受信処理を組み込と行きたいところですが、
ここは、Android Ver5.0 スマホや、CentOS7 でも使いたいので、上記、改造プログラムで、SBCのデータ受信を行えるように先に組み込みます。

その場合の処理の整理
1. MSG_GETCAP_CMD_ENT がきたら、APTX codec_info を返信する。
2. MSG_SETCONFIG_CMD_EVT (codec_type=APTX)がきた、APTX の受信処理へ移行する。
3.MSG_GETCAP_RSP_EVT(codec_type=SBC) がきたら、OK を返して、SBCの受信処理へ移行する。
4.MSG_GETCAP_RSP_EVT(codec_type!=SBC) がきたら、NG を返す。

将来、APTX-HD を追加した場合も、同じく
1. MSG_GETCAP_CMD_ENT がきたら、APTX-HD codec_info を返信する。
2. MSG_SETCONFIG_CMD_EVT (codec_type=APTX-HD)がきた、APTX-HD の受信処理へ移行する。
3.MSG_GETCAP_RSP_EVT(codec_type=XX) がきて、対応しているコーデックであれば、OK を返して、対応するコーデックの受信処理へ移行する。
4.MSG_GETCAP_RSP_EVT(codec_type=XX)  で、非対応のコーデックであれば、NG を返す。


と言うパターンで処理します。
上記、プログラムの組み込みを、現状の esp-idf/bt フレームワークの動きの中で、最小限の変更で済むように考えてみます。

その結果、上記組み込みを、コードレベルで要約すると下記になります。

1. bta_av_co_audio_init()::bta_av_co.c に、APTX用 codec_info 処理を組み込んで、内部テーブルを、APTX対応にする。 
↑  ここは、app_main()::main.c の中で、 bt_app_work_dispatch() をコールした時実行されるの、静的な設定です。

2. 次に、Bluetooth のSRC側の機器を動かして、接続をします。
その時に、bta_av_co_audio_setconfig()::bta_av_co.c がコールされたら、SRC側も APTX 対応しているので、OK を返信して、Openステータスに移行する。

3. 上記に反して、bta_av_co_audio_getconfig()::bta_av_co.c がコールされたら、SRC側は、APTX に対応していないので、
その時渡された、codec_type=xx が、SBC であれば、bta_av_co_audio_init() で行った内部テーブルの設定と同じ事を、今度は、SBC 用に設定し直して、下位ルーチンをコールして、codec_type=SBC OK を SRC へ返信して、Openステータスに移行する。

4. 後は、使用コーデックに応じた、音楽データの受信処理を行う。

いずれも、bta_av_co.c の変更で対応出来そうです。

今後の組み込み作業の流れは、
1.APTX codec_info のネゴシエーションを組み込だ状態での、Android Ver5.0 スマホ対応の、SBC の音出し。
2.APTX の Stream Data の受信処理の組み込み。
3.I2S 側の、APTX codec への対応をして、実際の、APTXコーデックでの音出し。

それでは、
1.APTX codec_info のネゴシエーションを組み込だ状態での、Android Ver5.0 スマホ対応の、SBC の音出し。 の作業に入ります。

bta_av_co_audio_getconfig()::bta_av_co.c への、実際の組み込みは、
最終的には、 bta_av_getcap_results()::bta_av_aact.c での変更になりました。

bta_av_aact.c の変更箇所を抜粋します。

上記、プログラムの修正で、
bta_av_co_audio_init() で APTX codec 対応の内部テーブル初期化時でも、Andoriod Ver5.0 スマホで、SBCの音出しが確認できました。


これで、やっと、Windows10+bluetoothドングル で、APTX のデータの実際の受信処理周りの組み込みができるようになりました。
ここからは、じっくりと、該当の受信処理周りを解析して、その後、APTX向けの処理を組み込んで行く事とします。

ここに来る迄、結構、日数が掛かりましたが、まだ、道半ばぞね。 

このブログ記事について

このページは、おんちゃんが2019年1月17日 13:34に書いたブログ記事です。

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

次のブログ記事は「最近のMSN の記事には、ウイルス感染ページが多い。」です。

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

カテゴリ

ウェブページ

サイトナビ