summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apps/app_speech_utils.c18
-rw-r--r--include/asterisk/speech.h4
-rw-r--r--res/res_speech.c6
3 files changed, 25 insertions, 3 deletions
diff --git a/apps/app_speech_utils.c b/apps/app_speech_utils.c
index 3e071c07a..011d655ea 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 5397d8aaa..a914f4846 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 e6fdab9d0..71c283f40 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)
{