蓝牙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

你可能感兴趣的:(android,蓝牙)