From: Joshua Colp Date: Wed, 11 Jul 2007 16:19:00 +0000 (+0000) Subject: Allow the native formats of a channel to influence the audio that is going to the... X-Git-Tag: 1.6.0-beta1~3^2~2090 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f8e605fe25980c6e2192696757cdbaee6113c0f4;p=thirdparty%2Fasterisk.git Allow the native formats of a channel to influence the audio that is going to the engine. The best format will try to be chosen with an ultimate fallback to signed linear if possible. git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@74570 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- diff --git a/apps/app_speech_utils.c b/apps/app_speech_utils.c index 422d6e74dd..2df89ba4e2 100644 --- a/apps/app_speech_utils.c +++ b/apps/app_speech_utils.c @@ -352,7 +352,7 @@ static int speech_create(struct ast_channel *chan, void *data) u = ast_module_user_add(chan); /* Request a speech object */ - speech = ast_speech_new(data, AST_FORMAT_SLINEAR); + speech = ast_speech_new(data, chan->nativeformats); if (speech == NULL) { /* Not available */ pbx_builtin_setvar_helper(chan, "ERROR", "1"); @@ -572,7 +572,7 @@ static int speech_background(struct ast_channel *chan, void *data) oldreadformat = chan->readformat; /* Change read format to be signed linear */ - if (ast_set_read_format(chan, AST_FORMAT_SLINEAR)) { + if (ast_set_read_format(chan, speech->format)) { ast_module_user_remove(u); return -1; } diff --git a/include/asterisk/speech.h b/include/asterisk/speech.h index e152201a3e..81b45a7618 100644 --- a/include/asterisk/speech.h +++ b/include/asterisk/speech.h @@ -128,7 +128,7 @@ int ast_speech_results_free(struct ast_speech_result *result); /*! \brief Indicate to the speech engine that audio is now going to start being written */ void ast_speech_start(struct ast_speech *speech); /*! \brief Create a new speech structure */ -struct ast_speech *ast_speech_new(char *engine_name, int format); +struct ast_speech *ast_speech_new(char *engine_name, int formats); /*! \brief Destroy a speech structure */ int ast_speech_destroy(struct ast_speech *speech); /*! \brief Write audio to the speech engine */ diff --git a/res/res_speech.c b/res/res_speech.c index b902f40d7f..e848b06cae 100644 --- a/res/res_speech.c +++ b/res/res_speech.c @@ -159,17 +159,22 @@ int ast_speech_change(struct ast_speech *speech, char *name, const char *value) } /*! \brief Create a new speech structure using the engine specified */ -struct ast_speech *ast_speech_new(char *engine_name, int format) +struct ast_speech *ast_speech_new(char *engine_name, int formats) { struct ast_speech_engine *engine = NULL; struct ast_speech *new_speech = NULL; + int format = AST_FORMAT_SLINEAR; /* Try to find the speech recognition engine that was requested */ if (!(engine = find_engine(engine_name))) return NULL; - /* Make sure the requested format fits */ - if (!(engine->formats & format)) + /* Before even allocating the memory below do some codec negotiation, we choose the best codec possible and fall back to signed linear if possible */ + if ((format = (engine->formats & formats))) + format = ast_best_codec(format); + else if ((engine->formats & AST_FORMAT_SLINEAR)) + format = AST_FORMAT_SLINEAR; + else return NULL; /* Allocate our own speech structure, and try to allocate a structure from the engine too */