Transfer bt property (wideband, nrec) to HAL when SCO opened 88/104188/3 accepted/tizen/3.0/common/20161215.162935 accepted/tizen/3.0/ivi/20161215.043851 accepted/tizen/3.0/mobile/20161215.043643 accepted/tizen/3.0/tv/20161215.043747 accepted/tizen/3.0/wearable/20161215.043803 submit/tizen_3.0/20161213.132802 submit/tizen_3.0/20161214.084609
authorSeungbae Shin <seungbae.shin@samsung.com>
Mon, 12 Dec 2016 14:11:31 +0000 (23:11 +0900)
committerSeungbae Shin <seungbae.shin@samsung.com>
Tue, 13 Dec 2016 13:21:20 +0000 (22:21 +0900)
[Version] 5.0.105
[Profile] Common
[Issue Type] PLM

Change-Id: I79c4eb61661231c78294a15514ff9dd10dc1e512

packaging/pulseaudio-modules-tizen.spec
src/module-tizenaudio-policy.c
src/tizen-device.c

index ffe3da4..c2ef6c3 100644 (file)
@@ -1,6 +1,6 @@
 Name:             pulseaudio-modules-tizen
 Summary:          Pulseaudio modules for Tizen
-Version:          5.0.104
+Version:          5.0.105
 Release:          0
 Group:            Multimedia/Audio
 License:          LGPL-2.1+
index 040f103..a51c07f 100644 (file)
@@ -252,8 +252,8 @@ static int update_bt_sco_state(pa_device_manager *dm, bool open) {
     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");
@@ -261,28 +261,56 @@ static int update_bt_sco_state(pa_device_manager *dm, bool open) {
     }
 
     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;
@@ -612,6 +640,18 @@ static pa_hook_result_t select_proper_sink_or_source_hook_cb(pa_core *c, pa_stre
     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
@@ -669,6 +709,8 @@ static pa_hook_result_t route_change_hook_cb(pa_core *c, pa_stream_manager_hook_
     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);
@@ -968,6 +1010,13 @@ static pa_hook_result_t route_change_hook_cb(pa_core *c, pa_stream_manager_hook_
                                 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);
index 9279bc4..9b3c36d 100644 (file)
@@ -719,16 +719,17 @@ static int method_call_bt_sco(pa_dbus_connection *conn, bool onoff) {
     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;
     }
 
@@ -767,13 +768,14 @@ static int method_call_bt_sco_get_property(pa_dbus_connection *conn, bool *is_wi
                 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);
@@ -855,7 +857,7 @@ int pa_tz_device_sco_get_property(pa_tz_device *device, bool *is_wide_band, bool
         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;
 }
@@ -864,7 +866,7 @@ int pa_tz_device_sco_get_property(pa_tz_device *device, bool *is_wide_band, bool
 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;
@@ -879,7 +881,7 @@ int pa_tz_device_sco_get_status(pa_tz_device *device, dm_device_bt_sco_status_t
     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;
 }