したがって、上記の答えは完全には正しくありません。
分解方法は次のとおりです。
HAL は、実際の Bluetooth ステート マシンを c/cpp コードで実装するハードウェア抽象化レイヤーであり、A2dp、HFP、GATT、SPP、AVRCP などのサービスのさまざまなステート マシンを制御します。これらの各サービスは、実際の Bluetooth サーバーまたはクライアント データベースを制御するための SMP ファイルと ATT ファイルも参照し、セキュリティを確保します。
HCI は、実際の作業が行われる場所です。HAL は実際には何もしません。HCI レイヤーで使用されるメソッドを介して、PCBA 上のネットワーク間接続されたチップに tty シリアル (spi または UART) に沿って送信される複雑なデータ メッセージを組み立てます。 AOSP 4.2.2 から現在までの Android コンパイル トランクの /external/bluetooth/bluedroid/ ディレクトリの「BTE」レイヤーにあります。- 現在、これらのチップの製造元はいくつかありますが、それらのほとんどは、wifi、Bluetooth 4.0 Smart、および Bluetooth 4.0 ラジオを含むデュアルまたはトリプル ラジオ パッケージにパッケージ化された Broadcom ベースの IC です。
あなたがやろうとしていることをすることは可能ですが、hardware.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 スタックにはフレームワークに実装されたシンクロールの一部しかなく、A2DP ロールにはソースの完全な実装があるためです。役割。さらに、Bluetooth A2DP シンクの実装で実際に何をしようとしているかによっては、AVRCP も実装する必要があります。Bluetooth SIG (特別利益団体) によると、Bluetooth デバイス間の相互接続要件があり、これが大きな問題につながります。 AVRCP「リモート コントロール ターゲット デバイス」および「リモート コントロール コントロール デバイス」なしでシンク ロールを実装する場合、A2DP (または任意の Bluetooth サービス/プロファイル) を介した Bluetooth からのシンク ロール ATT コマンドは、サービス検出プロセス中に特定のハンドシェイクを実行します。関連付けられたゲートウェイ (接続デバイス) は、機能要求を実行します。A2DP サービスは、開始/停止コマンドの I/O 機能を実装することが期待されており、場合によっては事前コマンドをスキップ/追跡します。
これらすべてに加えて、A2DP を実装する場合、PCM ストリームを処理するか、AAC ストリームを処理するかを選択する必要があります。AAC ストリーム (または、Pandora、spotify などが使用する DRM 保護された PCM ストリーム) を処理している場合は、実装に適した SBC エンコーダーまたはデコーダーを実装する必要があります。暗号化されたデータの。また、デバイスの AudioManager 実装に適切な速度でビットレートを実装してください。一部の電話は 48,000hZ を使用し、一部の電話は 44,100hZ を使用します。これは、サラウンド サウンド 7.1 を利用しているほとんどの PCM A2DP 実装と同様に高品質のオーディオが必要な場合に重要です。 + には 48,000hZ と AAC エンコード/デコードが必要です。
これがあなたにいくつかの洞察を提供することを願っています。