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