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);
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" },
{ "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] = {
.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,
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, ¶meters,
+ 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;