BT, EMBEDDED, thread joining

Fix a few BT issues (detection & sink name)
End threads on any server missing for too long (except if server IP set
manually)
Still cannot end threads when BT active (works wit I2S)
Thread lokc-up still happens when switching tracks quickly
This commit is contained in:
philippe44
2019-06-30 23:29:34 -07:00
parent e492b57b3b
commit 83f9f3320e
9 changed files with 73 additions and 26 deletions

View File

@@ -123,14 +123,20 @@ static uint32_t s_pkt_cnt = 0;
static TimerHandle_t s_tmr;
static struct {
struct arg_str *sink_name;
struct arg_int *control_delay;
struct arg_int *connect_timeout_delay;
struct arg_end *end;
} squeezelite_args;
int control_delay;
int connect_timeout_delay;
char sink_name[32];
} squeezelite_conf;
void hal_bluetooth_init(const char * options)
{
struct {
struct arg_str *sink_name;
struct arg_int *control_delay;
struct arg_int *connect_timeout_delay;
struct arg_end *end;
} squeezelite_args;
ESP_LOGD(TAG,"Initializing Bluetooth HAL");
squeezelite_args.sink_name = arg_str1("n", "name", "<sink name>", "the name of the bluetooth to connect to");
@@ -162,18 +168,24 @@ void hal_bluetooth_init(const char * options)
if(squeezelite_args.sink_name->count == 0)
{
ESP_LOGD(TAG,"Using default sink name : %s",CONFIG_A2DP_SINK_NAME);
squeezelite_args.sink_name->sval[0] = CONFIG_A2DP_SINK_NAME;
strncpy(squeezelite_conf.sink_name, CONFIG_A2DP_SINK_NAME, 32);
} else {
strncpy(squeezelite_conf.sink_name, squeezelite_args.sink_name->sval[0], 32);
}
if(squeezelite_args.connect_timeout_delay->count == 0)
{
ESP_LOGD(TAG,"Using default connect timeout");
squeezelite_args.connect_timeout_delay->ival[0]=CONFIG_A2DP_CONNECT_TIMEOUT_MS;
squeezelite_conf.connect_timeout_delay=CONFIG_A2DP_CONNECT_TIMEOUT_MS;
} else {
squeezelite_conf.connect_timeout_delay=squeezelite_args.connect_timeout_delay->ival[0];
}
if(squeezelite_args.control_delay->count == 0)
{
ESP_LOGD(TAG,"Using default control delay");
squeezelite_args.control_delay->ival[0]=CONFIG_A2DP_CONTROL_DELAY_MS;
}
squeezelite_conf.control_delay=CONFIG_A2DP_CONTROL_DELAY_MS;
} else {
squeezelite_conf.control_delay=squeezelite_args.control_delay->ival[0];
}
ESP_LOGD(TAG,"Freeing options");
free(argv);
free(opts);
@@ -228,6 +240,20 @@ void hal_bluetooth_init(const char * options)
}
void hal_bluetooth_stop(void) {
/* this still does not work, can't figure out how to stop properly this BT stack */
bt_app_task_shut_down();
ESP_LOGI(TAG, "bt_app_task shutdown successfully");
if (esp_bluedroid_disable() != ESP_OK) return;
ESP_LOGI(TAG, "esp_bluedroid_disable called successfully");
if (esp_bluedroid_deinit() != ESP_OK) return;
ESP_LOGI(TAG, "esp_bluedroid_deinit called successfully");
if (esp_bt_controller_disable() != ESP_OK) return;
ESP_LOGI(TAG, "esp_bt_controller_disable called successfully");
if (esp_bt_controller_deinit() != ESP_OK) return;
ESP_LOGI(TAG, "bt stopped successfully");
}
static void bt_app_a2d_cb(esp_a2d_cb_event_t event, esp_a2d_cb_param_t *param)
{
bt_app_work_dispatch(bt_app_av_sm_hdlr, event, param, sizeof(esp_a2d_cb_param_t), NULL);
@@ -454,7 +480,7 @@ static void filter_inquiry_scan_result(esp_bt_gap_cb_param_t *param)
ESP_LOGI(TAG,"--Device name is %s\n",s_peer_bdname);
}
if (strcmp((char *)s_peer_bdname, CONFIG_A2DP_SINK_NAME) == 0) {
if (strcmp((char *)s_peer_bdname, squeezelite_conf.sink_name) == 0) {
ESP_LOGI(TAG,"Found a target device! address %s, name %s", bda_str, s_peer_bdname);
ESP_LOGI(TAG,"=======================\n");
if(esp_bt_gap_cancel_discovery()!=ESP_ERR_INVALID_STATE)
@@ -470,7 +496,7 @@ static void filter_inquiry_scan_result(esp_bt_gap_cb_param_t *param)
}
else
{
ESP_LOGI(TAG,"Not the device we are looking for. Continuing scan.");
ESP_LOGI(TAG,"Not the device we are looking for (%s). Continuing scan", squeezelite_conf.sink_name);
}
}