mirror of
https://github.com/bluekitchen/btstack.git
synced 2025-03-12 10:13:43 +00:00
hfp: use HFP_SCO_PACKET_TYPES in link settings table
This commit is contained in:
parent
01e5b7274c
commit
352a05047d
@ -1581,14 +1581,14 @@ static const struct link_settings {
|
||||
const bool eSCO;
|
||||
const uint8_t codec;
|
||||
} hfp_link_settings [] = {
|
||||
{ 0xffff, 0xff, 0x03c1, false, HFP_CODEC_CVSD }, // HFP_LINK_SETTINGS_D0, HV1
|
||||
{ 0xffff, 0xff, 0x03c4, false, HFP_CODEC_CVSD }, // HFP_LINK_SETTINGS_D1, HV3
|
||||
{ 0x0007, 0x01, 0x03c8, true, HFP_CODEC_CVSD }, // HFP_LINK_SETTINGS_S1, EV3
|
||||
{ 0x0007, 0x01, 0x0380, true, HFP_CODEC_CVSD }, // HFP_LINK_SETTINGS_S2, 2-EV3
|
||||
{ 0x000a, 0x01, 0x0380, true, HFP_CODEC_CVSD }, // HFP_LINK_SETTINGS_S3, 2-EV3
|
||||
{ 0x000c, 0x02, 0x0380, true, HFP_CODEC_CVSD }, // HFP_LINK_SETTINGS_S4, 2-EV3
|
||||
{ 0x0008, 0x02, 0x03c8, true, HFP_CODEC_MSBC }, // HFP_LINK_SETTINGS_T1, EV3
|
||||
{ 0x000d, 0x02, 0x0380, true, HFP_CODEC_MSBC } // HFP_LINK_SETTINGS_T2, 2-EV3
|
||||
{ 0xffff, 0xff, SCO_PACKET_TYPES_HV1, false, HFP_CODEC_CVSD }, // HFP_LINK_SETTINGS_D0
|
||||
{ 0xffff, 0xff, SCO_PACKET_TYPES_HV3, false, HFP_CODEC_CVSD }, // HFP_LINK_SETTINGS_D1
|
||||
{ 0x0007, 0x01, SCO_PACKET_TYPES_EV3, true, HFP_CODEC_CVSD }, // HFP_LINK_SETTINGS_S1
|
||||
{ 0x0007, 0x01, SCO_PACKET_TYPES_2EV3, true, HFP_CODEC_CVSD }, // HFP_LINK_SETTINGS_S2
|
||||
{ 0x000a, 0x01, SCO_PACKET_TYPES_2EV3, true, HFP_CODEC_CVSD }, // HFP_LINK_SETTINGS_S3
|
||||
{ 0x000c, 0x02, SCO_PACKET_TYPES_2EV3, true, HFP_CODEC_CVSD }, // HFP_LINK_SETTINGS_S4
|
||||
{ 0x0008, 0x02, SCO_PACKET_TYPES_EV3, true, HFP_CODEC_MSBC }, // HFP_LINK_SETTINGS_T1
|
||||
{ 0x000d, 0x02, SCO_PACKET_TYPES_2EV3, true, HFP_CODEC_MSBC } // HFP_LINK_SETTINGS_T2
|
||||
};
|
||||
|
||||
void hfp_setup_synchronous_connection(hfp_connection_t * hfp_connection){
|
||||
@ -1600,8 +1600,10 @@ void hfp_setup_synchronous_connection(hfp_connection_t * hfp_connection){
|
||||
if (hfp_connection->negotiated_codec == HFP_CODEC_MSBC){
|
||||
sco_voice_setting = 0x0043; // Transparent data
|
||||
}
|
||||
// get packet types - bits 6-9 are 'don't allow'
|
||||
uint16_t packet_types = hfp_link_settings[setting].packet_types ^ 0x03c0;
|
||||
hci_send_cmd(&hci_setup_synchronous_connection, hfp_connection->acl_handle, 8000, 8000, hfp_link_settings[setting].max_latency,
|
||||
sco_voice_setting, hfp_link_settings[setting].retransmission_effort, hfp_link_settings[setting].packet_types); // all types 0x003f, only 2-ev3 0x380
|
||||
sco_voice_setting, hfp_link_settings[setting].retransmission_effort, packet_types);
|
||||
}
|
||||
|
||||
void hfp_set_hf_callback(btstack_packet_handler_t callback){
|
||||
@ -1625,7 +1627,7 @@ void hfp_set_hf_run_for_context(void (*callback)(hfp_connection_t * hfp_connecti
|
||||
}
|
||||
|
||||
void hfp_init(void){
|
||||
hfp_allowed_sco_packet_types = HFP_SCO_PACKET_TYPES_NONE;
|
||||
hfp_allowed_sco_packet_types = SCO_PACKET_TYPES_ALL;
|
||||
}
|
||||
|
||||
void hfp_set_sco_packet_types(uint16_t packet_types){
|
||||
@ -1648,9 +1650,9 @@ hfp_link_settings_t hfp_next_link_setting(hfp_link_settings_t current_setting, b
|
||||
// skip wrong codec
|
||||
if ( hfp_link_settings[setting].codec != negotiated_codec) continue;
|
||||
// skip disabled packet types
|
||||
uint16_t required_packet_types = hfp_link_settings[setting].packet_types ^ HFP_SCO_PACKET_TYPES_NONE;
|
||||
uint16_t allowed_packet_types = hfp_allowed_sco_packet_types ^HFP_SCO_PACKET_TYPES_NONE;
|
||||
if ((allowed_packet_types != 0) && ((required_packet_types & allowed_packet_types) == 0)) continue;
|
||||
uint16_t required_packet_types = hfp_link_settings[setting].packet_types;
|
||||
uint16_t allowed_packet_types = hfp_allowed_sco_packet_types;
|
||||
if ((required_packet_types & allowed_packet_types) == 0) continue;
|
||||
|
||||
// found matching setting
|
||||
return (hfp_link_settings_t) setting;
|
||||
|
@ -156,12 +156,6 @@ extern "C" {
|
||||
#define HFP_CODEC_CVSD 0x01
|
||||
#define HFP_CODEC_MSBC 0x02
|
||||
|
||||
#define HFP_SCO_PACKET_TYPES_NONE 0x3c0
|
||||
#define HFP_SCO_PACKET_TYPES_HV1 0x3C1
|
||||
#define HFP_SCO_PACKET_TYPES_HV3 0x3C4
|
||||
#define HFP_SCO_PACKET_TYPES_EV3 0x3C8
|
||||
#define HFP_SCO_PACKET_TYPES_2EV3 0x380
|
||||
|
||||
typedef enum {
|
||||
HFP_ROLE_INVALID = 0,
|
||||
HFP_ROLE_AG,
|
||||
@ -706,13 +700,13 @@ const char * hfp_enhanced_call_mode2str(uint16_t index);
|
||||
const char * hfp_enhanced_call_mpty2str(uint16_t index);
|
||||
|
||||
/**
|
||||
* @brief Set packet types used to accept incoming SCO connection requests
|
||||
* @brief Set packet types for SCO connections
|
||||
* @param common single packet_types: HFP_SCO_PACKET_TYPES_*
|
||||
*/
|
||||
void hfp_set_sco_packet_types(uint16_t packet_types);
|
||||
|
||||
/**
|
||||
* @brief Get packet types used to accept incoming SCO connection requests
|
||||
* @brief Get packet types for SCO connections
|
||||
* @returns packet_types
|
||||
*/
|
||||
uint16_t hfp_get_sco_packet_types(void);
|
||||
|
@ -607,23 +607,27 @@ static void hfp_run_for_context(hfp_connection_t * hfp_connection){
|
||||
if (eSCO && hci_extended_sco_link_supported() && hci_remote_esco_supported(hfp_connection->acl_handle)){
|
||||
max_latency = 0x000c;
|
||||
retransmission_effort = 0x02;
|
||||
packet_types = 0x388;
|
||||
// eSCO: EV3 and 2-EV3
|
||||
packet_types = 0x0048;
|
||||
} else {
|
||||
max_latency = 0xffff;
|
||||
retransmission_effort = 0xff;
|
||||
packet_types = 0x003f;
|
||||
}
|
||||
|
||||
// packet type override
|
||||
if (hfp_get_sco_packet_types() != HFP_SCO_PACKET_TYPES_NONE){
|
||||
packet_types = hfp_get_sco_packet_types();
|
||||
// sco: HV1 and HV3
|
||||
packet_types = 0x005;
|
||||
}
|
||||
|
||||
// mSBC only allows for transparent data
|
||||
uint16_t sco_voice_setting = hci_get_sco_voice_setting();
|
||||
if (hfp_connection->negotiated_codec == HFP_CODEC_MSBC){
|
||||
sco_voice_setting = 0x0043; // Transparent data
|
||||
}
|
||||
|
||||
|
||||
// filter packet types
|
||||
packet_types &= hfp_get_sco_packet_types();
|
||||
|
||||
// bits 6-9 are 'don't allow'
|
||||
packet_types ^= 0x3c0;
|
||||
|
||||
log_info("HFP: sending hci_accept_connection_request, packet types 0x%04x, sco_voice_setting 0x%02x", packet_types, sco_voice_setting);
|
||||
hci_send_cmd(&hci_accept_synchronous_connection, hfp_connection->remote_addr, 8000, 8000, max_latency,
|
||||
sco_voice_setting, retransmission_effort, packet_types);
|
||||
|
@ -7,7 +7,7 @@
|
||||
|
||||
TEST_GROUP(HFPLinkSettings){
|
||||
void setup(void){
|
||||
hfp_set_sco_packet_types(HFP_SCO_PACKET_TYPES_NONE);
|
||||
hfp_set_sco_packet_types(SCO_PACKET_TYPES_ALL);
|
||||
}
|
||||
void teardown(void){
|
||||
}
|
||||
@ -58,24 +58,24 @@ TEST(HFPLinkSettings, D1_D0){
|
||||
|
||||
// initial settings based on packet types
|
||||
TEST(HFPLinkSettings, HV1){
|
||||
hfp_set_sco_packet_types(HFP_SCO_PACKET_TYPES_HV1);
|
||||
hfp_set_sco_packet_types(SCO_PACKET_TYPES_HV1);
|
||||
CHECK_EQUAL(HFP_LINK_SETTINGS_D0, hfp_next_link_setting(HFP_LINK_SETTINGS_NONE, false, true, true, HFP_CODEC_CVSD));
|
||||
CHECK_EQUAL(HFP_LINK_SETTINGS_D0, hfp_next_link_setting(HFP_LINK_SETTINGS_NONE, true, false, true, HFP_CODEC_CVSD));
|
||||
}
|
||||
|
||||
TEST(HFPLinkSettings, HV3){
|
||||
hfp_set_sco_packet_types(HFP_SCO_PACKET_TYPES_HV3);
|
||||
hfp_set_sco_packet_types(SCO_PACKET_TYPES_HV3);
|
||||
CHECK_EQUAL(HFP_LINK_SETTINGS_D1, hfp_next_link_setting(HFP_LINK_SETTINGS_NONE, true, true, false, HFP_CODEC_CVSD));
|
||||
}
|
||||
|
||||
TEST(HFPLinkSettings, EV3){
|
||||
hfp_set_sco_packet_types(HFP_SCO_PACKET_TYPES_EV3);
|
||||
hfp_set_sco_packet_types(SCO_PACKET_TYPES_EV3);
|
||||
CHECK_EQUAL(HFP_LINK_SETTINGS_S1, hfp_next_link_setting(HFP_LINK_SETTINGS_NONE, true, true, true, HFP_CODEC_CVSD));
|
||||
CHECK_EQUAL(HFP_LINK_SETTINGS_T1, hfp_next_link_setting(HFP_LINK_SETTINGS_NONE, true, true, true, HFP_CODEC_MSBC));
|
||||
}
|
||||
|
||||
TEST(HFPLinkSettings, 2EV3){
|
||||
hfp_set_sco_packet_types(HFP_SCO_PACKET_TYPES_2EV3);
|
||||
hfp_set_sco_packet_types(SCO_PACKET_TYPES_2EV3);
|
||||
CHECK_EQUAL(HFP_LINK_SETTINGS_S3, hfp_next_link_setting(HFP_LINK_SETTINGS_NONE, true, true, false, HFP_CODEC_CVSD));
|
||||
CHECK_EQUAL(HFP_LINK_SETTINGS_S4, hfp_next_link_setting(HFP_LINK_SETTINGS_NONE, true, true, true, HFP_CODEC_CVSD));
|
||||
CHECK_EQUAL(HFP_LINK_SETTINGS_T2, hfp_next_link_setting(HFP_LINK_SETTINGS_NONE, true, true, true, HFP_CODEC_MSBC));
|
||||
|
Loading…
x
Reference in New Issue
Block a user