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");
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;
}
/*! \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 */
}
/*! \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 */