From af13acdc2987ba74e4c5dc1992a17c0fbe7746ce Mon Sep 17 00:00:00 2001 From: wangmengyang Date: Tue, 7 Mar 2017 21:15:54 +0800 Subject: [PATCH] component/bt: modify a2dp APIs to post event to BTC task --- components/bt/bluedroid/api/esp_a2dp_api.c | 113 ++++++++++++++++++ .../bt/bluedroid/api/include/esp_a2dp_api.h | 6 +- components/bt/bluedroid/btc/core/btc_dm.c | 19 ++- .../bluedroid/btc/profile/std/a2dp/btc_avk.c | 110 +++++++---------- .../btc/profile/std/include/btc_av.h | 11 +- 5 files changed, 186 insertions(+), 73 deletions(-) create mode 100644 components/bt/bluedroid/api/esp_a2dp_api.c diff --git a/components/bt/bluedroid/api/esp_a2dp_api.c b/components/bt/bluedroid/api/esp_a2dp_api.c new file mode 100644 index 0000000000..aa3c5b13e8 --- /dev/null +++ b/components/bt/bluedroid/api/esp_a2dp_api.c @@ -0,0 +1,113 @@ +// Copyright 2015-2016 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include +#include "esp_err.h" +#include "esp_a2dp_api.h" +#include "esp_bt_main.h" +#include "btc_manage.h" +#include "btc_av.h" + +esp_err_t esp_a2d_register_callback(esp_a2d_cb_t callback) +{ + if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) { + return ESP_ERR_INVALID_STATE; + } + + if (callback == NULL) { + return ESP_FAIL; + } + + btc_profile_cb_set(BTC_PID_A2DP, callback); + return ESP_OK; +} + +esp_err_t esp_a2d_sink_init(void) +{ + if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) { + return ESP_ERR_INVALID_STATE; + } + + btc_msg_t msg; + + msg.sig = BTC_SIG_API_CALL; + msg.pid = BTC_PID_A2DP; + msg.act = BTC_AV_SINK_API_INIT_EVT; + + /* Switch to BTC context */ + bt_status_t stat = btc_transfer_context(&msg, NULL, 0, NULL); + return (stat == BT_STATUS_SUCCESS) ? ESP_OK : ESP_FAIL; +} + +esp_err_t esp_a2d_sink_deinit(void) +{ + if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) { + return ESP_ERR_INVALID_STATE; + } + + btc_msg_t msg; + + msg.sig = BTC_SIG_API_CALL; + msg.pid = BTC_PID_A2DP; + msg.act = BTC_AV_SINK_API_DEINIT_EVT; + + /* Switch to BTC context */ + bt_status_t stat = btc_transfer_context(&msg, NULL, 0, NULL); + return (stat == BT_STATUS_SUCCESS) ? ESP_OK : ESP_FAIL; +} + +esp_err_t esp_a2d_sink_connect(esp_bd_addr_t remote_bda) +{ + if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) { + return ESP_ERR_INVALID_STATE; + } + + bt_status_t stat; + btc_av_args_t arg; + btc_msg_t msg; + + msg.sig = BTC_SIG_API_CALL; + msg.pid = BTC_PID_A2DP; + msg.act = BTC_AV_SINK_API_CONNECT_EVT; + + memset(&arg, 0, sizeof(btc_av_args_t)); + + /* Switch to BTC context */ + memcpy(&(arg.connect), remote_bda, sizeof(bt_bdaddr_t)); + stat = btc_transfer_context(&msg, &arg, sizeof(btc_av_args_t), NULL); + return (stat == BT_STATUS_SUCCESS) ? ESP_OK : ESP_FAIL; +} + +esp_err_t esp_a2d_sink_disconnect(esp_bd_addr_t remote_bda) +{ + if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) { + return ESP_ERR_INVALID_STATE; + } + + bt_status_t stat; + btc_av_args_t arg; + btc_msg_t msg; + + msg.sig = BTC_SIG_API_CALL; + msg.pid = BTC_PID_A2DP; + msg.act = BTC_AV_DISCONNECT_REQ_EVT; + + memset(&arg, 0, sizeof(btc_av_args_t)); + + // CHECK_BTAV_INIT(); // todo: move this function + memcpy(&(arg.disconnect), remote_bda, sizeof(bt_bdaddr_t)); + /* Switch to BTC context */ + stat = btc_transfer_context(&msg, &arg, sizeof(btc_av_args_t), NULL); + return (stat == BT_STATUS_SUCCESS) ? ESP_OK : ESP_FAIL; +} diff --git a/components/bt/bluedroid/api/include/esp_a2dp_api.h b/components/bt/bluedroid/api/include/esp_a2dp_api.h index 2d8cadb3c5..82e8f5d4fc 100755 --- a/components/bt/bluedroid/api/include/esp_a2dp_api.h +++ b/components/bt/bluedroid/api/include/esp_a2dp_api.h @@ -186,8 +186,12 @@ esp_err_t esp_a2d_sink_init(void); * * @brief This function is called to deinit and free the resources for A2DP sink module * + * @return + * - ESP_OK: success + * - ESP_FAIL: others + * */ -void esp_a2d_sink_deinit(void); +esp_err_t esp_a2d_sink_deinit(void); /** diff --git a/components/bt/bluedroid/btc/core/btc_dm.c b/components/bt/bluedroid/btc/core/btc_dm.c index 1754ce388e..a4afc98c03 100644 --- a/components/bt/bluedroid/btc/core/btc_dm.c +++ b/components/bt/bluedroid/btc/core/btc_dm.c @@ -183,6 +183,11 @@ tBTA_SERVICE_MASK btc_get_enabled_services_mask(void) return btc_enabled_services; } +void btc_clear_services_mask(void) +{ + btc_enabled_services = 0; +} + static bt_status_t btc_in_execute_service_request(tBTA_SERVICE_ID service_id, BOOLEAN b_enable) { @@ -241,13 +246,23 @@ void btc_dm_sec_cb_handler(btc_msg_t *msg) LOG_DEBUG("btc_dm_upstreams_cback ev: %d\n", msg->act); switch (msg->act) { - case BTA_DM_ENABLE_EVT: + case BTA_DM_ENABLE_EVT: { + btc_clear_services_mask(); btc_storage_load_bonded_devices(); btc_enable_bluetooth_evt(p_data->enable.status); break; - case BTA_DM_DISABLE_EVT: + } + case BTA_DM_DISABLE_EVT: { + tBTA_SERVICE_MASK service_mask = btc_get_enabled_services_mask(); + for (int i = 0; i <= BTA_MAX_SERVICE_ID; i++) { + if (service_mask & + (tBTA_SERVICE_MASK)(BTA_SERVICE_ID_TO_SERVICE_MASK(i))) { + btc_in_execute_service_request(i, FALSE); + } + } btc_disable_bluetooth_evt(); break; + } case BTA_DM_PIN_REQ_EVT: break; case BTA_DM_AUTH_CMPL_EVT: diff --git a/components/bt/bluedroid/btc/profile/std/a2dp/btc_avk.c b/components/bt/bluedroid/btc/profile/std/a2dp/btc_avk.c index c4d6d2632c..b6d5c19f1a 100644 --- a/components/bt/bluedroid/btc/profile/std/a2dp/btc_avk.c +++ b/components/bt/bluedroid/btc/profile/std/a2dp/btc_avk.c @@ -37,6 +37,7 @@ #include "btu.h" #include "bt_utils.h" #include "btc_common.h" +#include "btc_manage.h" /***************************************************************************** ** Constants & Macros @@ -84,19 +85,9 @@ typedef struct { /***************************************************************************** ** Static variables ******************************************************************************/ - -static esp_a2d_cb_t bt_av_sink_callback = NULL; - static btc_av_cb_t btc_av_cb = {0}; static TIMER_LIST_ENT tle_av_open_on_rc; -// TODO: need protection against race -#define BTC_A2D_CB_TO_APP(_event, _param) do { \ - if (bt_av_sink_callback) { \ - bt_av_sink_callback(_event, _param); \ - } \ - } while (0) - /* both interface and media task needs to be ready to alloc incoming request */ #define CHECK_BTAV_INIT() if (btc_av_cb.sm_handle == NULL)\ {\ @@ -145,6 +136,13 @@ extern tBTA_AV_CO_FUNCTS bta_av_a2d_cos; /***************************************************************************** ** Local helper functions ******************************************************************************/ +static inline void btc_a2d_cb_to_app(esp_a2d_cb_event_t event, esp_a2d_cb_param_t *param) +{ + esp_a2d_cb_t btc_a2d_cb = (esp_a2d_cb_t)btc_profile_cb_get(BTC_PID_A2DP); + if (btc_a2d_cb) { + btc_a2d_cb(event, param); + } +} static const char *dump_av_sm_state_name(btc_av_state_t state) { @@ -241,7 +239,7 @@ static void btc_report_connection_state(esp_a2d_connection_state_t state, bt_bda param.conn_stat.disc_rsn = (disc_rsn == 0) ? ESP_A2D_DISC_RSN_NORMAL : ESP_A2D_DISC_RSN_ABNORMAL; } - BTC_A2D_CB_TO_APP(ESP_A2D_CONNECTION_STATE_EVT, ¶m); + btc_a2d_cb_to_app(ESP_A2D_CONNECTION_STATE_EVT, ¶m); } static void btc_report_audio_state(esp_a2d_audio_state_t state, bt_bdaddr_t *bd_addr) @@ -253,7 +251,7 @@ static void btc_report_audio_state(esp_a2d_audio_state_t state, bt_bdaddr_t *bd_ if (bd_addr) { memcpy(param.audio_stat.remote_bda, bd_addr, sizeof(esp_bd_addr_t)); } - BTC_A2D_CB_TO_APP(ESP_A2D_AUDIO_STATE_EVT, ¶m); + btc_a2d_cb_to_app(ESP_A2D_AUDIO_STATE_EVT, ¶m); } /***************************************************************************** @@ -423,7 +421,7 @@ static BOOLEAN btc_av_state_opening_handler(btc_sm_event_t event, void *p_data) esp_a2d_cb_param_t param; memcpy(param.audio_cfg.remote_bda, &btc_av_cb.peer_bda, sizeof(esp_bd_addr_t)); memcpy(¶m.audio_cfg.mcc, p_data, sizeof(esp_a2d_mcc_t)); - BTC_A2D_CB_TO_APP(ESP_A2D_AUDIO_CFG_EVT, ¶m); + btc_a2d_cb_to_app(ESP_A2D_AUDIO_CFG_EVT, ¶m); } } break; @@ -953,22 +951,6 @@ bt_status_t btc_av_init() return BT_STATUS_SUCCESS; } -/** - * - * Function register A2DP callback - * - * Description Initializes the AV interface for sink mode - * - * Returns bt_status_t - * - */ -esp_err_t esp_a2d_register_callback(esp_a2d_cb_t callback) -{ - // TODO: need protection against race - bt_av_sink_callback = callback; - return ESP_OK; -} - /******************************************************************************* ** ** Function init_sink @@ -978,13 +960,13 @@ esp_err_t esp_a2d_register_callback(esp_a2d_cb_t callback) ** Returns bt_status_t ** *******************************************************************************/ -esp_err_t esp_a2d_sink_init(void) +bt_status_t btc_a2d_sink_init(void) { LOG_INFO("%s()\n", __func__); bt_status_t status = btc_av_init(); - return (status == BT_STATUS_SUCCESS) ? ESP_OK : ESP_FAIL; + return status; } /******************************************************************************* @@ -1009,38 +991,14 @@ static bt_status_t connect_int(bt_bdaddr_t *bd_addr, uint16_t uuid) return BT_STATUS_SUCCESS; } -esp_err_t esp_a2d_sink_connect(esp_bd_addr_t remote_bda) +bt_status_t btc_a2d_sink_connect(bt_bdaddr_t* remote_bda) { LOG_INFO("%s\n", __FUNCTION__); CHECK_BTAV_INIT(); - bt_status_t stat; - bt_bdaddr_t bd_addr; - memcpy(&bd_addr, remote_bda, sizeof(bt_bdaddr_t)); - - stat = btc_queue_connect(UUID_SERVCLASS_AUDIO_SINK, &bd_addr, connect_int); - return (stat == BT_STATUS_SUCCESS) ? ESP_OK : ESP_FAIL; + return btc_queue_connect(UUID_SERVCLASS_AUDIO_SINK, remote_bda, connect_int); } -esp_err_t esp_a2d_sink_disconnect(esp_bd_addr_t remote_bda) -{ - bt_status_t stat; - btc_av_args_t arg; - btc_msg_t msg; - - msg.sig = BTC_SIG_API_CALL; - msg.pid = BTC_PID_A2DP; - msg.act = BTC_AV_DISCONNECT_REQ_EVT; - - memset(&arg, 0, sizeof(btc_av_args_t)); - - LOG_INFO("%s\n", __FUNCTION__); - CHECK_BTAV_INIT(); - memcpy(&(arg.disconnect), remote_bda, sizeof(bt_bdaddr_t)); - /* Switch to BTC context */ - stat = btc_transfer_context(&msg, &arg, sizeof(btc_av_args_t), NULL); - return (stat == BT_STATUS_SUCCESS) ? ESP_OK : ESP_FAIL; -} /******************************************************************************* ** ** Function cleanup @@ -1050,7 +1008,7 @@ esp_err_t esp_a2d_sink_disconnect(esp_bd_addr_t remote_bda) ** Returns None ** *******************************************************************************/ -static void cleanup(void) +static void btc_a2d_sink_deinit(void) { LOG_INFO("%s\n", __FUNCTION__); @@ -1066,16 +1024,6 @@ static void cleanup(void) btc_av_cb.sm_handle = NULL; } -void esp_a2d_sink_deinit(void) -{ - LOG_INFO("%s\n", __FUNCTION__); - - if (bt_av_sink_callback) { - bt_av_sink_callback = NULL; - cleanup(); - } -} - /******************************************************************************* ** ** Function btc_av_get_sm_handle @@ -1264,6 +1212,30 @@ void btc_av_clear_remote_suspend_flag(void) void btc_a2dp_evt_handler(btc_msg_t *msg) { - btc_sm_dispatch(btc_av_cb.sm_handle, msg->act, (void *)(msg->arg)); + if (msg->act < BTC_AV_MAX_SM_EVT) { + btc_sm_dispatch(btc_av_cb.sm_handle, msg->act, (void *)(msg->arg)); + } else { + btc_av_args_t *arg = (btc_av_args_t *)(msg->arg); + switch (msg->act) { + case BTC_AV_SINK_API_INIT_EVT: { + btc_a2d_sink_init(); + // todo: callback to application + break; + } + case BTC_AV_SINK_API_DEINIT_EVT: { + btc_a2d_sink_deinit(); + // todo: callback to application + break; + } + case BTC_AV_SINK_API_CONNECT_EVT: { + btc_a2d_sink_connect(&arg->connect); + // todo: callback to application + break; + } + default: + LOG_WARN("%s : unhandled event: %d\n", __FUNCTION__, msg->act); + } + } + btc_av_event_free_data(msg->act, msg->arg); } diff --git a/components/bt/bluedroid/btc/profile/std/include/btc_av.h b/components/bt/bluedroid/btc/profile/std/include/btc_av.h index 6326fca25c..8459623fac 100644 --- a/components/bt/bluedroid/btc/profile/std/include/btc_av.h +++ b/components/bt/bluedroid/btc/profile/std/include/btc_av.h @@ -42,15 +42,24 @@ typedef enum { BTC_AV_START_STREAM_REQ_EVT, BTC_AV_STOP_STREAM_REQ_EVT, BTC_AV_SUSPEND_STREAM_REQ_EVT, - BTC_AV_SINK_CONFIG_REQ_EVT + BTC_AV_SINK_CONFIG_REQ_EVT, + BTC_AV_MAX_SM_EVT } btc_av_sm_event_t; +typedef enum { + BTC_AV_SINK_API_INIT_EVT = BTC_AV_MAX_SM_EVT + 1, + BTC_AV_SINK_API_DEINIT_EVT, + BTC_AV_SINK_API_CONNECT_EVT, +} btc_av_act_t; + /* btc_av_args_t */ typedef union { // BTC_AV_SINK_CONFIG_REQ_EVT esp_a2d_mcc_t mcc; // BTC_AV_DISCONNECT_REQ_EVT bt_bdaddr_t disconnect; + // BTC_AV_SINK_API_CONNECT_EVT + bt_bdaddr_t connect; // Event set--tBTA_AV_EVT tBTA_AV data; } btc_av_args_t; -- 2.40.0