#include "bta_api.h"
#include "bta_dm_api.h"
#include "bta_sys.h"
+#include "btif_config.h"
#include "l2c_api.h"
#include "osi/include/osi.h"
#include "port_api.h"
p_scb->cmee_enabled = false;
p_scb->inband_enabled =
((p_scb->features & BTA_AG_FEAT_INBAND) == BTA_AG_FEAT_INBAND);
+ if (p_scb->conn_service == BTA_AG_HFP) {
+ size_t version_value_size = sizeof(p_scb->peer_version);
+ if (!btif_config_get_bin(
+ p_scb->peer_addr.ToString(), HFP_VERSION_CONFIG_KEY,
+ (uint8_t*)&p_scb->peer_version, &version_value_size)) {
+ APPL_TRACE_WARNING("%s: Failed read cached peer HFP version for %s",
+ __func__, p_scb->peer_addr.ToString().c_str());
+ p_scb->peer_version = HFP_HSP_VERSION_UNKNOWN;
+ }
+ }
/* set up AT command interpreter */
p_scb->at_cb.p_at_tbl = bta_ag_at_tbl[p_scb->conn_service];
#include "bta_ag_int.h"
#include "bta_api.h"
#include "bta_sys.h"
+#include "btif_config.h"
#include "btm_api.h"
#include "osi/include/osi.h"
#include "sdp_api.h"
if (service & BTA_HFP_SERVICE_MASK) {
uuid = UUID_SERVCLASS_HF_HANDSFREE;
- p_scb->peer_version = HFP_VERSION_1_1; /* Default version */
+ /* If there is no cached peer version, use default one */
+ if (p_scb->peer_version == HFP_HSP_VERSION_UNKNOWN) {
+ p_scb->peer_version = HFP_VERSION_1_1; /* Default version */
+ }
} else if (service & BTA_HSP_SERVICE_MASK && p_scb->role == BTA_AG_INT) {
uuid = UUID_SERVCLASS_HEADSET_HS;
p_scb->peer_version = HSP_VERSION_1_2; /* Default version */
}
/* get profile version (if failure, version parameter is not updated) */
- if (!SDP_FindProfileVersionInRec(p_rec, uuid, &p_scb->peer_version)) {
+ uint16_t peer_version = HFP_HSP_VERSION_UNKNOWN;
+ if (!SDP_FindProfileVersionInRec(p_rec, uuid, &peer_version)) {
APPL_TRACE_WARNING("%s: Get peer_version failed, using default 0x%04x",
__func__, p_scb->peer_version);
+ peer_version = p_scb->peer_version;
}
- /* get features if HFP */
if (service & BTA_HFP_SERVICE_MASK) {
+ /* Update cached peer version if the new one is different */
+ if (peer_version != p_scb->peer_version) {
+ p_scb->peer_version = peer_version;
+ if (btif_config_set_bin(
+ p_scb->peer_addr.ToString(), HFP_VERSION_CONFIG_KEY,
+ (const uint8_t*)&peer_version, sizeof(peer_version))) {
+ btif_config_save();
+ } else {
+ APPL_TRACE_WARNING("%s: Failed to store peer HFP version for %s",
+ __func__, p_scb->peer_addr.ToString().c_str());
+ }
+ }
+ /* get features if HFP */
p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_SUPPORTED_FEATURES);
if (p_attr != nullptr) {
/* Found attribute. Get value. */
if (p_scb->peer_features == 0)
p_scb->peer_features = p_attr->attr_value.v.u16;
}
- } else /* HSP */
- {
+ } else {
+ /* No peer version caching for HSP, use discovered one directly */
+ p_scb->peer_version = peer_version;
+ /* get features if HSP */
p_attr =
SDP_FindAttributeInRec(p_rec, ATTR_ID_REMOTE_AUDIO_VOLUME_CONTROL);
if (p_attr != nullptr) {
/* Number of SCBs (AG service instances that can be registered) */
#define BTA_AG_MAX_NUM_CLIENTS 6
+#define HFP_HSP_VERSION_UNKNOWN 0x0000
#define HFP_VERSION_1_1 0x0101
#define HFP_VERSION_1_5 0x0105
#define HFP_VERSION_1_6 0x0106
#define HSP_VERSION_1_0 0x0100
#define HSP_VERSION_1_2 0x0102
+#define HFP_VERSION_CONFIG_KEY "HfpVersion"
+
/* Note, if you change the default version here, please also change the one in
* bta_hs_api.h, they are meant to be the same.
*/