mirror of
https://github.com/asterisk/asterisk.git
synced 2025-09-05 12:16:00 +00:00
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
This commit is contained in:
@@ -352,7 +352,7 @@ static int speech_create(struct ast_channel *chan, void *data)
|
|||||||
u = ast_module_user_add(chan);
|
u = ast_module_user_add(chan);
|
||||||
|
|
||||||
/* Request a speech object */
|
/* Request a speech object */
|
||||||
speech = ast_speech_new(data, AST_FORMAT_SLINEAR);
|
speech = ast_speech_new(data, chan->nativeformats);
|
||||||
if (speech == NULL) {
|
if (speech == NULL) {
|
||||||
/* Not available */
|
/* Not available */
|
||||||
pbx_builtin_setvar_helper(chan, "ERROR", "1");
|
pbx_builtin_setvar_helper(chan, "ERROR", "1");
|
||||||
@@ -572,7 +572,7 @@ static int speech_background(struct ast_channel *chan, void *data)
|
|||||||
oldreadformat = chan->readformat;
|
oldreadformat = chan->readformat;
|
||||||
|
|
||||||
/* Change read format to be signed linear */
|
/* 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);
|
ast_module_user_remove(u);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@@ -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 */
|
/*! \brief Indicate to the speech engine that audio is now going to start being written */
|
||||||
void ast_speech_start(struct ast_speech *speech);
|
void ast_speech_start(struct ast_speech *speech);
|
||||||
/*! \brief Create a new speech structure */
|
/*! \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 */
|
/*! \brief Destroy a speech structure */
|
||||||
int ast_speech_destroy(struct ast_speech *speech);
|
int ast_speech_destroy(struct ast_speech *speech);
|
||||||
/*! \brief Write audio to the speech engine */
|
/*! \brief Write audio to the speech engine */
|
||||||
|
@@ -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 */
|
/*! \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_engine *engine = NULL;
|
||||||
struct ast_speech *new_speech = NULL;
|
struct ast_speech *new_speech = NULL;
|
||||||
|
int format = AST_FORMAT_SLINEAR;
|
||||||
|
|
||||||
/* Try to find the speech recognition engine that was requested */
|
/* Try to find the speech recognition engine that was requested */
|
||||||
if (!(engine = find_engine(engine_name)))
|
if (!(engine = find_engine(engine_name)))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
/* Make sure the requested format fits */
|
/* 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 (!(engine->formats & format))
|
if ((format = (engine->formats & formats)))
|
||||||
|
format = ast_best_codec(format);
|
||||||
|
else if ((engine->formats & AST_FORMAT_SLINEAR))
|
||||||
|
format = AST_FORMAT_SLINEAR;
|
||||||
|
else
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
/* Allocate our own speech structure, and try to allocate a structure from the engine too */
|
/* Allocate our own speech structure, and try to allocate a structure from the engine too */
|
||||||
|
Reference in New Issue
Block a user