summaryrefslogtreecommitdiff
path: root/cras
diff options
context:
space:
mode:
authorBen Zhang <benzh@chromium.org>2016-09-12 17:59:36 -0700
committerchrome-bot <chrome-bot@chromium.org>2016-09-26 22:16:32 -0700
commit9d76654d71543e2cb93354a119db8a37b0710047 (patch)
tree065690ef9efdcae15c2db6bf0a6fc67d863b7363 /cras
parent0876b3427272a4a22c8274ae8aac8c5fad5da35e (diff)
downloadadhd-9d76654d71543e2cb93354a119db8a37b0710047.tar.gz
CRAS: dbus_control: Allow get/set hotword model via dbus
Similar to the cras_client interface, dbus method: GetNodes() returns a list of supported hotword models. SetHotwordModel() selects a hotword model. BUG=chrome-os-partner:48270 TEST=Verify Chrome HotwordService can get/set hotword models using CrasAudioHandler/CrasAudioClient with the added dbus messages. Verify Chrome receives the appropriate error code from SetHotwordModel dbus METHOD_RETURN when an invalid hotword model name is used. Change-Id: Ie1bdacbfa58f19908f2c98dfbc91e469396239a1 Signed-off-by: Ben Zhang <benzh@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/388911 Reviewed-by: Dylan Reid <dgreid@chromium.org>
Diffstat (limited to 'cras')
-rw-r--r--cras/README.dbus-api14
-rw-r--r--cras/src/server/cras_alsa_ucm.c2
-rw-r--r--cras/src/server/cras_dbus_control.c101
3 files changed, 83 insertions, 34 deletions
diff --git a/cras/README.dbus-api b/cras/README.dbus-api
index d84d31ed..0e96c438 100644
--- a/cras/README.dbus-api
+++ b/cras/README.dbus-api
@@ -107,6 +107,12 @@ Methods void SetOutputVolume(int32 volume)
string MicPositions
The string formed by floating numbers
describing the position of mic array.
+ string HotwordModels
+ A string of comma-separated hotword
+ language model locales supported by this
+ node. e.g. "en_au,en_gb,en_us"
+ The string is empty if the node type is
+ not HOTWORD.
void SetActiveOutputNode(uint64 node_id);
@@ -149,6 +155,14 @@ Methods void SetOutputVolume(int32 volume)
L' = 0.1 * L + 0.9 * R
R' = 0.4 * L + 0.6 * R
+ int32 SetHotwordModel(uint64_t node_id, string model_name)
+
+ Set the hotword language model on the specified node.
+ The node must have type HOTWORD and the model_name must
+ be one of the supported locales returned by
+ GetNodes() HotwordModels string.
+ Returns 0 on success, or a negative errno on failure.
+
Signals OutputVolumeChanged(int32 volume)
Indicates that the output volume level has changed.
diff --git a/cras/src/server/cras_alsa_ucm.c b/cras/src/server/cras_alsa_ucm.c
index 9fa454d3..e5f9c952 100644
--- a/cras/src/server/cras_alsa_ucm.c
+++ b/cras/src/server/cras_alsa_ucm.c
@@ -743,8 +743,6 @@ int ucm_set_hotword_model(snd_use_case_mgr_t *mgr, const char *model)
snprintf(model_mod, model_mod_size,
"%s %s", hotword_model_prefix, model);
if (!ucm_mod_exists_with_name(mgr, model_mod)) {
- syslog(LOG_ERR, "Can not find hotword model modifier %s",
- model_mod);
free((void *)model_mod);
return -EINVAL;
}
diff --git a/cras/src/server/cras_dbus_control.c b/cras/src/server/cras_dbus_control.c
index 2ed52b4e..99721ca6 100644
--- a/cras/src/server/cras_dbus_control.c
+++ b/cras/src/server/cras_dbus_control.c
@@ -96,6 +96,10 @@
" <arg name=\"num_channels\" type=\"i\" direction=\"in\"/>\n" \
" <arg name=\"coefficient\" type=\"ad\" direction=\"in\"/>\n" \
" </method>\n" \
+ " <method name=\"SetHotwordModel\">\n" \
+ " <arg name=\"node_id\" type=\"t\" direction=\"in\"/>\n" \
+ " <arg name=\"model_name\" type=\"s\" direction=\"in\"/>\n" \
+ " </method>\n" \
" </interface>\n" \
" <interface name=\"" DBUS_INTERFACE_INTROSPECTABLE "\">\n" \
" <method name=\"Introspect\">\n" \
@@ -145,6 +149,24 @@ static void send_empty_reply(DBusMessage *message)
dbus_message_unref(reply);
}
+/* Helper to send an int32 reply. */
+static void send_int32_reply(DBusMessage *message, dbus_int32_t value)
+{
+ DBusMessage *reply;
+ dbus_uint32_t serial = 0;
+
+ reply = dbus_message_new_method_return(message);
+ if (!reply)
+ return;
+
+ dbus_message_append_args(reply,
+ DBUS_TYPE_INT32, &value,
+ DBUS_TYPE_INVALID);
+ dbus_connection_send(dbus_control.conn, reply, &serial);
+
+ dbus_message_unref(reply);
+}
+
/* Handlers for exported DBus method calls. */
static DBusHandlerResult handle_set_output_volume(
DBusConnection *conn,
@@ -403,6 +425,7 @@ static dbus_bool_t append_node_dict(DBusMessageIter *iter,
node->plugged_time.tv_usec;
dbus_uint64_t node_volume = node->volume;
dbus_int64_t node_capture_gain = node->capture_gain;
+ char *models, *empty_models = "";
is_input = (direction == CRAS_STREAM_INPUT);
id = node->iodev_idx;
@@ -445,6 +468,16 @@ static dbus_bool_t append_node_dict(DBusMessageIter *iter,
if (!append_key_value(&dict, "NodeCaptureGain", DBUS_TYPE_INT64,
DBUS_TYPE_INT64_AS_STRING, &node_capture_gain))
return FALSE;
+
+ models = cras_iodev_list_get_hotword_models(id);
+ if (!append_key_value(&dict, "HotwordModels", DBUS_TYPE_STRING,
+ DBUS_TYPE_STRING_AS_STRING,
+ models ? &models : &empty_models)) {
+ free(models);
+ return FALSE;
+ }
+ free(models);
+
if (!dbus_message_iter_close_container(iter, &dict))
return FALSE;
@@ -572,18 +605,7 @@ static DBusHandlerResult handle_get_num_active_streams(
DBusMessage *message,
void *arg)
{
- DBusMessage *reply;
- dbus_uint32_t serial = 0;
- dbus_int32_t num;
-
- reply = dbus_message_new_method_return(message);
- num = cras_system_state_get_active_streams();
- dbus_message_append_args(reply,
- DBUS_TYPE_INT32, &num,
- DBUS_TYPE_INVALID);
- dbus_connection_send(dbus_control.conn, reply, &serial);
- dbus_message_unref(reply);
-
+ send_int32_reply(message, cras_system_state_get_active_streams());
return DBUS_HANDLER_RESULT_HANDLED;
}
@@ -592,23 +614,14 @@ static DBusHandlerResult handle_get_num_active_streams_use_input_hw(
DBusMessage *message,
void *arg)
{
- DBusMessage *reply;
- dbus_uint32_t serial = 0;
dbus_int32_t num = 0;
unsigned i;
- reply = dbus_message_new_method_return(message);
-
for (i = 0; i < CRAS_NUM_DIRECTIONS; i++) {
if (cras_stream_uses_input_hw(i))
num += cras_system_state_get_active_streams_by_direction(i);
}
-
- dbus_message_append_args(reply,
- DBUS_TYPE_INT32, &num,
- DBUS_TYPE_INVALID);
- dbus_connection_send(dbus_control.conn, reply, &serial);
- dbus_message_unref(reply);
+ send_int32_reply(message, num);
return DBUS_HANDLER_RESULT_HANDLED;
}
@@ -618,23 +631,14 @@ static DBusHandlerResult handle_get_num_active_streams_use_output_hw(
DBusMessage *message,
void *arg)
{
- DBusMessage *reply;
- dbus_uint32_t serial = 0;
dbus_int32_t num = 0;
unsigned i;
- reply = dbus_message_new_method_return(message);
-
for (i = 0; i < CRAS_NUM_DIRECTIONS; i++) {
if (cras_stream_uses_output_hw(i))
num += cras_system_state_get_active_streams_by_direction(i);
}
-
- dbus_message_append_args(reply,
- DBUS_TYPE_INT32, &num,
- DBUS_TYPE_INVALID);
- dbus_connection_send(dbus_control.conn, reply, &serial);
- dbus_message_unref(reply);
+ send_int32_reply(message, num);
return DBUS_HANDLER_RESULT_HANDLED;
}
@@ -681,6 +685,35 @@ static DBusHandlerResult handle_set_global_output_channel_remix(
return DBUS_HANDLER_RESULT_HANDLED;
}
+static DBusHandlerResult handle_set_hotword_model(
+ DBusConnection *conn,
+ DBusMessage *message,
+ void *arg)
+{
+ cras_node_id_t id;
+ const char *model_name;
+ DBusError dbus_error;
+ dbus_int32_t ret;
+
+ dbus_error_init(&dbus_error);
+
+ if (!dbus_message_get_args(message, &dbus_error,
+ DBUS_TYPE_UINT64, &id,
+ DBUS_TYPE_STRING, &model_name,
+ DBUS_TYPE_INVALID)) {
+ syslog(LOG_WARNING,
+ "Bad method received: %s",
+ dbus_error.message);
+ dbus_error_free(&dbus_error);
+ return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+ }
+
+ ret = cras_iodev_list_set_hotword_model(id, model_name);
+ send_int32_reply(message, ret);
+
+ return DBUS_HANDLER_RESULT_HANDLED;
+}
+
/* Handle incoming messages. */
static DBusHandlerResult handle_control_message(DBusConnection *conn,
DBusMessage *message,
@@ -803,6 +836,10 @@ static DBusHandlerResult handle_control_message(DBusConnection *conn,
"SetGlobalOutputChannelRemix")) {
return handle_set_global_output_channel_remix(
conn, message, arg);
+ } else if (dbus_message_is_method_call(message,
+ CRAS_CONTROL_INTERFACE,
+ "SetHotwordModel")) {
+ return handle_set_hotword_model(conn, message, arg);
}