stream-manager: Add Dbus method to update call parameters 83/143183/6
authorSangchul Lee <sc11.lee@samsung.com>
Wed, 9 Aug 2017 02:36:42 +0000 (11:36 +0900)
committerSangchul Lee <sc11.lee@samsung.com>
Wed, 9 Aug 2017 06:19:32 +0000 (15:19 +0900)
  server          : org.pulseaudio.Server
  object path     : /org/pulseaudio/StreamManager
  interface       : org.pulseaudio.StreamManager
  method name     : UpdateCallParameters
  method argument : string for parameters
  return value    : string for return message
                    - success              : "STREAM_MANAGER_RETURN_OK"
                    - no call stream error : "STREAM_MANAGER_RETURN_ERROR_NO_STREAM"
                    - internal error       : "STREAM_MANAGER_RETURN_ERROR_INTERNAL"

[Version] 5.0.168
[Issue Type] New feature

Change-Id: Ie42c240ba0dcf3c62367f15a1ff45aaa330e9db3
Signed-off-by: Sangchul Lee <sc11.lee@samsung.com>
src/stream-manager-dbus-priv.h
src/stream-manager-dbus.c
src/stream-manager.c

index cdadc488037ba7bff142291cd57c3cc3346d8f03..28a2a3fff4736bcc37c2bd52066d8b04dbc98ee7 100644 (file)
@@ -40,6 +40,7 @@
 #define STREAM_MANAGER_METHOD_NAME_UPDATE_FOCUS_STATUS               "UpdateFocusStatus"
 #define STREAM_MANAGER_METHOD_NAME_UPDATE_RESTRICTION                "UpdateRestriction"
 #define STREAM_MANAGER_METHOD_NAME_UPDATE_FOCUS_STATUS_BY_FOCUS_ID   "UpdateFocusStatusByFocusId" /* Similar to UpdateFocusStatus but using focus id, it is only for backward compatibility */
+#define STREAM_MANAGER_METHOD_NAME_UPDATE_CALL_PARAMETERS            "UpdateCallParameters"
 #define STREAM_MANAGER_METHOD_NAME_SET_FILTER                        "SetFilter"
 #define STREAM_MANAGER_METHOD_NAME_UNSET_FILTER                      "UnsetFilter"
 #define STREAM_MANAGER_METHOD_NAME_CONTROL_FILTER                    "ControlFilter"
@@ -63,6 +64,7 @@ enum method_handler_index {
     METHOD_HANDLER_UPDATE_FOCUS_STATUS,
     METHOD_HANDLER_UPDATE_FOCUS_STATUS_BY_FOCUS_ID,
     METHOD_HANDLER_UPDATE_RESTRICTION,
+    METHOD_HANDLER_UPDATE_CALL_PARAMETERS,
     METHOD_HANDLER_SET_FILTER,
     METHOD_HANDLER_UNSET_FILTER,
     METHOD_HANDLER_CONTROL_FILTER,
@@ -169,6 +171,10 @@ pa_dbus_interface_info stream_manager_interface_info = {
     "   <arg name=\"value\" direction=\"in\" type=\"u\"/>"                   \
     "   <arg name=\"ret_msg\" direction=\"out\" type=\"s\"/>"                \
     "  </method>"                                                            \
+    "  <method name=\"STREAM_MANAGER_METHOD_NAME_UPDATE_CALL_PARAMETERS\">"  \
+    "   <arg name=\"parameters\" direction=\"in\" type=\"s\"/>"              \
+    "   <arg name=\"ret_msg\" direction=\"out\" type=\"s\"/>"                \
+    "  </method>"                                                            \
     "  <method name=\"STREAM_MANAGER_METHOD_NAME_SET_FILTER\">"              \
     "   <arg name=\"filter_name\" direction=\"in\" type=\"s\"/>"             \
     "   <arg name=\"filter_parameters\" direction=\"in\" type=\"s\"/>"       \
index a80d5e1d6cfd31ba8aa932049fc3932b859be35c..54db24618d23b0a9642ebe186cc0b27b1fdb9380 100644 (file)
@@ -55,6 +55,7 @@ static void handle_get_current_media_routing_path(DBusConnection *conn, DBusMess
 static void handle_update_focus_status(DBusConnection *conn, DBusMessage *msg, void *userdata);
 static void handle_update_focus_status_by_focus_id(DBusConnection *conn, DBusMessage *msg, void *userdata);
 static void handle_update_restriction(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_update_call_parameters(DBusConnection *conn, DBusMessage *msg, void *userdata);
 static void handle_set_filter(DBusConnection *conn, DBusMessage *msg, void *userdata);
 static void handle_unset_filter(DBusConnection *conn, DBusMessage *msg, void *userdata);
 static void handle_control_filter(DBusConnection *conn, DBusMessage *msg, void *userdata);
@@ -113,6 +114,8 @@ static pa_dbus_arg_info update_focus_status_by_focus_id_args[]  = { { "focus_id"
 static pa_dbus_arg_info update_restriction_args[]  = { { "name", "s", "in" },
                                                       { "value", "u", "in" },
                                                  { "ret_msg", "s", "out" } };
+static pa_dbus_arg_info update_call_parameters_args[]  = { { "parameters", "s", "in" },
+                                                           { "ret_msg", "s", "out" } };
 static pa_dbus_arg_info set_filter_args[] = { { "filter_name",       "s",  "in" },
                                               { "filter_parameters", "s",  "in" },
                                               { "filter_group",      "s",  "in" },
@@ -128,7 +131,7 @@ static pa_dbus_arg_info check_stream_exist_by_pid_args[]  = { { "pid", "u", "in"
                                                       { "stream_type", "s", "in" },
                                                      { "io_direction", "s", "in" },
                                                        { "ret_msg", "s", "out" } };
-static const char* signature_args_for_in[] = { "s", "", "uauau", "usi", "ssu", "ss", "ss", "ssu", "ss", "s", "s", "uu", "iu", "su", "ssss", "s", "sss", "uss"};
+static const char* signature_args_for_in[] = { "s", "", "uauau", "usi", "ssu", "ss", "ss", "ssu", "ss", "s", "s", "uu", "iu", "su", "s", "ssss", "s", "sss", "uss"};
 
 static pa_dbus_method_handler method_handlers[METHOD_HANDLER_MAX] = {
     [METHOD_HANDLER_GET_STREAM_INFO] = {
@@ -201,6 +204,11 @@ static pa_dbus_method_handler method_handlers[METHOD_HANDLER_MAX] = {
         .arguments = update_restriction_args,
         .n_arguments = sizeof(update_restriction_args) / sizeof(pa_dbus_arg_info),
         .receive_cb = handle_update_restriction },
+    [METHOD_HANDLER_UPDATE_CALL_PARAMETERS] = {
+        .method_name = STREAM_MANAGER_METHOD_NAME_UPDATE_CALL_PARAMETERS,
+        .arguments = update_call_parameters_args,
+        .n_arguments = sizeof(update_call_parameters_args) / sizeof(pa_dbus_arg_info),
+        .receive_cb = handle_update_call_parameters },
     [METHOD_HANDLER_SET_FILTER] = {
         .method_name = STREAM_MANAGER_METHOD_NAME_SET_FILTER,
         .arguments = set_filter_args,
@@ -1034,6 +1042,98 @@ fail:
     dbus_message_unref(reply);
 }
 
+#define MAX_CALL_PARAM_SIZE 32
+static int32_t parse_call_parameters(const char *parameters, char *call_type, char *call_domain, char *network_band) {
+    const char delimiter[] = ";";
+    char *token, *ptr = NULL;
+    char key[32] = "";
+
+    pa_assert(parameters);
+    pa_assert(call_type);
+    pa_assert(call_domain);
+    pa_assert(network_band);
+
+    pa_log_info("parameters[%s]", parameters);
+
+    /*Reset the call parameters*/
+    memset(call_type, 0, MAX_CALL_PARAM_SIZE);
+    memset(call_domain, 0, MAX_CALL_PARAM_SIZE);
+    memset(network_band, 0, MAX_CALL_PARAM_SIZE);
+
+    if (parameters) {
+        token = strtok_r((char *)parameters, delimiter, &ptr);
+        while (token) {
+            char *delimiter_ptr = NULL;
+            char *value = NULL;
+
+            delimiter_ptr = strstr(token, "=");
+            if (!delimiter_ptr) {
+                token = strtok_r(NULL, delimiter, &ptr);
+                continue;
+            }
+            strncpy(key, token, delimiter_ptr - token);
+            value = delimiter_ptr + 1;
+            pa_log_debug("key(%s), value(%s)", key, value);
+            if (!strncmp(key, "call-type", strlen("call-type")))
+                pa_strlcpy(call_type, value, MAX_CALL_PARAM_SIZE);
+            else if (!strncmp(key, "call-domain", strlen("call-domain")))
+                pa_strlcpy(call_domain, value, MAX_CALL_PARAM_SIZE);
+            else if (!strncmp(key, "network-band", strlen("network-band")))
+                pa_strlcpy(network_band, value, MAX_CALL_PARAM_SIZE);
+            else
+                pa_log_warn("not supported key(%s)", key);
+
+            token = strtok_r(NULL, delimiter, &ptr);
+            memset(key, 0, sizeof(key));
+        }
+        pa_log_info("call-type[%s], call-domain[%s], network-band[%s]", call_type, call_domain, network_band);
+    }
+
+    return 0;
+}
+
+static void handle_update_call_parameters(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    const char *parameters;
+    DBusMessage *reply = NULL;
+    pa_stream_manager *m = (pa_stream_manager*)userdata;
+    char call_type[MAX_CALL_PARAM_SIZE] = {0,};
+    char call_domain[MAX_CALL_PARAM_SIZE] = {0,};
+    char network_band[MAX_CALL_PARAM_SIZE] = {0,};
+    stream_route_option route_option;
+    ret_msg_t ret = RET_MSG_OK;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(m);
+
+    pa_assert_se(dbus_message_get_args(msg, NULL,
+                                       DBUS_TYPE_STRING, &parameters,
+                                       DBUS_TYPE_INVALID));
+    pa_log_info("parameters[%s]", parameters);
+
+    pa_assert_se((reply = dbus_message_new_method_return(msg)));
+
+    if (parse_call_parameters(parameters, call_type, call_domain, network_band) < 0) {
+        ret = RET_MSG_ERROR_INTERNAL;
+        goto fail;
+    }
+
+    pa_log_debug("call_type[%s], call_domain[%s], network_band[%s]", call_type, call_domain, network_band);
+
+    /* Currently, we only use network band */
+    route_option.name = "call-wideband";
+    if (pa_streq(network_band, "wb"))
+        route_option.value = 1;
+    else
+        route_option.value = 0;
+    ret = do_notify(m, NOTIFY_COMMAND_UPDATE_ROUTE_OPTION, STREAM_SINK_INPUT, false, &route_option);
+
+fail:
+    pa_assert_se(dbus_message_append_args(reply, DBUS_TYPE_STRING, &stream_manager_dbus_ret_str[ret], DBUS_TYPE_INVALID));
+    pa_assert_se(dbus_connection_send(conn, reply, NULL));
+    dbus_message_unref(reply);
+}
+
 static void handle_set_filter(DBusConnection *conn, DBusMessage *msg, void *userdata) {
     const char *filter_name, *filter_parameters, *filter_group, *stream_type;
     DBusMessage *reply = NULL;
index 0c34580a1f38ba3274d72163da97e1f58972da7a..42616f7611fe9e24da5a59fb0ff21f4216b8f69a 100644 (file)
@@ -1670,6 +1670,9 @@ BREAK_WITH_FREE:
             route_option.value = ((stream_route_option*)user_data)->value;
             if (pa_hal_interface_update_route_option(m->hal, &route_option))
                 ret = RET_MSG_ERROR_INTERNAL;
+        } else {
+            pa_log_warn("there's no occupied stream, skip updating route option");
+            ret = RET_MSG_ERROR_NO_STREAM;
         }
         break;
     }