if (bt_device == NULL) {
pa_log_debug("No SCO connected bt device");
return 0;
- } else
- pa_log_info("Got BT SCO connected device(%u)", bt_device->id);
+ }
+ pa_log_info("Got BT SCO connected device(%u), open param(%d)", bt_device->id, open);
if (pa_tz_device_sco_get_status(bt_device, &sco_status) < 0) {
pa_log_error("get BT SCO status failed");
}
if (open) {
- if (sco_status == DM_DEVICE_BT_SCO_STATUS_CONNECTED) {
- if (pa_tz_device_sco_open(bt_device) < 0) {
- pa_log_error("failed to open BT SCO");
- return -1;
- } else
- pa_log_debug("BT SCO is now opened");
- } else
- pa_log_error("BT SCO is already opened for this BT device");
- } else {
if (sco_status == DM_DEVICE_BT_SCO_STATUS_OPENED) {
- if (pa_tz_device_sco_close(bt_device) < 0) {
- pa_log_error("BT SCO was opened, but failed to close SCO");
- return -1;
- } else
- pa_log_debug("BT SCO is now closed");
- } else
- pa_log_error("BT SCO is already closed for this BT device");
+ pa_log_warn("BT SCO is already opened for this BT device");
+ return 0;
+ }
+
+ if (pa_tz_device_sco_open(bt_device) < 0) {
+ pa_log_error("failed to open BT SCO");
+ return -1;
+ }
+ pa_log_debug("BT SCO is now opened");
+ } else {
+ if (sco_status == DM_DEVICE_BT_SCO_STATUS_CONNECTED) {
+ pa_log_warn("BT SCO is already closed for this BT device");
+ return 0;
+ }
+ if (pa_tz_device_sco_close(bt_device) < 0) {
+ pa_log_error("BT SCO was opened, but failed to close SCO");
+ return -1;
+ }
+ pa_log_debug("BT SCO is now closed");
}
return 0;
}
+static int get_bt_property(pa_device_manager *dm, bool *is_wb, bool *is_nrec) {
+ dm_device_bt_sco_status_t sco_status;
+ pa_tz_device *bt_device;
+
+ pa_assert(dm);
+ pa_assert(is_wb);
+ pa_assert(is_nrec);
+
+ bt_device = _get_sco_connected_device(dm);
+ if (bt_device == NULL) {
+ pa_log_error("No SCO connected bt device");
+ return -1;
+ }
+ if (pa_tz_device_sco_get_status(bt_device, &sco_status) < 0) {
+ pa_log_error("get BT SCO status failed");
+ return -1;
+ }
+
+ pa_log_info("Got BT SCO connected device(%u), status(%d)", bt_device->id, sco_status);
+ if (sco_status == DM_DEVICE_BT_SCO_STATUS_CONNECTED)
+ return -1;
+
+ return pa_tz_device_sco_get_property(bt_device, is_wb, is_nrec);
+}
+
/* Load/Unload module-loopback */
static void update_loopback_module(struct userdata *u, bool load) {
char *args = NULL;
return PA_HOOK_OK;
}
+static void _update_bt_route_option(pa_hal_interface *hal_intf, const char *role, const char* name, int value)
+{
+ hal_route_option route_option;
+
+ memset(&route_option, 0, sizeof(hal_route_option));
+ route_option.role = role;
+ route_option.name = name;
+ route_option.value = value;
+
+ pa_hal_interface_update_route_option(hal_intf, &route_option);
+}
+
/* Change the route setting according to the data from argument.
* This function is called only when it needs to change routing path via HAL.
* - stream is null
bool use_internal_codec = false;
pa_usec_t creation_time = 0;
pa_usec_t latest_creation_time = 0;
+ bool is_wb = false;
+ bool is_nrec = false;
pa_assert(c);
pa_assert(data);
pa_log_error(" ** could not open BT SCO");
continue;
}
+
+ if (get_bt_property(u->device_manager, &is_wb, &is_nrec) == 0) {
+ pa_log_info("bt property : wideband(%d), nrec(%d)", is_wb, is_nrec);
+ _update_bt_route_option(u->hal_interface, route_info.role, "wideband", (int)is_wb);
+ _update_bt_route_option(u->hal_interface, route_info.role, "nrec", (int)is_nrec);
+ } else
+ pa_log_warn("Failed to get property for wideband / nrec....");
} else {
/* update BT SCO: close */
update_bt_sco_state(u->device_manager, false);
return 0;
}
-static int method_call_bt_sco_get_property(pa_dbus_connection *conn, bool *is_wide_band, bool *nrec) {
+static int method_call_bt_sco_get_property(pa_dbus_connection *conn, bool *is_wide_band, bool *is_nrec) {
DBusMessage *msg, *reply;
DBusMessageIter reply_iter, reply_iter_entry;
DBusError err;
unsigned int codec;
+ unsigned int nrec;
const char *property;
pa_assert(conn);
- if (!is_wide_band && !nrec) {
+ if (!is_wide_band && !is_nrec) {
return -1;
}
dbus_message_iter_get_basic(&dict_entry_val, &codec);
pa_log_debug("Codec = [%d]", codec);
*is_wide_band = (codec == BT_MSBC_CODEC_ID) ? true : false;
- } else if (pa_streq("nrec", property) && nrec) {
+ } else if (pa_streq("nrec", property) && is_nrec) {
dbus_message_iter_next(&dict_entry);
dbus_message_iter_recurse(&dict_entry, &dict_entry_val);
if (dbus_message_iter_get_arg_type(&dict_entry_val) != DBUS_TYPE_BOOLEAN)
continue;
- dbus_message_iter_get_basic(&dict_entry_val, nrec);
- pa_log_debug("nrec= [%d]", *nrec);
+ dbus_message_iter_get_basic(&dict_entry_val, &nrec);
+ pa_log_debug("nrec= [%d]", nrec);
+ *is_nrec = nrec;
}
}
dbus_message_iter_next(&reply_iter_entry);
return -1;
}
- pa_log_info("BT SCO Get Property - Success, is wide band : %s, nrec : %s", pa_yes_no(is_wide_band), pa_yes_no(nrec));
+ pa_log_info("BT SCO Get Property - Success, is wide band : %s, nrec : %s", pa_yes_no(*is_wide_band), pa_yes_no(*nrec));
return 0;
}
int pa_tz_device_sco_get_status(pa_tz_device *device, dm_device_bt_sco_status_t *status) {
pa_assert(device);
- pa_log_info("BT SCO get status for device(%u)", device->id);
+ pa_log_debug("BT SCO get status for device(%u)", device->id);
if (device_type_is_equal(device->type, DEVICE_TYPE_BT_SCO) == false) {
pa_log_error("Not BT device");
return -1;
else
*status = DM_DEVICE_BT_SCO_STATUS_OPENED;
- pa_log_debug("BT SCO Get Status, %d", *status);
+ pa_log_info("BT SCO (%u) Get Status, %d", device->id, *status);
return 0;
}