天天看點

藍牙a2dp協定源碼分析

1,a2dp協定

1.1 a2dp協定

全稱:Advanced Audio Distribution Profile 藍牙音頻傳輸協定

使用場景:主要是通過藍牙将聲音從一個裝置傳輸到另一個裝置。

市場産品:藍牙耳機,藍牙音箱,車載電話等等

協定知識:

    協定包含兩個部分,輸出協定和輸入協定,如果手機(主裝置)和藍牙耳機(從裝置)相連,那麼手機端使用的就是輸出協定,耳機使用的就是輸入協定。

1.2 代碼路徑

用戶端: frameworks\base\core\java\android\bluetooth

  輸出用戶端: BluetoothA2dp.java

輸入用戶端: BluetoothA2dpSink.java

服務端: packages\apps\Bluetooth\src\com\android\bluetooth\a2dp

輸出服務端: A2dpService.java

           A2dpStateMachine.java(狀态機)

輸入服務端: A2dpSinkService.java

           A2dpSinkStateMachine.java

2,接口

2.1, 輸出接口

首先看看輸出端有哪些接口,看看BluetoothA2dp.java有哪些函數。

doBind()是函數在BluetoothA2dp類在構造函數中調用的,主要是将用戶端和對應的服務端A2dpService連接配接起來,finalize方法就像是BluetoothA2dp的析構方法, close方法一般在finalize方法中調用,主要是取消注冊,解除綁定等工作。這幾個方法并不是供外部調用的接口方法,下面論述的才是接口,僅論述主要的接口。

connect: 主要将主裝置和從裝置連接配接起來,形成一條通路

setAvrcpAbsoluteVolume:設定從裝置的聲音大小

adjustAvrcpAbsoluteVolume:也是設定聲音的,僅能輸入4個int值,

AudioManager.ADJUST_LOWER  減小;  AudioManager.ADJUST_RAISE增加

AudioManager.ADJUST_MUTE 靜音; AudioManager.ADJUST_UNMUTE 取消靜音

  接口的調用流程完全一模一樣, adjustAvrcpAbsoluteVolume接口代碼如下,

public void adjustAvrcpAbsoluteVolume(int direction) {

        if (DBG) Log.d(TAG, "adjustAvrcpAbsoluteVolume");

        if (mService != null && isEnabled()) {

            try {

                mService.adjustAvrcpAbsoluteVolume(direction);

                return;

            } catch (RemoteException e) {

               Log.e(TAG, "Error talking to BT service in adjustAvrcpAbsoluteVolume()", e);

                return;

            }

        }

        if (mService == null) Log.w(TAG, "Proxy not attached to service");

}

2.2, 輸入接口

輸入接口好像隻能擷取連接配接的狀态,遠端藍牙位址還有判斷是否在正在傳輸音頻以外,其它的貌似啥也做不了。

     假如手機和藍牙耳機連接配接,手機除了可以調節聲音輸出的大小之外,還能要求耳機做什麼呢?這樣的輸入接口也合情合理。

     想象一下這種場景,主裝置和從裝置通過藍牙連接配接并正在放歌,如何通過從裝置來調整主裝置聲音的大小,以及上一首下一首等,這就需要avrcp協定出場了。

 ———————————————— 

版權聲明:本文為CSDN部落客「Achillisjack」的原創文章,遵循CC 4.0 by-sa版權協定,轉載請附上原文出處連結及本聲明。

原文連結:https://blog.csdn.net/u012439416/article/details/54348099