Allow the native formats of a channel to influence the audio that is going to the...
authorJoshua Colp <jcolp@digium.com>
Wed, 11 Jul 2007 16:19:00 +0000 (16:19 +0000)
committerJoshua Colp <jcolp@digium.com>
Wed, 11 Jul 2007 16:19:00 +0000 (16:19 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@74570 65c4cc65-6c06-0410-ace0-fbb531ad65f3

apps/app_speech_utils.c
include/asterisk/speech.h
res/res_speech.c

index 422d6e7..2df89ba 100644 (file)
@@ -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;
         }
index e152201..81b45a7 100644 (file)
@@ -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 */
index b902f40..e848b06 100644 (file)
@@ -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 */