2015-01-04 31 views
8

基本的に、私が今やっているのは、A2DP受信機としてアンドロイドデバイスを使用し、ペアリングが確立されると、送信機から受信したサウンドを再生します。私はSTPプロファイルを使用すると、ストリーミングの遅延を引き起こす可能性があることを心配しています。だから、私はA2DPを使いたいのですが、これはA2DPの受信機としてAndroidデバイスを使用することは可能ですか?どのようにそれを行うには?A2DPプロファイルの受信機としてのAndroidデバイス

+1

[AndroidでBluetooth経由で音声を受信する](0120-998-501) – virtualxtc

答えて

9

Android L以降、BlueDriodスタックはA2DPシンクをサポートしていますが、デフォルトでは無効になっています。 /external/bluetooth/bluedroid/include/bt_target.h

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

:それは次の操作を行う有効にするには

。 これは、Bluetoothスタックでシンクサポートを有効にします。 /packages/apps/Bluetooth/res/values/config.xml

<!-- Enable sink support. --> 
<bool name="profile_supported_a2dp_sink">true</bool> 

また、あなたは、この変更を行う必要があります。これにより、特定のUIが有効になります。

これで、デバイスをペアリングしてストリーミングを開始できます。残念ながら、パケットを受信して​​もサウンドは聞こえません。その理由は、A2DPシンク用のオーディオルートがないからです。このパッチhttps://android-review.googlesource.com/#/c/98161/のコミットメッセージでは、これを修正する方法のサンプル実装を見つけることができます。

+2

Android 6でこれが有効になっていますか? – rob

+0

あなたが投稿した@niloパッチはアンドロイドアンドロイド-4.4_r1'のためのもので、アンドロイドの '' base''クラス(パッチとの関係)は異なります。例:ファイル 'platform/external/bluetooth/bluedroid/audio_a2dp_hw/audio_a2dp_hw.c'には既に' struct a2dp_stream_in * input; 'があります[audio_a2dp_hw.c line 87](https://android.googlesource.com/platform/external /bluetooth/bluedroid/+/android-5.0.0_r1/audio_a2dp_hw/audio_a2dp_hw.c) – tchelidze

+0

これは、シンク機能がスタックの上位層に実装されているかどうかわかりませんが、ESP32 ICのesp-idfでも有効です。 –

2

はい。可能です。私はJBでそれをしました。 Androidは内部的にBluetooth用Broadcomの「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デコーダレイヤーで行われます。

ビルドして携帯電話に書き込んで音楽を楽しんでください。

EDIT: また、BlueproidスタックのA2DP SDPレコードを変更して、A2DPシンクの役割を宣伝することができます。

+0

このサンプルコードを少しまとめることができますか。私は "関連分野の経験"はありませんが、私はコンパイルしてアプリを書くことができます。私はフィードバックと午後にも感謝します。 –

1

あなたは、ないかもしれないB:ここで

は、これらの変更の一覧です2つの電話機の間で手動で行うことができます.1つのデバイスをストリームするためには、A2DPシンクと他のA2DPソースが必要です。電話機は通常、ソースデバイス(シンクデバイスにストリーミングできるストリームのソース)、シンクはヘッドセットまたはBluetoothスピーカー。

関連する問題