2
0
Эх сурвалжийг харах

add volume for BT sink

At this point, I don't understand how to send requests for Play/Pause,
from the ESP32, to the BT controller
philippe44 5 жил өмнө
parent
commit
dbd2e21cca

+ 30 - 1
components/driver_bt/bt_app_sink.c

@@ -25,7 +25,7 @@
 #include "nvs_utilities.h"
 #include "freertos/FreeRTOS.h"
 #include "freertos/task.h"
-
+#include "audio_controls.h"
 #include "sys/lock.h"
 
 // AVRCP used transaction label
@@ -60,6 +60,7 @@ static void bt_av_hdl_a2d_evt(uint16_t event, void *p_param);
 static void bt_av_hdl_avrc_ct_evt(uint16_t event, void *p_param);
 /* avrc TG event handler */
 static void bt_av_hdl_avrc_tg_evt(uint16_t event, void *p_param);
+static void volume_set_by_local_host(uint8_t volume);
 
 static esp_a2d_audio_state_t s_audio_state = ESP_A2D_AUDIO_STATE_STOPPED;
 static const char *s_a2d_conn_state_str[] = {"Disconnected", "Connecting", "Connected", "Disconnecting"};
@@ -69,6 +70,29 @@ static _lock_t s_volume_lock;
 static uint8_t s_volume = 0;
 static bool s_volume_notify;
 
+static void bt_volume_up(void) {
+	volume_set_by_local_host(s_volume + 3);
+	ESP_LOGI(BT_AV_TAG, "BT volume up %u", s_volume);
+}
+
+static void bt_volume_down(void) {
+	volume_set_by_local_host(s_volume - 3);
+	ESP_LOGI(BT_AV_TAG, "BT volume down %u", s_volume);
+}
+
+static void bt_toggle(void) {
+	//btc_a2dp_control_media_ctrl(ESP_A2D_MEDIA_CTL_STOP);
+	//ESP_LOGI(BT_AV_TAG, "PLAY/PAUSE");
+}
+
+static actrls_t controls = {
+	bt_volume_up, bt_volume_down,	// volume up, volume down
+	bt_toggle, NULL,	// toggle, play
+	NULL, NULL,	// pause, stop
+	NULL, NULL,		// rew, fwd
+	NULL, NULL,		// prev, next
+};
+
 /* callback for A2DP sink */
 void bt_app_a2d_cb(esp_a2d_cb_event_t event, esp_a2d_cb_param_t *param)
 {
@@ -144,9 +168,11 @@ static void bt_av_hdl_a2d_evt(uint16_t event, void *p_param)
         if (a2d->conn_stat.state == ESP_A2D_CONNECTION_STATE_DISCONNECTED) {
             esp_bt_gap_set_scan_mode(ESP_BT_CONNECTABLE, ESP_BT_GENERAL_DISCOVERABLE);
 			(*bt_app_a2d_cmd_cb)(BT_SINK_DISCONNECTED);
+			actrls_unset();
         } else if (a2d->conn_stat.state == ESP_A2D_CONNECTION_STATE_CONNECTED){
             esp_bt_gap_set_scan_mode(ESP_BT_NON_CONNECTABLE, ESP_BT_NON_DISCOVERABLE);
 			(*bt_app_a2d_cmd_cb)(BT_SINK_CONNECTED);
+			actrls_set(controls);
         }
         break;
     }
@@ -519,3 +545,6 @@ static void bt_av_hdl_stack_evt(uint16_t event, void *p_param)
     }
 }
 
+
+
+