From 0fc114dc656087cd095da88a6572841a41ced193 Mon Sep 17 00:00:00 2001 From: Joshua Colp <jcolp@digium.com> Date: Mon, 1 Oct 2012 12:29:04 +0000 Subject: [PATCH] Add support for retrieving engine specific settings using the speech API and from dialplan. (closes issue ASTERISK-17136) Reported by: kenner git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@374096 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- apps/app_speech_utils.c | 18 +++++++++++++++--- include/asterisk/speech.h | 4 ++++ res/res_speech.c | 6 ++++++ 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/apps/app_speech_utils.c b/apps/app_speech_utils.c index 3e071c07a8..011d655ea5 100644 --- a/apps/app_speech_utils.c +++ b/apps/app_speech_utils.c @@ -213,7 +213,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$"); </function> <function name="SPEECH_ENGINE" language="en_US"> <synopsis> - Change a speech engine specific attribute. + Get or change a speech engine specific attribute. </synopsis> <syntax> <parameter name="name" required="true" /> @@ -401,7 +401,7 @@ static struct ast_custom_function speech_grammar_function = { .write = NULL, }; -/*! \brief SPEECH_ENGINE() Dialplan Function */ +/*! \brief SPEECH_ENGINE() Dialplan Set Function */ static int speech_engine_write(struct ast_channel *chan, const char *cmd, char *data, const char *value) { struct ast_speech *speech = find_speech(chan); @@ -415,9 +415,21 @@ static int speech_engine_write(struct ast_channel *chan, const char *cmd, char * return 0; } +/*! \brief SPEECH_ENGINE() Dialplan Get Function */ +static int speech_engine_read(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len) +{ + struct ast_speech *speech = find_speech(chan); + + if (!data || !speech) { + return -1; + } + + return ast_speech_get_setting(speech, data, buf, len); +} + static struct ast_custom_function speech_engine_function = { .name = "SPEECH_ENGINE", - .read = NULL, + .read = speech_engine_read, .write = speech_engine_write, }; diff --git a/include/asterisk/speech.h b/include/asterisk/speech.h index 5397d8aaad..a914f48466 100644 --- a/include/asterisk/speech.h +++ b/include/asterisk/speech.h @@ -93,6 +93,8 @@ struct ast_speech_engine { int (*start)(struct ast_speech *speech); /*! Change an engine specific setting */ int (*change)(struct ast_speech *speech, const char *name, const char *value); + /*! Get an engine specific setting */ + int (*get_setting)(struct ast_speech *speech, const char *name, char *buf, size_t len); /*! Change the type of results we want back */ int (*change_results_type)(struct ast_speech *speech, enum ast_speech_results_type results_type); /*! Try to get results */ @@ -140,6 +142,8 @@ int ast_speech_write(struct ast_speech *speech, void *data, int len); int ast_speech_dtmf(struct ast_speech *speech, const char *dtmf); /*! \brief Change an engine specific attribute */ int ast_speech_change(struct ast_speech *speech, const char *name, const char *value); +/*! \brief Get an engine specific attribute */ +int ast_speech_get_setting(struct ast_speech *speech, const char *name, char *buf, size_t len); /*! \brief Change the type of results we want */ int ast_speech_change_results_type(struct ast_speech *speech, enum ast_speech_results_type results_type); /*! \brief Change state of a speech structure */ diff --git a/res/res_speech.c b/res/res_speech.c index e6fdab9d09..71c283f409 100644 --- a/res/res_speech.c +++ b/res/res_speech.c @@ -172,6 +172,12 @@ int ast_speech_change(struct ast_speech *speech, const char *name, const char *v return (speech->engine->change ? speech->engine->change(speech, name, value) : -1); } +/*! \brief Get an engine specific attribute */ +int ast_speech_get_setting(struct ast_speech *speech, const char *name, char *buf, size_t len) +{ + return (speech->engine->get_setting ? speech->engine->get_setting(speech, name, buf, len) : -1); +} + /*! \brief Create a new speech structure using the engine specified */ struct ast_speech *ast_speech_new(const char *engine_name, const struct ast_format_cap *cap) { -- GitLab