web-dev-qa-db-ja.com

Android A2DPプロファイルの受信者としてのデバイス

基本的に、私が今やろうとしていることは、AndroidデバイスをA2DPレシーバーとして使用し、ペアリングが確立されると、Androidがトランスミッターから受信したサウンドを再生することです。 STPプロファイルを使用すると、ストリーミングの遅延が発生するのではないかと心配しています。それで、A2DPを使用したいのですが、AndroidデバイスをA2DPのレシーバーとして使用することは可能ですか?そしてそれを行う方法?

13
Heewon Hwang

Android Lなので、BlueDriodスタックはA2DPシンクをサポートしていますが、デフォルトでは無効になっています。

これを有効にするには、次のようにします。

/* Enable bluetooth av sink. */
#define BTA_AV_SINK_INCLUDED TRUE

in / 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/ で、これを修正する方法のサンプル実装を見つけることができます。

これらの変更のリストは次のとおりです。

15
nilo

はい。可能です。私はJBでそれを行いました。 Androidは、Broadcomm for Bluetoothの「Bluedroid」スタックを内部的に使用します。以前は、このスタックはA2DPシンクロール(レシーバーとして言及したもの)をサポートしていませんでした。Lollipopリリースから、A2DPシンクロールプロファイルにはは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デコーダレイヤで行われます。

それを構築し、携帯電話にフラッシュして、音楽を楽しみます。

編集:また、BluedroidスタックのA2DP SDPレコードに変更を加えて、A2DPシンクの役割をアドバタイズする必要がある場合があります。

4
theangrylama

1台のデバイスをA2DPシンクおよび他のA2DPソースにする必要があるため、2台の電話間で手動で実行できない場合があります。電話は通常、ソースデバイスのみです(シンクデバイスにストリーミングできるストリームのソース)、シンクはヘッドセットまたはBluetoothスピーカー。

2
Muahmmad Tayyib