基本的に、私が今やろうとしているのは、AndroidデバイスをA2DP受信機として使用することです。ペアリングが確立されると、Androidは送信機から受信した音を再生します。STP プロファイルを使用すると、ストリーミングの遅延が発生する可能性があるのではないかと心配しています。それで、A2DPを使いたいのですが、AndroidデバイスをA2DPの受信機として使うことは可能ですか? そしてそれを行う方法は?
3 に答える
Android L 以降、BlueDriod スタックは A2DP シンクをサポートしていますが、デフォルトでは無効になっています。
有効にするには、次の手順を実行します。
/* Enable bluetooth av sink. */
#define BTA_AV_SINK_INCLUDED TRUE
/external/bluetooth/bluedroid/include/bt_target.hで。これにより、Bluetooth スタックでのシンク サポートが有効になります。
また、次の変更を行う必要があります。
<!-- Enable sink support. -->
<bool name="profile_supported_a2dp_sink">true</bool>
/packages/apps/Bluetooth/res/values/config.xmlにあります。これにより、特定の UI が有効になります。
これで、デバイスをペアリングしてストリーミングを開始できます。残念ながら、パケットは受信されますが、音は聞こえません。理由は、A2DP シンクのオーディオ ルートがないためです。このパッチのコミット メッセージhttps://android-review.googlesource.com/#/c/98161/で、これを修正する方法のサンプル実装を見つけることができます。
これらの変更のリストは次のとおりです。
はい。可能です。JBでやりました。Android は、Bluetooth 用に Broadcomm の「Bluedroid」スタックを内部的に使用します。以前は、このスタックは A2DP Sink Role (レシーバーとして言及したもの) をサポートしていませんでした。Lollipop リリースから、A2DP Sink ロール プロファイルが Bluedroid に追加されました。ただし、フレームワーク/上位層(アプリケーション)からは利用できません。フレームワークを有効にするか「使用」するには、フレームワークを変更する必要があります。Android ソース コード内の次のファイルと関連ファイルを参照して、有効にすることができます。
audio.h - put a new audio source
audio_policy.conf - put a new input source for a2dp 'inputs'
AudioManager.java
AudioPolicyManagerBase.cpp
AudioService.java
AudioSystem.java
BluetoothA2dp.java
MediaRecorder.java
A2DPStateMachine.java
などを実装します (このファイル リストは包括的ではありませんが、関連分野での経験があれば理解できます)。ストリーム接続が確立されると、a2dp ステート マシンでコールバックを取得し、そこからスレッドを開始して、「新しい」オーディオ ソースからデコードされた PCM バイトを読み取り、それをメディア プレーヤーに送信する必要があります。SBC コーデックから PCM へのデコードは、'bluedroid' sbc デコーダー レイヤーで行われます。
それをビルドして携帯電話にフラッシュし、音楽を楽しんでください。
編集: また、A2DP シンクの役割をアドバタイズするために、Bluedroid スタックの A2DP SDP レコードを変更する必要がある場合があります。