Просмотр исходного кода

Merge branch 'feature/a2dp-sink-source-runtime-selection' into 'master'

bt-a2dp: BT A2DP sink and source selection is now runtime

See merge request idf/esp-idf!2229
Jiang Jiang Jian 7 лет назад
Родитель
Сommit
affed9a235

+ 2 - 12
components/bt/Kconfig

@@ -162,24 +162,14 @@ config A2DP_ENABLE
     help
     help
         Advanced Audio Distrubution Profile
         Advanced Audio Distrubution Profile
 
 
-choice A2DP_ROLE
-    prompt "A2DP ROLE config"
-    depends on A2DP_ENABLE
-
-config A2DP_SINK_ENABLE
-    bool "SINK"
-config A2DP_SRC_ENABLE
-    bool "SOURCE"
-endchoice
-
 config A2DP_SINK_TASK_STACK_SIZE
 config A2DP_SINK_TASK_STACK_SIZE
     int "A2DP sink (audio stream decoding) task stack size"
     int "A2DP sink (audio stream decoding) task stack size"
-    depends on A2DP_ENABLE && A2DP_SINK_ENABLE
+    depends on A2DP_ENABLE
     default 2048
     default 2048
 
 
 config A2DP_SOURCE_TASK_STACK_SIZE
 config A2DP_SOURCE_TASK_STACK_SIZE
     int "A2DP source (audio stream encoding) task stack size"
     int "A2DP source (audio stream encoding) task stack size"
-    depends on A2DP_ENABLE && A2DP_SRC_ENABLE
+    depends on A2DP_ENABLE
     default 2048
     default 2048
 
 
 config BT_SPP_ENABLED
 config BT_SPP_ENABLED

+ 6 - 5
components/bt/bluedroid/btc/profile/std/a2dp/btc_a2dp.c

@@ -49,9 +49,10 @@ void btc_a2dp_on_init(void)
 
 
 void btc_a2dp_on_idle(void)
 void btc_a2dp_on_idle(void)
 {
 {
-    APPL_TRACE_EVENT("## ON A2DP IDLE ## peer_sep = %d", btc_av_get_peer_sep());
+    APPL_TRACE_EVENT("## ON A2DP IDLE ## peer_sep = %d, service id = %d", btc_av_get_peer_sep(),
+            btc_av_get_service_id());
 #if BTC_AV_SRC_INCLUDED
 #if BTC_AV_SRC_INCLUDED
-    if (btc_av_get_peer_sep() == AVDT_TSEP_SNK) {
+    if (btc_av_get_peer_sep() == AVDT_TSEP_SNK && btc_av_get_service_id() == BTA_A2DP_SOURCE_SERVICE_ID) {
         btc_a2dp_source_on_idle();
         btc_a2dp_source_on_idle();
     }
     }
 #endif // BTC_AV_SRC_INCLUDED
 #endif // BTC_AV_SRC_INCLUDED
@@ -59,7 +60,7 @@ void btc_a2dp_on_idle(void)
     bta_av_co_init();
     bta_av_co_init();
 
 
 #if BTC_AV_SINK_INCLUDED
 #if BTC_AV_SINK_INCLUDED
-    if (btc_av_get_peer_sep() == AVDT_TSEP_SRC) {
+    if (btc_av_get_peer_sep() == AVDT_TSEP_SRC && btc_av_get_service_id() == BTA_A2DP_SINK_SERVICE_ID) {
         btc_a2dp_sink_on_idle();
         btc_a2dp_sink_on_idle();
     }
     }
 #endif // BTC_AV_SINK_INCLUDED
 #endif // BTC_AV_SINK_INCLUDED
@@ -120,7 +121,7 @@ void btc_a2dp_on_stopped(tBTA_AV_SUSPEND *p_av)
 {
 {
     APPL_TRACE_EVENT("## ON A2DP STOPPED ##");
     APPL_TRACE_EVENT("## ON A2DP STOPPED ##");
 #if BTC_AV_SINK_INCLUDED
 #if BTC_AV_SINK_INCLUDED
-    if (btc_av_get_peer_sep() == AVDT_TSEP_SRC) {
+    if (btc_av_get_peer_sep() == AVDT_TSEP_SRC && btc_av_get_service_id() == BTA_A2DP_SINK_SERVICE_ID) {
         btc_a2dp_sink_on_stopped(p_av);
         btc_a2dp_sink_on_stopped(p_av);
         return;
         return;
     }
     }
@@ -140,7 +141,7 @@ void btc_a2dp_on_suspended(tBTA_AV_SUSPEND *p_av)
 {
 {
     APPL_TRACE_EVENT("## ON A2DP SUSPENDED ##");
     APPL_TRACE_EVENT("## ON A2DP SUSPENDED ##");
 #if BTC_AV_SINK_INCLUDED
 #if BTC_AV_SINK_INCLUDED
-    if (btc_av_get_peer_sep() == AVDT_TSEP_SRC) {
+    if (btc_av_get_peer_sep() == AVDT_TSEP_SRC && btc_av_get_service_id() == BTA_A2DP_SINK_SERVICE_ID) {
         btc_a2dp_sink_on_suspended(p_av);
         btc_a2dp_sink_on_suspended(p_av);
         return;
         return;
     }
     }

+ 5 - 4
components/bt/bluedroid/btc/profile/std/a2dp/btc_a2dp_control.c

@@ -75,7 +75,7 @@ void btc_a2dp_control_command_ack(int status)
 static void btc_a2dp_datapath_open(void)
 static void btc_a2dp_datapath_open(void)
 {
 {
 #if BTC_AV_SRC_INCLUDED
 #if BTC_AV_SRC_INCLUDED
-    if (btc_av_get_peer_sep() == AVDT_TSEP_SNK) {
+    if (btc_av_get_peer_sep() == AVDT_TSEP_SNK && btc_av_get_service_id() == BTA_A2DP_SOURCE_SERVICE_ID) {
         /* Start the media task to encode SBC */
         /* Start the media task to encode SBC */
         btc_a2dp_source_start_audio_req();
         btc_a2dp_source_start_audio_req();
 
 
@@ -147,7 +147,7 @@ void btc_a2dp_control_media_ctrl(esp_a2d_media_ctrl_t ctrl)
 
 
             btc_a2dp_dispatch_datapath_evt(BTC_AV_DATAPATH_OPEN_EVT);
             btc_a2dp_dispatch_datapath_evt(BTC_AV_DATAPATH_OPEN_EVT);
 #if (BTC_AV_SINK_INCLUDED == TRUE)
 #if (BTC_AV_SINK_INCLUDED == TRUE)
-            if (btc_av_get_peer_sep() == AVDT_TSEP_SRC) {
+            if (btc_av_get_peer_sep() == AVDT_TSEP_SRC && btc_av_get_service_id() == BTA_A2DP_SINK_SERVICE_ID) {
                 btc_a2dp_control_command_ack(ESP_A2D_MEDIA_CTRL_ACK_SUCCESS);
                 btc_a2dp_control_command_ack(ESP_A2D_MEDIA_CTRL_ACK_SUCCESS);
             }
             }
 #endif
 #endif
@@ -160,7 +160,8 @@ void btc_a2dp_control_media_ctrl(esp_a2d_media_ctrl_t ctrl)
         break;
         break;
     case ESP_A2D_MEDIA_CTRL_STOP:
     case ESP_A2D_MEDIA_CTRL_STOP:
 #if BTC_AV_SRC_INCLUDED
 #if BTC_AV_SRC_INCLUDED
-        if (btc_av_get_peer_sep() == AVDT_TSEP_SNK && !btc_a2dp_source_is_streaming()) {
+        if (btc_av_get_peer_sep() == AVDT_TSEP_SNK && !btc_a2dp_source_is_streaming() &&
+                btc_av_get_service_id() == BTA_A2DP_SOURCE_SERVICE_ID) {
             /* we are already stopped, just ack back*/
             /* we are already stopped, just ack back*/
             btc_a2dp_control_command_ack(ESP_A2D_MEDIA_CTRL_ACK_SUCCESS);
             btc_a2dp_control_command_ack(ESP_A2D_MEDIA_CTRL_ACK_SUCCESS);
             break;
             break;
@@ -168,7 +169,7 @@ void btc_a2dp_control_media_ctrl(esp_a2d_media_ctrl_t ctrl)
 #endif /* BTC_AV_SRC_INCLUDED */
 #endif /* BTC_AV_SRC_INCLUDED */
         btc_dispatch_sm_event(BTC_AV_STOP_STREAM_REQ_EVT, NULL, 0);
         btc_dispatch_sm_event(BTC_AV_STOP_STREAM_REQ_EVT, NULL, 0);
 #if (BTC_AV_SINK_INCLUDED == TRUE)
 #if (BTC_AV_SINK_INCLUDED == TRUE)
-        if (btc_av_get_peer_sep() == AVDT_TSEP_SRC) {
+        if (btc_av_get_peer_sep() == AVDT_TSEP_SRC && btc_av_get_service_id() == BTA_A2DP_SINK_SERVICE_ID) {
             btc_a2dp_control_command_ack(ESP_A2D_MEDIA_CTRL_ACK_SUCCESS);
             btc_a2dp_control_command_ack(ESP_A2D_MEDIA_CTRL_ACK_SUCCESS);
         }
         }
 #endif
 #endif

+ 1 - 0
components/bt/bluedroid/btc/profile/std/a2dp/btc_a2dp_sink.c

@@ -588,6 +588,7 @@ static void btc_a2dp_sink_handle_inc_media(tBT_SBC_HDR *p_msg)
     UINT32 sbc_frame_len = p_msg->len - 1;
     UINT32 sbc_frame_len = p_msg->len - 1;
     availPcmBytes = 2 * sizeof(pcmData);
     availPcmBytes = 2 * sizeof(pcmData);
 
 
+    /* XXX: Check if the below check is correct, we are checking for peer to be sink when we are sink */
     if (btc_av_get_peer_sep() == AVDT_TSEP_SNK || (btc_aa_snk_cb.rx_flush)) {
     if (btc_av_get_peer_sep() == AVDT_TSEP_SNK || (btc_aa_snk_cb.rx_flush)) {
         APPL_TRACE_DEBUG(" State Changed happened in this tick ");
         APPL_TRACE_DEBUG(" State Changed happened in this tick ");
         return;
         return;

+ 17 - 0
components/bt/bluedroid/btc/profile/std/a2dp/btc_av.c

@@ -72,6 +72,7 @@ typedef enum {
 ******************************************************************************/
 ******************************************************************************/
 
 
 typedef struct {
 typedef struct {
+    int service_id;
     tBTA_AV_HNDL bta_handle;
     tBTA_AV_HNDL bta_handle;
     bt_bdaddr_t peer_bda;
     bt_bdaddr_t peer_bda;
     btc_sm_handle_t sm_handle;
     btc_sm_handle_t sm_handle;
@@ -957,6 +958,7 @@ static void btc_av_event_free_data(btc_sm_event_t event, void *p_data)
 static bt_status_t btc_av_init(int service_id)
 static bt_status_t btc_av_init(int service_id)
 {
 {
     if (btc_av_cb.sm_handle == NULL) {
     if (btc_av_cb.sm_handle == NULL) {
+        btc_av_cb.service_id = service_id;
         bool stat = false;
         bool stat = false;
         if (service_id == BTA_A2DP_SOURCE_SERVICE_ID) {
         if (service_id == BTA_A2DP_SOURCE_SERVICE_ID) {
 #if BTC_AV_SRC_INCLUDED
 #if BTC_AV_SRC_INCLUDED
@@ -1265,6 +1267,21 @@ BOOLEAN btc_av_is_connected(void)
     return ((state == BTC_AV_STATE_OPENED) || (state ==  BTC_AV_STATE_STARTED));
     return ((state == BTC_AV_STATE_OPENED) || (state ==  BTC_AV_STATE_STARTED));
 }
 }
 
 
+/*******************************************************************************
+ *
+ * Function         btc_av_get_service_id
+ *
+ * Description      Get the current AV service ID.
+ *
+ * Returns          The stream endpoint type: either BTA_A2DP_SOURCE_SERVICE_ID or
+ *                  BTA_A2DP_SINK_SERVICE_ID.
+ *
+ ******************************************************************************/
+uint8_t btc_av_get_service_id(void)
+{
+    return btc_av_cb.service_id;
+}
+
 /*******************************************************************************
 /*******************************************************************************
  *
  *
  * Function         btc_av_get_peer_sep
  * Function         btc_av_get_peer_sep

+ 12 - 0
components/bt/bluedroid/btc/profile/std/include/btc_av.h

@@ -203,6 +203,18 @@ BOOLEAN btc_av_is_peer_edr(void);
 ********************************************************************************/
 ********************************************************************************/
 void btc_av_clear_remote_suspend_flag(void);
 void btc_av_clear_remote_suspend_flag(void);
 
 
+/*******************************************************************************
+ *
+ * Function         btc_av_get_service_id
+ *
+ * Description      Get the current AV service ID.
+ *
+ * Returns          The stream endpoint type: either BTA_A2DP_SOURCE_SERVICE_ID or
+ *                  BTA_A2DP_SINK_SERVICE_ID.
+ *
+ ******************************************************************************/
+uint8_t btc_av_get_service_id(void);
+
 #endif  ///BTC_AV_INCLUDED == TRUE
 #endif  ///BTC_AV_INCLUDED == TRUE
 
 
 #endif /* __BTC_AV_H__ */
 #endif /* __BTC_AV_H__ */

+ 1 - 7
components/bt/bluedroid/common/include/common/bt_target.h

@@ -61,18 +61,12 @@
 #define AVCT_INCLUDED               TRUE
 #define AVCT_INCLUDED               TRUE
 #define AVRC_INCLUDED               TRUE
 #define AVRC_INCLUDED               TRUE
 #define BTC_AV_INCLUDED             TRUE
 #define BTC_AV_INCLUDED             TRUE
-#endif /* CONFIG_A2DP_ENABLE */
-
-#if CONFIG_A2DP_SINK_ENABLE
 #define BTA_AV_SINK_INCLUDED        TRUE
 #define BTA_AV_SINK_INCLUDED        TRUE
 #define BTC_AV_SINK_INCLUDED        TRUE
 #define BTC_AV_SINK_INCLUDED        TRUE
 #define SBC_DEC_INCLUDED            TRUE
 #define SBC_DEC_INCLUDED            TRUE
-#endif /* CONFIG_A2DP_SINK_ENABLE */
-
-#if CONFIG_A2DP_SRC_ENABLE
 #define BTC_AV_SRC_INCLUDED         TRUE
 #define BTC_AV_SRC_INCLUDED         TRUE
 #define SBC_ENC_INCLUDED            TRUE
 #define SBC_ENC_INCLUDED            TRUE
-#endif /* CONFIG_A2DP_SRC_ENABLE */
+#endif /* CONFIG_A2DP_ENABLE */
 
 
 #if CONFIG_BT_SPP_ENABLED
 #if CONFIG_BT_SPP_ENABLED
 #define RFCOMM_INCLUDED             TRUE
 #define RFCOMM_INCLUDED             TRUE

+ 0 - 2
examples/bluetooth/a2dp_sink/sdkconfig.defaults

@@ -4,8 +4,6 @@ CONFIG_BT_ENABLED=y
 CONFIG_BLUEDROID_ENABLED=y
 CONFIG_BLUEDROID_ENABLED=y
 CONFIG_CLASSIC_BT_ENABLED=y
 CONFIG_CLASSIC_BT_ENABLED=y
 CONFIG_A2DP_ENABLE=y
 CONFIG_A2DP_ENABLE=y
-CONFIG_A2DP_SINK_ENABLE=y
-CONFIG_A2DP_SRC_ENABLE=
 CONFIG_BT_SPP_ENABLED=
 CONFIG_BT_SPP_ENABLED=
 CONFIG_GATTS_ENABLE=
 CONFIG_GATTS_ENABLE=
 CONFIG_GATTC_ENABLE=
 CONFIG_GATTC_ENABLE=

+ 0 - 2
examples/bluetooth/a2dp_source/sdkconfig.defaults

@@ -4,8 +4,6 @@ CONFIG_BT_ENABLED=y
 CONFIG_BLUEDROID_ENABLED=y
 CONFIG_BLUEDROID_ENABLED=y
 CONFIG_CLASSIC_BT_ENABLED=y
 CONFIG_CLASSIC_BT_ENABLED=y
 CONFIG_A2DP_ENABLE=y
 CONFIG_A2DP_ENABLE=y
-CONFIG_A2DP_SINK_ENABLE=
-CONFIG_A2DP_SRC_ENABLE=y
 CONFIG_BT_SPP_ENABLED=
 CONFIG_BT_SPP_ENABLED=
 CONFIG_GATTS_ENABLE=
 CONFIG_GATTS_ENABLE=
 CONFIG_GATTC_ENABLE=
 CONFIG_GATTC_ENABLE=