diff options
author | Ben Zhang <benzh@chromium.org> | 2016-09-12 17:59:36 -0700 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2016-09-26 22:16:32 -0700 |
commit | 9d76654d71543e2cb93354a119db8a37b0710047 (patch) | |
tree | 065690ef9efdcae15c2db6bf0a6fc67d863b7363 /cras | |
parent | 0876b3427272a4a22c8274ae8aac8c5fad5da35e (diff) | |
download | adhd-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-api | 14 | ||||
-rw-r--r-- | cras/src/server/cras_alsa_ucm.c | 2 | ||||
-rw-r--r-- | cras/src/server/cras_dbus_control.c | 101 |
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); } |