概述
通常情况下音乐播放与控制这两个profile(即A2DP和AVRCP)都是同时存在的,A2DP分为Sink(SNK)和Source(SRC)两个角色,ACRVP分为Controller(CT)和Target(TG)两个角色。接下来的几篇博客将详细介绍这两个profile。
Sink和Source、CT和TG都是成对出现的。CT和TG可以同时存在在一个设备上,而Sink和Source则不能同时存在在一个设备上(不能同时工作)。角色关系如下:
A2DP profile底层依赖AVDTP协议,AVRCP底层依赖AVCTP协议,它们都基于L2CAP协议实现,SDP支持双方的服务发现。AVDTP协议实现了音频流的传输,A2DP进行角色管理以及编解码;AVRCP实现播放控制与信息同步,控制包括:播放、暂停、上一首、下一首、音量调节等,信息包括播放位置、播放状态、专辑信息、音量同步等。SIG的spec对协议栈定义如下:
接口
flouride协议栈中,A2DP的接口定义如下:
// a2dp source的回调
typedef struct {
size_t size;
// 连接状态变化上报
btav_connection_state_callback connection_state_cb;
// 音频状态变化上报
btav_audio_state_callback audio_state_cb;
// 音频配置变化上报
btav_audio_source_config_callback audio_config_cb;
btav_mandatory_codec_preferred_callback mandatory_codec_preferred_cb;
} btav_source_callbacks_t;
// a2dp source的api
typedef struct {
size_t size;
// 向协议栈注册回调
bt_status_t (*init)(btav_source_callbacks_t* callbacks, int max_connected_audio_devices, const std::vector<btav_a2dp_codec_config_t>& codec_priorities, const std::vector<btav_a2dp_codec_config_t>& offloading_preference);
// 连接指定设备
bt_status_t (*connect)(const RawAddress& bd_addr);
// 端口指定设备
bt_status_t (*disconnect)(const RawAddress& bd_addr);
// 设置指定的设备是否静音
bt_status_t (*set_silence_device)(const RawAddress& bd_addr, bool silence);
// 设置制定的设备为active,有播放时会将音频发送给该设备
bt_status_t (*set_active_device)(const RawAddress& bd_addr);
// 编码器配置
bt_status_t (*config_codec)(const RawAddress& bd_addr, std::vector<btav_a2dp_codec_config_t> codec_preferences);
void (*cleanup)(void);
} btav_source_interface_t