web-dev-qa-db-ja.com

AndroidのBluetoothスタックを変更してA2dpシンクを有効にする方法

Bluetoothマイクを使用してオーディオをAndroidデバイス(Nexus 7-rooted Android 4.4.2)に録音するオーディオレコーダーアプリで作業していますブルートゥースマイクは、BluegigaのWT32ブルートゥースモジュール+マイク入力で実装されており、HFPを介したオーディオ品質は良くありませんが、今のところは十分です。

ただし、2つのマイク入力(L/R)があり、WT32はA2dp(ソース)をサポートしているため、BluetoothプロファイルをA2dpに変更しようとしています。多くの調査の結果、stock AndroidはA2dp(シンク)をサポートしておらず、Androidのbluetoothスタックを変更してA2dp(シンク)を有効にすることができます。

私が理解していないのは、どのようにbluetoothスタックにアクセスして変更するかです答えを持つ誰かが故障することができればいいでしょうこれを達成するための手順。

この質問への回答に従ってみました: AndroidでBluetooth経由でオーディオを受信する 、しかし、変更する適切なファイルが見つからないようです。実際、正しいフォルダーを探しているかどうかさえわかりません。 Android-studioのDDMS-File Explorerを介してデバイスファイルを調べました。

ps、私はまだAndroidアプリ開発でかなり新しいので、いくつかの用語を誤用している可能性があり、そのために事前に謝罪します。

15
Eu-Lee

これは実際に私が長い間やろうとしていることです...設定ファイルが見つからない理由は、GoogleがBlueZのBluetoothスタックをGoogleとBroadcomが作成した新しいスタックに置き換えたためです。新しいスタックは別の構成ファイルを使用しますが、これをいじる方法はわかりません。

あなたがそれについて真剣である場合、私が最初に見つけた最も近いものは、Android上のbluetoothフレームワークの公式紹介です: https://source.Android.com/devices/bluetooth.html

7
Avi Shukron

したがって、上記の答えは完全に正しいとは限りません。

以下はどのように分解するかです:

HALは、A2dp、HFP、GATT、SPP、AVRCPなどのサービスのさまざまなステートマシンを制御するため、c/cppコードで実際のBluetoothステートマシンを実装するハードウェアアブストラクションレイヤーです。これらの各サービスは、実際のBluetoothサーバーまたはクライアントデータベースを制御するためのSMPおよびATTファイルも参照します。

HCIは、実際の作業が行われる場所です。 HALは実際にはdo何もしません。使用されている方法で、PCBA上のネットワーク間接続チップにttyシリアル(spi、またはUART)に沿って送信される複雑なデータメッセージを組み立てます。 Android AOSP 4.2.2から現在へのトランクのコンパイル。/external/bluetooth/bluedroid/ディレクトリ内の「BTE」レイヤーにあるHCIレイヤーにあります。-現在ありますこれらのチップのメーカーはいくつかありますが、ほとんどすべてBroadcomベースのicで、wifi、Bluetooth 4.0 Smart、およびBluetooth 4.0無線を含むデュアルまたはトリプルラジオパッケージにパッケージ化されています。

あなたがしようとしていることを行うことは可能ですが、ハードウェア.soとbluetooth_jni.soを、アプリに付属するNDK/JNIパッケージ/プロジェクトに含め、.cppファイルからの呼び出しを介して登録する必要があります「Packages/apps/Bluetooth/jni」にある各Bluetoothサービスに対して、適切に入力されたオブジェクトとして、「com_Android_bluetooth_a2dp.cpp」および「com_Android_bluetooth_avrcp.cpp」のNDKライブラリへの登録を処理します。

もう1つの問題は、独自のカスタムA2DPスタックを実装する必要があることです。Android Bluedroidスタックには、フレームワークに実装されているSinkロールの一部と一部しかありませんA2DP役割にはSource役割の完全な実装があります。さらに、Bluetooth A2DPシンクの実装で実際に何を行うかによっては、Bluetooth SIG(特別インタレストグループ)、シンクの役割を実装すると、AVRCPの「リモートコントロールターゲットデバイス」および「リモートコントロール制御デバイス」なしで、シンクの役割がBluetoothからATTコマンドを実行する場合、主要な問題につながる相互接続要件がありますA2DP(または任意のBluetoothサービス/プロファイル)は、サービスディスカバリプロセス中に特定のハンドシェイクを実行し、関連付けられたゲートウェイ(接続デバイス)が機能要求を実行すると、A2DPサービスがStart StopコマンドのI/O機能を実装することが期待されます。高度なコマンドをスキップ/トラックします。

これに加えて、A2DPを実装する場合、PCMストリームとAACストリームのどちらを処理するかを選択する必要があります。 AACストリーム(または、Pandora、spotifyなどが使用するDRM保護されたPCMストリーム)を処理する場合、実装に適したSBCエンコーダーまたはデコーダーを実装する必要があります。暗号化されたデータ。また、デバイスAudioManagerの実装に適切な速度でビットレートを実装するようにしてください。一部の電話機は48,000hZと一部の44,100hZを使用します。これは、サラウンドサウンド7.1を利用するほとんどのPCM A2DP実装として高品質のオーディオが必要な場合に重要です+は、48,000hZとAACエンコード/デコードを必要とします。

これがあなたにいくらかの洞察を提供することを願っています。

15
Zach

https://Android-review.googlesource.com/#/c/98161/ はA2DPシンクを実装しています。 Nexus 5で動作します。試してみてください。

13
Wenjie Gong

Android OSで時間の経過とともに多くの変更が発生しました。

Android O(Android 8. *)の時点で、シンクプロファイルはGoogleによって部分的にサポートされています。オーディオシンクなどは、プロファイルで有効にすると簡単に機能します。フレームワークでの実装の完了、つまりpackages/app/Bluetooth(いくつかのバグはあるが機能します)しかし、すべてのプロファイルは、btifフレームワークであるHALインターフェイス(btif_rc.cppなど、Android source)を見ることができ、Googleによる古いBluezスタックの代替品です。

私が言ったように、BTシンクは部分的に実装され、進行中の状態です。オーディオなどのBTシンクは、シンクプロファイルとして有効にすると簡単に機能しますが、AVRCPなどのすべてが機能するとは限りません。現在、AOSPコードで、Androidへの着信トラフィックは動作しますが、Androidからリモートデバイスへの発信トラフィックは動作しません。リモートデバイスオブジェクトがスタックに保持されていないため、AVRCPプロファイルが機能するため、アプリ/ BluetoothからのJNI呼び出しはbtif_*.cppファイルのヌルデバイスで失敗します。たとえば、パススルーコマンドの送信は機能しません。 。

そのため、将来的にはBluetoothシンクプロファイルが動作する可能性があります。

AOSPの詳細を確認するには、

  1. packages/app/Bluetooth/のサービス
  2. system/bt/btif/のHAL
2