Wed Jan 8 2020 09:50:19

Asterisk developer's documentation


res_speech.c File Reference

Generic Speech Recognition API. More...

#include "asterisk.h"
#include "asterisk/channel.h"
#include "asterisk/module.h"
#include "asterisk/lock.h"
#include "asterisk/linkedlists.h"
#include "asterisk/cli.h"
#include "asterisk/term.h"
#include "asterisk/speech.h"

Go to the source code of this file.

Data Structures

struct  engines
 

Functions

static void __reg_module (void)
 
static void __unreg_module (void)
 
int ast_speech_change (struct ast_speech *speech, const char *name, const char *value)
 Change an engine specific attribute. More...
 
int ast_speech_change_results_type (struct ast_speech *speech, enum ast_speech_results_type results_type)
 Change the type of results we want. More...
 
int ast_speech_change_state (struct ast_speech *speech, int state)
 Change state of a speech structure. More...
 
int ast_speech_destroy (struct ast_speech *speech)
 Destroy a speech structure. More...
 
int ast_speech_dtmf (struct ast_speech *speech, const char *dtmf)
 Signal to the engine that DTMF was received. More...
 
int ast_speech_grammar_activate (struct ast_speech *speech, const char *grammar_name)
 Activate a loaded (either local or global) grammar. More...
 
int ast_speech_grammar_deactivate (struct ast_speech *speech, const char *grammar_name)
 Deactivate a loaded grammar on a speech structure. More...
 
int ast_speech_grammar_load (struct ast_speech *speech, const char *grammar_name, const char *grammar)
 Load a local grammar on a speech structure. More...
 
int ast_speech_grammar_unload (struct ast_speech *speech, const char *grammar_name)
 Unload a local grammar from a speech structure. More...
 
struct ast_speechast_speech_new (const char *engine_name, int formats)
 Create a new speech structure using the engine specified. More...
 
int ast_speech_register (struct ast_speech_engine *engine)
 Register a speech recognition engine. More...
 
int ast_speech_results_free (struct ast_speech_result *result)
 Free a list of results. More...
 
struct ast_speech_resultast_speech_results_get (struct ast_speech *speech)
 Return the results of a recognition from the speech structure. More...
 
void ast_speech_start (struct ast_speech *speech)
 Start speech recognition on a speech structure. More...
 
int ast_speech_unregister (const char *engine_name)
 Unregister a speech recognition engine. More...
 
int ast_speech_write (struct ast_speech *speech, void *data, int len)
 Write in signed linear audio to be recognized. More...
 
 ASTERISK_FILE_VERSION (__FILE__,"$Revision: 368738 $")
 
static struct ast_speech_enginefind_engine (const char *engine_name)
 Find a speech recognition engine of specified name, if NULL then use the default one. More...
 
static int load_module (void)
 
static int unload_module (void)
 

Variables

static struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_GLOBAL_SYMBOLS | AST_MODFLAG_LOAD_ORDER , .description = "Generic Speech Recognition API" , .key = "This paragraph is copyright (c) 2006 by Digium, Inc. \In order for your module to load, it must return this \key via a function called \"key\". Any code which \includes this paragraph must be licensed under the GNU \General Public License version 2 or later (at your \option). In addition to Digium's general reservations \of rights, Digium expressly reserves the right to \allow other parties to license this paragraph under \different terms. Any use of Digium, Inc. trademarks or \logos (including \"Asterisk\" or \"Digium\") without \express written permission of Digium, Inc. is prohibited.\n" , .buildopt_sum = "ac1f6a56484a8820659555499174e588" , .load = load_module, .unload = unload_module, .load_pri = AST_MODPRI_APP_DEPEND, }
 
static struct ast_module_infoast_module_info = &__mod_info
 
static struct ast_speech_enginedefault_engine = NULL
 
static struct engines engines = { .first = NULL, .last = NULL, .lock = { PTHREAD_RWLOCK_INITIALIZER , NULL, 1 } , }
 

Detailed Description

Generic Speech Recognition API.

Author
Joshua Colp jcolp.nosp@m.@dig.nosp@m.ium.c.nosp@m.om

Definition in file res_speech.c.

Function Documentation

static void __reg_module ( void  )
static

Definition at line 347 of file res_speech.c.

static void __unreg_module ( void  )
static

Definition at line 347 of file res_speech.c.

int ast_speech_change ( struct ast_speech speech,
const char *  name,
const char *  value 
)

Change an engine specific attribute.

Definition at line 170 of file res_speech.c.

References ast_speech_engine::change, and ast_speech::engine.

Referenced by handle_speechset(), and speech_engine_write().

171 {
172  return (speech->engine->change ? speech->engine->change(speech, name, value) : -1);
173 }
int(* change)(struct ast_speech *speech, const char *name, const char *value)
Definition: speech.h:95
int value
Definition: syslog.c:39
struct ast_speech_engine * engine
Definition: speech.h:69
static const char name[]
int ast_speech_change_results_type ( struct ast_speech speech,
enum ast_speech_results_type  results_type 
)

Change the type of results we want.

Definition at line 264 of file res_speech.c.

References ast_speech_engine::change_results_type, ast_speech::engine, and ast_speech::results_type.

Referenced by speech_results_type_write().

265 {
266  speech->results_type = results_type;
267 
268  return (speech->engine->change_results_type ? speech->engine->change_results_type(speech, results_type) : 0);
269 }
int(* change_results_type)(struct ast_speech *speech, enum ast_speech_results_type results_type)
Definition: speech.h:97
enum ast_speech_results_type results_type
Definition: speech.h:67
struct ast_speech_engine * engine
Definition: speech.h:69
int ast_speech_change_state ( struct ast_speech speech,
int  state 
)

Change state of a speech structure.

Definition at line 249 of file res_speech.c.

References ast_set_flag, AST_SPEECH_SPOKE, AST_SPEECH_STATE_WAIT, ast_speech::state, and state.

Referenced by ast_speech_new(), handle_speechrecognize(), and speech_background().

250 {
251  int res = 0;
252 
253  if (state == AST_SPEECH_STATE_WAIT) {
254  /* The engine heard audio, so they spoke */
256  }
257 
258  speech->state = state;
259 
260  return res;
261 }
enum sip_cc_notify_state state
Definition: chan_sip.c:842
int state
Definition: speech.h:59
#define ast_set_flag(p, flag)
Definition: utils.h:70
int ast_speech_destroy ( struct ast_speech speech)

Destroy a speech structure.

Definition at line 224 of file res_speech.c.

References ast_free, ast_mutex_destroy, ast_speech_results_free(), ast_speech_engine::destroy, ast_speech::engine, ast_speech::lock, ast_speech::processing_sound, and ast_speech::results.

Referenced by destroy_callback(), handle_speechdestroy(), launch_asyncagi(), run_agi(), and speech_create().

225 {
226  int res = 0;
227 
228  /* Call our engine so we are destroyed properly */
229  speech->engine->destroy(speech);
230 
231  /* Deinitialize the lock */
232  ast_mutex_destroy(&speech->lock);
233 
234  /* If results exist on the speech structure, destroy them */
235  if (speech->results)
237 
238  /* If a processing sound is set - free the memory used by it */
239  if (speech->processing_sound)
240  ast_free(speech->processing_sound);
241 
242  /* Aloha we are done */
243  ast_free(speech);
244 
245  return res;
246 }
struct ast_speech_engine * engine
Definition: speech.h:69
struct ast_speech_result * results
Definition: speech.h:65
#define ast_free(a)
Definition: astmm.h:97
int ast_speech_results_free(struct ast_speech_result *result)
Free a set of results.
Definition: res_speech.c:97
ast_mutex_t lock
Definition: speech.h:53
char * processing_sound
Definition: speech.h:57
#define ast_mutex_destroy(a)
Definition: lock.h:154
int(* destroy)(struct ast_speech *speech)
Definition: speech.h:79
int ast_speech_dtmf ( struct ast_speech speech,
const char *  dtmf 
)

Signal to the engine that DTMF was received.

Definition at line 155 of file res_speech.c.

References AST_SPEECH_STATE_READY, ast_speech_engine::dtmf, ast_speech::engine, and ast_speech::state.

Referenced by speech_background().

156 {
157  int res = 0;
158 
159  if (speech->state != AST_SPEECH_STATE_READY)
160  return -1;
161 
162  if (speech->engine->dtmf != NULL) {
163  res = speech->engine->dtmf(speech, dtmf);
164  }
165 
166  return res;
167 }
int state
Definition: speech.h:59
int(* dtmf)(struct ast_speech *speech, const char *dtmf)
Definition: speech.h:91
struct ast_speech_engine * engine
Definition: speech.h:69
int ast_speech_grammar_activate ( struct ast_speech speech,
const char *  grammar_name 
)

Activate a loaded (either local or global) grammar.

Activate a grammar on a speech structure.

Definition at line 67 of file res_speech.c.

References ast_speech_engine::activate, and ast_speech::engine.

Referenced by handle_speechactivategrammar(), and speech_activate().

68 {
69  return (speech->engine->activate ? speech->engine->activate(speech, grammar_name) : -1);
70 }
int(* activate)(struct ast_speech *speech, const char *grammar_name)
Definition: speech.h:85
struct ast_speech_engine * engine
Definition: speech.h:69
int ast_speech_grammar_deactivate ( struct ast_speech speech,
const char *  grammar_name 
)

Deactivate a loaded grammar on a speech structure.

Deactivate a grammar on a speech structure.

Definition at line 73 of file res_speech.c.

References ast_speech_engine::deactivate, and ast_speech::engine.

Referenced by handle_speechdeactivategrammar(), and speech_deactivate().

74 {
75  return (speech->engine->deactivate ? speech->engine->deactivate(speech, grammar_name) : -1);
76 }
struct ast_speech_engine * engine
Definition: speech.h:69
int(* deactivate)(struct ast_speech *speech, const char *grammar_name)
Definition: speech.h:87
int ast_speech_grammar_load ( struct ast_speech speech,
const char *  grammar_name,
const char *  grammar 
)

Load a local grammar on a speech structure.

Load a grammar on a speech structure (not globally)

Definition at line 79 of file res_speech.c.

References ast_speech::engine, and ast_speech_engine::load.

Referenced by handle_speechloadgrammar(), and speech_load().

80 {
81  return (speech->engine->load ? speech->engine->load(speech, grammar_name, grammar) : -1);
82 }
struct ast_speech_engine * engine
Definition: speech.h:69
int(* load)(struct ast_speech *speech, const char *grammar_name, const char *grammar)
Definition: speech.h:81
int ast_speech_grammar_unload ( struct ast_speech speech,
const char *  grammar_name 
)

Unload a local grammar from a speech structure.

Unload a grammar.

Definition at line 85 of file res_speech.c.

References ast_speech::engine, and ast_speech_engine::unload.

Referenced by handle_speechunloadgrammar(), and speech_unload().

86 {
87  return (speech->engine->unload ? speech->engine->unload(speech, grammar_name) : -1);
88 }
struct ast_speech_engine * engine
Definition: speech.h:69
int(* unload)(struct ast_speech *speech, const char *grammar_name)
Definition: speech.h:83
struct ast_speech* ast_speech_new ( const char *  engine_name,
int  formats 
)

Create a new speech structure using the engine specified.

Create a new speech structure.

Definition at line 176 of file res_speech.c.

References ast_best_codec(), ast_calloc, AST_FORMAT_SLINEAR, ast_free, ast_mutex_destroy, ast_mutex_init, ast_speech_change_state(), AST_SPEECH_STATE_NOT_READY, ast_speech_engine::create, ast_speech::engine, find_engine(), ast_speech::format, format, ast_speech_engine::formats, ast_speech::lock, and ast_speech::results.

Referenced by handle_speechcreate(), and speech_create().

177 {
178  struct ast_speech_engine *engine = NULL;
179  struct ast_speech *new_speech = NULL;
181 
182  /* Try to find the speech recognition engine that was requested */
183  if (!(engine = find_engine(engine_name)))
184  return NULL;
185 
186  /* Before even allocating the memory below do some codec negotiation, we choose the best codec possible and fall back to signed linear if possible */
187  if ((format = (engine->formats & formats)))
188  format = ast_best_codec(format);
189  else if ((engine->formats & AST_FORMAT_SLINEAR))
190  format = AST_FORMAT_SLINEAR;
191  else
192  return NULL;
193 
194  /* Allocate our own speech structure, and try to allocate a structure from the engine too */
195  if (!(new_speech = ast_calloc(1, sizeof(*new_speech))))
196  return NULL;
197 
198  /* Initialize the lock */
199  ast_mutex_init(&new_speech->lock);
200 
201  /* Make sure no results are present */
202  new_speech->results = NULL;
203 
204  /* Copy over our engine pointer */
205  new_speech->engine = engine;
206 
207  /* Can't forget the format audio is going to be in */
208  new_speech->format = format;
209 
210  /* We are not ready to accept audio yet */
212 
213  /* Pass ourselves to the engine so they can set us up some more and if they error out then do not create a structure */
214  if (engine->create(new_speech, format)) {
215  ast_mutex_destroy(&new_speech->lock);
216  ast_free(new_speech);
217  new_speech = NULL;
218  }
219 
220  return new_speech;
221 }
format_t ast_best_codec(format_t fmts)
Pick the best audio codec.
Definition: channel.c:1062
int ast_speech_change_state(struct ast_speech *speech, int state)
Change state of a speech structure.
Definition: res_speech.c:249
int(* create)(struct ast_speech *speech, int format)
Definition: speech.h:77
struct ast_speech_engine * engine
Definition: speech.h:69
struct ast_speech_result * results
Definition: speech.h:65
Definition: file.c:65
#define ast_free(a)
Definition: astmm.h:97
int format
Definition: speech.h:61
static struct ast_speech_engine * find_engine(const char *engine_name)
Find a speech recognition engine of specified name, if NULL then use the default one.
Definition: res_speech.c:47
ast_mutex_t lock
Definition: speech.h:53
#define AST_FORMAT_SLINEAR
Definition: frame.h:254
#define ast_calloc(a, b)
Definition: astmm.h:82
#define ast_mutex_init(pmutex)
Definition: lock.h:152
#define ast_mutex_destroy(a)
Definition: lock.h:154
static snd_pcm_format_t format
Definition: chan_alsa.c:93
int ast_speech_register ( struct ast_speech_engine engine)

Register a speech recognition engine.

Definition at line 272 of file res_speech.c.

References ast_log(), AST_RWLIST_INSERT_HEAD, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, ast_verb, ast_speech_engine::create, ast_speech_engine::destroy, ast_speech::engine, find_engine(), LOG_WARNING, ast_speech_engine::name, and ast_speech_engine::write.

273 {
274  int res = 0;
275 
276  /* Confirm the engine meets the minimum API requirements */
277  if (!engine->create || !engine->write || !engine->destroy) {
278  ast_log(LOG_WARNING, "Speech recognition engine '%s' did not meet minimum API requirements.\n", engine->name);
279  return -1;
280  }
281 
282  /* If an engine is already loaded with this name, error out */
283  if (find_engine(engine->name)) {
284  ast_log(LOG_WARNING, "Speech recognition engine '%s' already exists.\n", engine->name);
285  return -1;
286  }
287 
288  ast_verb(2, "Registered speech recognition engine '%s'\n", engine->name);
289 
290  /* Add to the engine linked list and make default if needed */
292  AST_RWLIST_INSERT_HEAD(&engines, engine, list);
293  if (!default_engine) {
295  ast_verb(2, "Made '%s' the default speech recognition engine\n", engine->name);
296  }
298 
299  return res;
300 }
#define AST_RWLIST_WRLOCK(head)
Write locks a list.
Definition: linkedlists.h:51
#define LOG_WARNING
Definition: logger.h:144
#define AST_RWLIST_UNLOCK(head)
Attempts to unlock a read/write based list.
Definition: linkedlists.h:150
static struct ast_speech_engine * default_engine
Definition: res_speech.c:44
char * name
Definition: speech.h:75
#define ast_verb(level,...)
Definition: logger.h:243
#define AST_RWLIST_INSERT_HEAD
Definition: linkedlists.h:703
int(* create)(struct ast_speech *speech, int format)
Definition: speech.h:77
struct ast_speech_engine * engine
Definition: speech.h:69
int(* write)(struct ast_speech *speech, void *data, int len)
Definition: speech.h:89
void ast_log(int level, const char *file, int line, const char *function, const char *fmt,...)
Used for sending a log message This is the standard logger function. Probably the only way you will i...
Definition: logger.c:1207
static struct ast_speech_engine * find_engine(const char *engine_name)
Find a speech recognition engine of specified name, if NULL then use the default one.
Definition: res_speech.c:47
int(* destroy)(struct ast_speech *speech)
Definition: speech.h:79
int ast_speech_results_free ( struct ast_speech_result result)

Free a list of results.

Free a set of results.

Definition at line 97 of file res_speech.c.

References ast_free, AST_LIST_NEXT, ast_speech_result::grammar, and ast_speech_result::text.

Referenced by ast_speech_destroy(), and ast_speech_start().

98 {
99  struct ast_speech_result *current_result = result, *prev_result = NULL;
100  int res = 0;
101 
102  while (current_result != NULL) {
103  prev_result = current_result;
104  /* Deallocate what we can */
105  if (current_result->text != NULL) {
106  ast_free(current_result->text);
107  current_result->text = NULL;
108  }
109  if (current_result->grammar != NULL) {
110  ast_free(current_result->grammar);
111  current_result->grammar = NULL;
112  }
113  /* Move on and then free ourselves */
114  current_result = AST_LIST_NEXT(current_result, list);
115  ast_free(prev_result);
116  prev_result = NULL;
117  }
118 
119  return res;
120 }
#define AST_LIST_NEXT(elm, field)
Returns the next entry in the list after the given entry.
Definition: linkedlists.h:438
char * grammar
Definition: speech.h:114
#define ast_free(a)
Definition: astmm.h:97
struct ast_speech_result* ast_speech_results_get ( struct ast_speech speech)

Return the results of a recognition from the speech structure.

Get speech recognition results.

Definition at line 91 of file res_speech.c.

References ast_speech::engine, and ast_speech_engine::get.

Referenced by handle_speechrecognize(), and speech_background().

92 {
93  return (speech->engine->get ? speech->engine->get(speech) : NULL);
94 }
struct ast_speech_engine * engine
Definition: speech.h:69
struct ast_speech_result *(* get)(struct ast_speech *speech)
Definition: speech.h:99
void ast_speech_start ( struct ast_speech speech)

Start speech recognition on a speech structure.

Indicate to the speech engine that audio is now going to start being written.

Definition at line 123 of file res_speech.c.

References ast_clear_flag, AST_SPEECH_HAVE_RESULTS, AST_SPEECH_QUIET, ast_speech_results_free(), AST_SPEECH_SPOKE, ast_speech::engine, ast_speech::results, and ast_speech_engine::start.

Referenced by handle_speechrecognize(), speech_background(), and speech_start().

124 {
125 
126  /* Clear any flags that may affect things */
130 
131  /* If results are on the structure, free them since we are starting again */
132  if (speech->results) {
134  speech->results = NULL;
135  }
136 
137  /* If the engine needs to start stuff up, do it */
138  if (speech->engine->start)
139  speech->engine->start(speech);
140 
141  return;
142 }
int(* start)(struct ast_speech *speech)
Definition: speech.h:93
struct ast_speech_engine * engine
Definition: speech.h:69
struct ast_speech_result * results
Definition: speech.h:65
#define ast_clear_flag(p, flag)
Definition: utils.h:77
int ast_speech_results_free(struct ast_speech_result *result)
Free a set of results.
Definition: res_speech.c:97
int ast_speech_unregister ( const char *  engine_name)

Unregister a speech recognition engine.

Definition at line 303 of file res_speech.c.

References AST_RWLIST_FIRST, AST_RWLIST_REMOVE_CURRENT, AST_RWLIST_TRAVERSE_SAFE_BEGIN, AST_RWLIST_TRAVERSE_SAFE_END, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, ast_strlen_zero(), ast_verb, and ast_speech_engine::name.

304 {
305  struct ast_speech_engine *engine = NULL;
306  int res = -1;
307 
308  if (ast_strlen_zero(engine_name))
309  return -1;
310 
312  AST_RWLIST_TRAVERSE_SAFE_BEGIN(&engines, engine, list) {
313  if (!strcasecmp(engine->name, engine_name)) {
314  /* We have our engine... removed it */
316  /* If this was the default engine, we need to pick a new one */
317  if (engine == default_engine) {
319  }
320  ast_verb(2, "Unregistered speech recognition engine '%s'\n", engine_name);
321  /* All went well */
322  res = 0;
323  break;
324  }
325  }
328 
329  return res;
330 }
#define AST_RWLIST_WRLOCK(head)
Write locks a list.
Definition: linkedlists.h:51
#define AST_RWLIST_UNLOCK(head)
Attempts to unlock a read/write based list.
Definition: linkedlists.h:150
static struct ast_speech_engine * default_engine
Definition: res_speech.c:44
char * name
Definition: speech.h:75
#define ast_verb(level,...)
Definition: logger.h:243
static force_inline int attribute_pure ast_strlen_zero(const char *s)
Definition: strings.h:63
#define AST_RWLIST_REMOVE_CURRENT
Definition: linkedlists.h:565
#define AST_RWLIST_TRAVERSE_SAFE_BEGIN
Definition: linkedlists.h:542
#define AST_RWLIST_FIRST
Definition: linkedlists.h:422
#define AST_RWLIST_TRAVERSE_SAFE_END
Definition: linkedlists.h:602
int ast_speech_write ( struct ast_speech speech,
void *  data,
int  len 
)

Write in signed linear audio to be recognized.

Write audio to the speech engine.

Definition at line 145 of file res_speech.c.

References AST_SPEECH_STATE_READY, ast_speech::engine, ast_speech::state, and ast_speech_engine::write.

Referenced by handle_speechrecognize(), and speech_background().

146 {
147  /* Make sure the speech engine is ready to accept audio */
148  if (speech->state != AST_SPEECH_STATE_READY)
149  return -1;
150 
151  return speech->engine->write(speech, data, len);
152 }
int state
Definition: speech.h:59
struct ast_speech_engine * engine
Definition: speech.h:69
int(* write)(struct ast_speech *speech, void *data, int len)
Definition: speech.h:89
static int len(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t buflen)
ASTERISK_FILE_VERSION ( __FILE__  ,
"$Revision: 368738 $"   
)
static struct ast_speech_engine* find_engine ( const char *  engine_name)
static

Find a speech recognition engine of specified name, if NULL then use the default one.

Definition at line 47 of file res_speech.c.

References AST_RWLIST_RDLOCK, AST_RWLIST_TRAVERSE, AST_RWLIST_UNLOCK, ast_strlen_zero(), default_engine, and ast_speech_engine::name.

Referenced by ast_speech_new(), and ast_speech_register().

48 {
49  struct ast_speech_engine *engine = NULL;
50 
51  /* If no name is specified -- use the default engine */
52  if (ast_strlen_zero(engine_name))
53  return default_engine;
54 
56  AST_RWLIST_TRAVERSE(&engines, engine, list) {
57  if (!strcasecmp(engine->name, engine_name)) {
58  break;
59  }
60  }
62 
63  return engine;
64 }
#define AST_RWLIST_UNLOCK(head)
Attempts to unlock a read/write based list.
Definition: linkedlists.h:150
static struct ast_speech_engine * default_engine
Definition: res_speech.c:44
char * name
Definition: speech.h:75
#define AST_RWLIST_RDLOCK(head)
Read locks a list.
Definition: linkedlists.h:77
static force_inline int attribute_pure ast_strlen_zero(const char *s)
Definition: strings.h:63
#define AST_RWLIST_TRAVERSE
Definition: linkedlists.h:493
static int load_module ( void  )
static

Definition at line 338 of file res_speech.c.

References AST_MODULE_LOAD_SUCCESS.

339 {
341 }
static int unload_module ( void  )
static

Definition at line 332 of file res_speech.c.

333 {
334  /* We can not be unloaded */
335  return -1;
336 }

Variable Documentation

struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_GLOBAL_SYMBOLS | AST_MODFLAG_LOAD_ORDER , .description = "Generic Speech Recognition API" , .key = "This paragraph is copyright (c) 2006 by Digium, Inc. \In order for your module to load, it must return this \key via a function called \"key\". Any code which \includes this paragraph must be licensed under the GNU \General Public License version 2 or later (at your \option). In addition to Digium's general reservations \of rights, Digium expressly reserves the right to \allow other parties to license this paragraph under \different terms. Any use of Digium, Inc. trademarks or \logos (including \"Asterisk\" or \"Digium\") without \express written permission of Digium, Inc. is prohibited.\n" , .buildopt_sum = "ac1f6a56484a8820659555499174e588" , .load = load_module, .unload = unload_module, .load_pri = AST_MODPRI_APP_DEPEND, }
static

Definition at line 347 of file res_speech.c.

Definition at line 347 of file res_speech.c.

struct ast_speech_engine* default_engine = NULL
static

Definition at line 44 of file res_speech.c.

Referenced by find_engine().

struct engines engines = { .first = NULL, .last = NULL, .lock = { PTHREAD_RWLOCK_INITIALIZER , NULL, 1 } , }
static