#include "asterisk.h"
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include "asterisk/file.h"
#include "asterisk/logger.h"
#include "asterisk/channel.h"
#include "asterisk/pbx.h"
#include "asterisk/module.h"
#include "asterisk/lock.h"
#include "asterisk/app.h"
#include "asterisk/speech.h"
Include dependency graph for app_speech_utils.c:

Go to the source code of this file.
Functions | |
| AST_MODULE_INFO_STANDARD (ASTERISK_GPL_KEY,"Dialplan Speech Applications") | |
| ASTERISK_FILE_VERSION (__FILE__,"$Revision: 147517 $") | |
| static void | destroy_callback (void *data) |
| Helper function used by datastores to destroy the speech structure upon hangup. | |
| static struct ast_speech_result * | find_result (struct ast_speech_result *results, char *result_num) |
| static struct ast_speech * | find_speech (struct ast_channel *chan) |
| Helper function used to find the speech structure attached to a channel. | |
| static int | load_module (void) |
| static int | speech_activate (struct ast_channel *chan, void *data) |
| SpeechActivateGrammar(Grammar Name) Dialplan Application. | |
| static int | speech_background (struct ast_channel *chan, void *data) |
| SpeechBackground(Sound File|Timeout) Dialplan Application. | |
| static int | speech_create (struct ast_channel *chan, void *data) |
| SpeechCreate() Dialplan Application. | |
| static int | speech_deactivate (struct ast_channel *chan, void *data) |
| SpeechDeactivateGrammar(Grammar Name) Dialplan Application. | |
| static int | speech_destroy (struct ast_channel *chan, void *data) |
| SpeechDestroy() Dialplan Application. | |
| static int | speech_engine_write (struct ast_channel *chan, char *cmd, char *data, const char *value) |
| SPEECH_ENGINE() Dialplan Function. | |
| static int | speech_grammar (struct ast_channel *chan, char *cmd, char *data, char *buf, size_t len) |
| SPEECH_GRAMMAR() Dialplan Function. | |
| static int | speech_load (struct ast_channel *chan, void *data) |
| SpeechLoadGrammar(Grammar Name|Path) Dialplan Application. | |
| static int | speech_processing_sound (struct ast_channel *chan, void *data) |
| SpeechProcessingSound(Sound File) Dialplan Application. | |
| static int | speech_read (struct ast_channel *chan, char *cmd, char *data, char *buf, size_t len) |
| SPEECH() Dialplan Function. | |
| static int | speech_results_type_write (struct ast_channel *chan, char *cmd, char *data, const char *value) |
| SPEECH_RESULTS_TYPE() Dialplan Function. | |
| static int | speech_score (struct ast_channel *chan, char *cmd, char *data, char *buf, size_t len) |
| SPEECH_SCORE() Dialplan Function. | |
| static int | speech_start (struct ast_channel *chan, void *data) |
| SpeechStart() Dialplan Application. | |
| static int | speech_streamfile (struct ast_channel *chan, const char *filename, const char *preflang) |
| Helper function used by speech_background to playback a soundfile. | |
| static int | speech_text (struct ast_channel *chan, char *cmd, char *data, char *buf, size_t len) |
| SPEECH_TEXT() Dialplan Function. | |
| static int | speech_unload (struct ast_channel *chan, void *data) |
| SpeechUnloadGrammar(Grammar Name) Dialplan Application. | |
| static int | unload_module (void) |
Variables | |
| static struct ast_datastore_info | speech_datastore |
| Static structure for datastore information. | |
| static struct ast_custom_function | speech_engine_function |
| static struct ast_custom_function | speech_function |
| static struct ast_custom_function | speech_grammar_function |
| static struct ast_custom_function | speech_results_type_function |
| static struct ast_custom_function | speech_score_function |
| static struct ast_custom_function | speech_text_function |
| static char * | speechactivategrammar_descrip |
| static char * | speechbackground_descrip |
| static char * | speechcreate_descrip |
| static char * | speechdeactivategrammar_descrip |
| static char * | speechdestroy_descrip |
| static char * | speechload_descrip |
| static char * | speechprocessingsound_descrip |
| static char * | speechstart_descrip |
| static char * | speechunload_descrip |
Definition in file app_speech_utils.c.
| AST_MODULE_INFO_STANDARD | ( | ASTERISK_GPL_KEY | , | |
| "Dialplan Speech Applications" | ||||
| ) |
| ASTERISK_FILE_VERSION | ( | __FILE__ | , | |
| "$Revision: 147517 $" | ||||
| ) |
| static void destroy_callback | ( | void * | data | ) | [static] |
Helper function used by datastores to destroy the speech structure upon hangup.
Definition at line 94 of file app_speech_utils.c.
References ast_speech_destroy().
00095 { 00096 struct ast_speech *speech = (struct ast_speech*)data; 00097 00098 if (speech == NULL) { 00099 return; 00100 } 00101 00102 /* Deallocate now */ 00103 ast_speech_destroy(speech); 00104 00105 return; 00106 }
| static struct ast_speech_result* find_result | ( | struct ast_speech_result * | results, | |
| char * | result_num | |||
| ) | [static] |
Definition at line 130 of file app_speech_utils.c.
References ast_speech_result::nbest_num, and ast_speech_result::next.
Referenced by speech_grammar(), speech_score(), and speech_text().
00131 { 00132 struct ast_speech_result *result = results; 00133 char *tmp = NULL; 00134 int nbest_num = 0, wanted_num = 0, i = 0; 00135 00136 if (!result) 00137 return NULL; 00138 00139 if ((tmp = strchr(result_num, '/'))) { 00140 *tmp++ = '\0'; 00141 nbest_num = atoi(result_num); 00142 wanted_num = atoi(tmp); 00143 } else { 00144 wanted_num = atoi(result_num); 00145 } 00146 00147 do { 00148 if (result->nbest_num != nbest_num) 00149 continue; 00150 if (i == wanted_num) 00151 break; 00152 i++; 00153 } while ((result = result->next)); 00154 00155 return result; 00156 }
| static struct ast_speech* find_speech | ( | struct ast_channel * | chan | ) | [static] |
Helper function used to find the speech structure attached to a channel.
Definition at line 115 of file app_speech_utils.c.
References ast_channel_datastore_find(), ast_datastore::data, and speech_datastore.
Referenced by speech_activate(), speech_background(), speech_deactivate(), speech_destroy(), speech_engine_write(), speech_grammar(), speech_load(), speech_processing_sound(), speech_read(), speech_results_type_write(), speech_score(), speech_start(), speech_text(), and speech_unload().
00116 { 00117 struct ast_speech *speech = NULL; 00118 struct ast_datastore *datastore = NULL; 00119 00120 datastore = ast_channel_datastore_find(chan, &speech_datastore, NULL); 00121 if (datastore == NULL) { 00122 return NULL; 00123 } 00124 speech = datastore->data; 00125 00126 return speech; 00127 }
| static int load_module | ( | void | ) | [static] |
Definition at line 852 of file app_speech_utils.c.
References ast_custom_function_register(), ast_register_application(), speech_activate(), speech_background(), speech_create(), speech_deactivate(), speech_destroy(), speech_engine_function, speech_function, speech_grammar_function, speech_load(), speech_processing_sound(), speech_results_type_function, speech_score_function, speech_start(), speech_text_function, speech_unload(), speechactivategrammar_descrip, speechbackground_descrip, speechcreate_descrip, speechdeactivategrammar_descrip, speechdestroy_descrip, speechload_descrip, speechprocessingsound_descrip, speechstart_descrip, and speechunload_descrip.
00853 { 00854 int res = 0; 00855 00856 res = ast_register_application("SpeechCreate", speech_create, "Create a Speech Structure", speechcreate_descrip); 00857 res |= ast_register_application("SpeechLoadGrammar", speech_load, "Load a Grammar", speechload_descrip); 00858 res |= ast_register_application("SpeechUnloadGrammar", speech_unload, "Unload a Grammar", speechunload_descrip); 00859 res |= ast_register_application("SpeechActivateGrammar", speech_activate, "Activate a Grammar", speechactivategrammar_descrip); 00860 res |= ast_register_application("SpeechDeactivateGrammar", speech_deactivate, "Deactivate a Grammar", speechdeactivategrammar_descrip); 00861 res |= ast_register_application("SpeechStart", speech_start, "Start recognizing voice in the audio stream", speechstart_descrip); 00862 res |= ast_register_application("SpeechBackground", speech_background, "Play a sound file and wait for speech to be recognized", speechbackground_descrip); 00863 res |= ast_register_application("SpeechDestroy", speech_destroy, "End speech recognition", speechdestroy_descrip); 00864 res |= ast_register_application("SpeechProcessingSound", speech_processing_sound, "Change background processing sound", speechprocessingsound_descrip); 00865 res |= ast_custom_function_register(&speech_function); 00866 res |= ast_custom_function_register(&speech_score_function); 00867 res |= ast_custom_function_register(&speech_text_function); 00868 res |= ast_custom_function_register(&speech_grammar_function); 00869 res |= ast_custom_function_register(&speech_engine_function); 00870 res |= ast_custom_function_register(&speech_results_type_function); 00871 00872 return res; 00873 }
| static int speech_activate | ( | struct ast_channel * | chan, | |
| void * | data | |||
| ) | [static] |
SpeechActivateGrammar(Grammar Name) Dialplan Application.
Definition at line 465 of file app_speech_utils.c.
References ast_module_user_add, ast_module_user_remove, ast_speech_grammar_activate(), and find_speech().
Referenced by load_module().
00466 { 00467 int res = 0; 00468 struct ast_module_user *u = NULL; 00469 struct ast_speech *speech = find_speech(chan); 00470 00471 u = ast_module_user_add(chan); 00472 00473 if (speech == NULL) { 00474 ast_module_user_remove(u); 00475 return -1; 00476 } 00477 00478 /* Activate the grammar on the speech object */ 00479 res = ast_speech_grammar_activate(speech, data); 00480 00481 ast_module_user_remove(u); 00482 00483 return res; 00484 }
| static int speech_background | ( | struct ast_channel * | chan, | |
| void * | data | |||
| ) | [static] |
SpeechBackground(Sound File|Timeout) Dialplan Application.
Definition at line 550 of file app_speech_utils.c.
References ast_channel::_state, ast_answer(), ast_app_separate_args(), ast_calloc, ast_channel_datastore_find(), ast_channel_datastore_remove(), ast_clear_flag, AST_CONTROL_HANGUP, AST_FORMAT_SLINEAR, AST_FRAME_CONTROL, AST_FRAME_DTMF, AST_FRAME_VOICE, ast_frfree, AST_MAX_EXTENSION, ast_module_user_add, ast_module_user_remove, ast_mutex_lock(), ast_mutex_unlock(), ast_read(), ast_sched_runq(), ast_sched_wait(), ast_set_read_format(), ast_speech_change_state(), ast_speech_destroy(), ast_speech_dtmf(), AST_SPEECH_QUIET, ast_speech_results_get(), ast_speech_start(), AST_SPEECH_STATE_DONE, AST_SPEECH_STATE_NOT_READY, AST_SPEECH_STATE_READY, AST_SPEECH_STATE_WAIT, ast_speech_write(), AST_STATE_UP, ast_stopstream(), ast_strdupa, ast_strlen_zero(), ast_test_flag, ast_waitfor(), ast_pbx::dtimeout, f, find_speech(), ast_speech::lock, ast_channel::pbx, pbx_builtin_getvar_helper(), ast_speech::processing_sound, ast_channel::readformat, ast_speech::results, ast_channel::sched, speech_datastore, speech_streamfile(), ast_speech::state, strdup, ast_channel::stream, ast_channel::streamid, strsep(), and ast_channel::timingfunc.
Referenced by load_module().
00551 { 00552 unsigned int timeout = 0; 00553 int res = 0, done = 0, argc = 0, started = 0, quieted = 0, max_dtmf_len = 0; 00554 struct ast_module_user *u = NULL; 00555 struct ast_speech *speech = find_speech(chan); 00556 struct ast_frame *f = NULL; 00557 int oldreadformat = AST_FORMAT_SLINEAR; 00558 char dtmf[AST_MAX_EXTENSION] = ""; 00559 time_t start, current; 00560 struct ast_datastore *datastore = NULL; 00561 char *argv[2], *args = NULL, *filename_tmp = NULL, *filename = NULL, tmp[2] = "", dtmf_terminator = '#'; 00562 const char *tmp2 = NULL; 00563 00564 args = ast_strdupa(data); 00565 00566 u = ast_module_user_add(chan); 00567 00568 if (speech == NULL) { 00569 ast_module_user_remove(u); 00570 return -1; 00571 } 00572 00573 /* If channel is not already answered, then answer it */ 00574 if (chan->_state != AST_STATE_UP && ast_answer(chan)) { 00575 ast_module_user_remove(u); 00576 return -1; 00577 } 00578 00579 /* Record old read format */ 00580 oldreadformat = chan->readformat; 00581 00582 /* Change read format to be signed linear */ 00583 if (ast_set_read_format(chan, AST_FORMAT_SLINEAR)) { 00584 ast_module_user_remove(u); 00585 return -1; 00586 } 00587 00588 /* Parse out options */ 00589 argc = ast_app_separate_args(args, '|', argv, sizeof(argv) / sizeof(argv[0])); 00590 if (argc > 0) { 00591 /* Yay sound file */ 00592 filename_tmp = ast_strdupa(argv[0]); 00593 if (!ast_strlen_zero(argv[1])) { 00594 if ((timeout = atoi(argv[1])) == 0) 00595 timeout = -1; 00596 } else 00597 timeout = 0; 00598 } 00599 00600 /* See if the maximum DTMF length variable is set... we use a variable in case they want to carry it through their entire dialplan */ 00601 if ((tmp2 = pbx_builtin_getvar_helper(chan, "SPEECH_DTMF_MAXLEN")) && !ast_strlen_zero(tmp2)) 00602 max_dtmf_len = atoi(tmp2); 00603 00604 /* See if a terminator is specified */ 00605 if ((tmp2 = pbx_builtin_getvar_helper(chan, "SPEECH_DTMF_TERMINATOR"))) { 00606 if (ast_strlen_zero(tmp2)) 00607 dtmf_terminator = '\0'; 00608 else 00609 dtmf_terminator = tmp2[0]; 00610 } 00611 00612 /* Before we go into waiting for stuff... make sure the structure is ready, if not - start it again */ 00613 if (speech->state == AST_SPEECH_STATE_NOT_READY || speech->state == AST_SPEECH_STATE_DONE) { 00614 ast_speech_change_state(speech, AST_SPEECH_STATE_NOT_READY); 00615 ast_speech_start(speech); 00616 } 00617 00618 /* Ensure no streams are currently running */ 00619 ast_stopstream(chan); 00620 00621 /* Okay it's streaming so go into a loop grabbing frames! */ 00622 while (done == 0) { 00623 /* If the filename is null and stream is not running, start up a new sound file */ 00624 if (!quieted && (chan->streamid == -1 && chan->timingfunc == NULL) && (filename = strsep(&filename_tmp, "&"))) { 00625 /* Discard old stream information */ 00626 ast_stopstream(chan); 00627 /* Start new stream */ 00628 speech_streamfile(chan, filename, chan->language); 00629 } 00630 00631 /* Run scheduled stuff */ 00632 ast_sched_runq(chan->sched); 00633 00634 /* Yay scheduling */ 00635 res = ast_sched_wait(chan->sched); 00636 if (res < 0) { 00637 res = 1000; 00638 } 00639 00640 /* If there is a frame waiting, get it - if not - oh well */ 00641 if (ast_waitfor(chan, res) > 0) { 00642 f = ast_read(chan); 00643 if (f == NULL) { 00644 /* The channel has hung up most likely */ 00645 done = 3; 00646 break; 00647 } 00648 } 00649 00650 /* Do timeout check (shared between audio/dtmf) */ 00651 if ((!quieted || strlen(dtmf)) && started == 1) { 00652 time(¤t); 00653 if ((current-start) >= timeout) { 00654 done = 1; 00655 if (f) 00656 ast_frfree(f); 00657 break; 00658 } 00659 } 00660 00661 /* Do checks on speech structure to see if it's changed */ 00662 ast_mutex_lock(&speech->lock); 00663 if (ast_test_flag(speech, AST_SPEECH_QUIET)) { 00664 if (chan->stream) 00665 ast_stopstream(chan); 00666 ast_clear_flag(speech, AST_SPEECH_QUIET); 00667 quieted = 1; 00668 } 00669 /* Check state so we can see what to do */ 00670 switch (speech->state) { 00671 case AST_SPEECH_STATE_READY: 00672 /* If audio playback has stopped do a check for timeout purposes */ 00673 if (chan->streamid == -1 && chan->timingfunc == NULL) 00674 ast_stopstream(chan); 00675 if (!quieted && chan->stream == NULL && timeout && started == 0 && !filename_tmp) { 00676 if (timeout == -1) { 00677 done = 1; 00678 if (f) 00679 ast_frfree(f); 00680 break; 00681 } 00682 time(&start); 00683 started = 1; 00684 } 00685 /* Write audio frame out to speech engine if no DTMF has been received */ 00686 if (!strlen(dtmf) && f != NULL && f->frametype == AST_FRAME_VOICE) { 00687 ast_speech_write(speech, f->data, f->datalen); 00688 } 00689 break; 00690 case AST_SPEECH_STATE_WAIT: 00691 /* Cue up waiting sound if not already playing */ 00692 if (!strlen(dtmf)) { 00693 if (chan->stream == NULL) { 00694 if (speech->processing_sound != NULL) { 00695 if (strlen(speech->processing_sound) > 0 && strcasecmp(speech->processing_sound,"none")) { 00696 speech_streamfile(chan, speech->processing_sound, chan->language); 00697 } 00698 } 00699 } else if (chan->streamid == -1 && chan->timingfunc == NULL) { 00700 ast_stopstream(chan); 00701 if (speech->processing_sound != NULL) { 00702 if (strlen(speech->processing_sound) > 0 && strcasecmp(speech->processing_sound,"none")) { 00703 speech_streamfile(chan, speech->processing_sound, chan->language); 00704 } 00705 } 00706 } 00707 } 00708 break; 00709 case AST_SPEECH_STATE_DONE: 00710 /* Now that we are done... let's switch back to not ready state */ 00711 ast_speech_change_state(speech, AST_SPEECH_STATE_NOT_READY); 00712 if (!strlen(dtmf)) { 00713 /* Copy to speech structure the results, if available */ 00714 speech->results = ast_speech_results_get(speech); 00715 /* Break out of our background too */ 00716 done = 1; 00717 /* Stop audio playback */ 00718 if (chan->stream != NULL) { 00719 ast_stopstream(chan); 00720 } 00721 } 00722 break; 00723 default: 00724 break; 00725 } 00726 ast_mutex_unlock(&speech->lock); 00727 00728 /* Deal with other frame types */ 00729 if (f != NULL) { 00730 /* Free the frame we received */ 00731 switch (f->frametype) { 00732 case AST_FRAME_DTMF: 00733 if (dtmf_terminator != '\0' && f->subclass == dtmf_terminator) { 00734 done = 1; 00735 } else { 00736 if (chan->stream != NULL) { 00737 ast_stopstream(chan); 00738 } 00739 if (!started) { 00740 /* Change timeout to be 5 seconds for DTMF input */ 00741 timeout = (chan->pbx && chan->pbx->dtimeout) ? chan->pbx->dtimeout : 5; 00742 started = 1; 00743 } 00744 time(&start); 00745 snprintf(tmp, sizeof(tmp), "%c", f->subclass); 00746 strncat(dtmf, tmp, sizeof(dtmf) - strlen(dtmf) - 1); 00747 /* If the maximum length of the DTMF has been reached, stop now */ 00748 if (max_dtmf_len && strlen(dtmf) == max_dtmf_len) 00749 done = 1; 00750 } 00751 break; 00752 case AST_FRAME_CONTROL: 00753 switch (f->subclass) { 00754 case AST_CONTROL_HANGUP: 00755 /* Since they hung up we should destroy the speech structure */ 00756 done = 3; 00757 default: 00758 break; 00759 } 00760 default: 00761 break; 00762 } 00763 ast_frfree(f); 00764 f = NULL; 00765 } 00766 } 00767 00768 if (strlen(dtmf)) { 00769 /* We sort of make a results entry */ 00770 speech->results = ast_calloc(1, sizeof(*speech->results)); 00771 if (speech->results != NULL) { 00772 ast_speech_dtmf(speech, dtmf); 00773 speech->results->score = 1000; 00774 speech->results->text = strdup(dtmf); 00775 speech->results->grammar = strdup("dtmf"); 00776 } 00777 ast_speech_change_state(speech, AST_SPEECH_STATE_NOT_READY); 00778 } 00779 00780 /* See if it was because they hung up */ 00781 if (done == 3) { 00782 /* Destroy speech structure */ 00783 ast_speech_destroy(speech); 00784 datastore = ast_channel_datastore_find(chan, &speech_datastore, NULL); 00785 if (datastore != NULL) { 00786 ast_channel_datastore_remove(chan, datastore); 00787 } 00788 } else { 00789 /* Channel is okay so restore read format */ 00790 ast_set_read_format(chan, oldreadformat); 00791 } 00792 00793 ast_module_user_remove(u); 00794 00795 return 0; 00796 }
| static int speech_create | ( | struct ast_channel * | chan, | |
| void * | data | |||
| ) | [static] |
SpeechCreate() Dialplan Application.
Definition at line 354 of file app_speech_utils.c.
References ast_channel_datastore_add(), ast_channel_datastore_alloc(), AST_FORMAT_SLINEAR, ast_module_user_add, ast_module_user_remove, ast_speech_destroy(), ast_speech_new(), ast_datastore::data, pbx_builtin_setvar_helper(), and speech_datastore.
Referenced by load_module().
00355 { 00356 struct ast_module_user *u = NULL; 00357 struct ast_speech *speech = NULL; 00358 struct ast_datastore *datastore = NULL; 00359 00360 u = ast_module_user_add(chan); 00361 00362 /* Request a speech object */ 00363 speech = ast_speech_new(data, AST_FORMAT_SLINEAR); 00364 if (speech == NULL) { 00365 /* Not available */ 00366 pbx_builtin_setvar_helper(chan, "ERROR", "1"); 00367 ast_module_user_remove(u); 00368 return 0; 00369 } 00370 00371 datastore = ast_channel_datastore_alloc(&speech_datastore, NULL); 00372 if (datastore == NULL) { 00373 ast_speech_destroy(speech); 00374 pbx_builtin_setvar_helper(chan, "ERROR", "1"); 00375 ast_module_user_remove(u); 00376 return 0; 00377 } 00378 datastore->data = speech; 00379 ast_channel_datastore_add(chan, datastore); 00380 00381 ast_module_user_remove(u); 00382 00383 return 0; 00384 }
| static int speech_deactivate | ( | struct ast_channel * | chan, | |
| void * | data | |||
| ) | [static] |
SpeechDeactivateGrammar(Grammar Name) Dialplan Application.
Definition at line 443 of file app_speech_utils.c.
References ast_module_user_add, ast_module_user_remove, ast_speech_grammar_deactivate(), and find_speech().
Referenced by load_module().
00444 { 00445 int res = 0; 00446 struct ast_module_user *u = NULL; 00447 struct ast_speech *speech = find_speech(chan); 00448 00449 u = ast_module_user_add(chan); 00450 00451 if (speech == NULL) { 00452 ast_module_user_remove(u); 00453 return -1; 00454 } 00455 00456 /* Deactivate the grammar on the speech object */ 00457 res = ast_speech_grammar_deactivate(speech, data); 00458 00459 ast_module_user_remove(u); 00460 00461 return res; 00462 }
| static int speech_destroy | ( | struct ast_channel * | chan, | |
| void * | data | |||
| ) | [static] |
SpeechDestroy() Dialplan Application.
Definition at line 800 of file app_speech_utils.c.
References ast_channel_datastore_find(), ast_channel_datastore_remove(), ast_module_user_add, ast_module_user_remove, ast_speech_destroy(), find_speech(), and speech_datastore.
Referenced by load_module().
00801 { 00802 int res = 0; 00803 struct ast_module_user *u = NULL; 00804 struct ast_speech *speech = find_speech(chan); 00805 struct ast_datastore *datastore = NULL; 00806 00807 u = ast_module_user_add(chan); 00808 00809 if (speech == NULL) { 00810 ast_module_user_remove(u); 00811 return -1; 00812 } 00813 00814 /* Destroy speech structure */ 00815 ast_speech_destroy(speech); 00816 00817 datastore = ast_channel_datastore_find(chan, &speech_datastore, NULL); 00818 if (datastore != NULL) { 00819 ast_channel_datastore_remove(chan, datastore); 00820 } 00821 00822 ast_module_user_remove(u); 00823 00824 return res; 00825 }
| static int speech_engine_write | ( | struct ast_channel * | chan, | |
| char * | cmd, | |||
| char * | data, | |||
| const char * | value | |||
| ) | [static] |
SPEECH_ENGINE() Dialplan Function.
Definition at line 245 of file app_speech_utils.c.
References ast_speech_change(), and find_speech().
00246 { 00247 struct ast_speech *speech = find_speech(chan); 00248 00249 if (data == NULL || speech == NULL) 00250 return -1; 00251 00252 ast_speech_change(speech, data, value); 00253 00254 return 0; 00255 }
| static int speech_grammar | ( | struct ast_channel * | chan, | |
| char * | cmd, | |||
| char * | data, | |||
| char * | buf, | |||
| size_t | len | |||
| ) | [static] |
SPEECH_GRAMMAR() Dialplan Function.
Definition at line 216 of file app_speech_utils.c.
References find_result(), find_speech(), ast_speech_result::grammar, and ast_speech::results.
00218 { 00219 struct ast_speech_result *result = NULL; 00220 struct ast_speech *speech = find_speech(chan); 00221 00222 if (data == NULL || speech == NULL || !(result = find_result(speech->results, data))) 00223 return -1; 00224 00225 if (result->grammar != NULL) { 00226 ast_copy_string(buf, result->grammar, len); 00227 } else { 00228 buf[0] = '\0'; 00229 } 00230 00231 return 0; 00232 }
| static int speech_load | ( | struct ast_channel * | chan, | |
| void * | data | |||
| ) | [static] |
SpeechLoadGrammar(Grammar Name|Path) Dialplan Application.
Definition at line 387 of file app_speech_utils.c.
References ast_app_separate_args(), ast_module_user_add, ast_module_user_remove, ast_speech_grammar_load(), ast_strdupa, find_speech(), and name.
Referenced by load_module().
00388 { 00389 int res = 0, argc = 0; 00390 struct ast_module_user *u = NULL; 00391 struct ast_speech *speech = find_speech(chan); 00392 char *argv[2], *args = NULL, *name = NULL, *path = NULL; 00393 00394 args = ast_strdupa(data); 00395 00396 u = ast_module_user_add(chan); 00397 00398 if (speech == NULL) { 00399 ast_module_user_remove(u); 00400 return -1; 00401 } 00402 00403 /* Parse out arguments */ 00404 argc = ast_app_separate_args(args, '|', argv, sizeof(argv) / sizeof(argv[0])); 00405 if (argc != 2) { 00406 ast_module_user_remove(u); 00407 return -1; 00408 } 00409 name = argv[0]; 00410 path = argv[1]; 00411 00412 /* Load the grammar locally on the object */ 00413 res = ast_speech_grammar_load(speech, name, path); 00414 00415 ast_module_user_remove(u); 00416 00417 return res; 00418 }
| static int speech_processing_sound | ( | struct ast_channel * | chan, | |
| void * | data | |||
| ) | [static] |
SpeechProcessingSound(Sound File) Dialplan Application.
Definition at line 508 of file app_speech_utils.c.
References ast_module_user_add, ast_module_user_remove, find_speech(), free, ast_speech::processing_sound, and strdup.
Referenced by load_module().
00509 { 00510 int res = 0; 00511 struct ast_module_user *u = NULL; 00512 struct ast_speech *speech = find_speech(chan); 00513 00514 u = ast_module_user_add(chan); 00515 00516 if (speech == NULL) { 00517 ast_module_user_remove(u); 00518 return -1; 00519 } 00520 00521 if (speech->processing_sound != NULL) { 00522 free(speech->processing_sound); 00523 speech->processing_sound = NULL; 00524 } 00525 00526 speech->processing_sound = strdup(data); 00527 00528 ast_module_user_remove(u); 00529 00530 return res; 00531 }
| static int speech_read | ( | struct ast_channel * | chan, | |
| char * | cmd, | |||
| char * | data, | |||
| char * | buf, | |||
| size_t | len | |||
| ) | [static] |
SPEECH() Dialplan Function.
Definition at line 294 of file app_speech_utils.c.
References AST_SPEECH_SPOKE, ast_test_flag, find_speech(), ast_speech_result::next, and ast_speech::results.
00296 { 00297 int results = 0; 00298 struct ast_speech_result *result = NULL; 00299 struct ast_speech *speech = find_speech(chan); 00300 char tmp[128] = ""; 00301 00302 /* Now go for the various options */ 00303 if (!strcasecmp(data, "status")) { 00304 if (speech != NULL) 00305 ast_copy_string(buf, "1", len); 00306 else 00307 ast_copy_string(buf, "0", len); 00308 return 0; 00309 } 00310 00311 /* Make sure we have a speech structure for everything else */ 00312 if (speech == NULL) { 00313 return -1; 00314 } 00315 00316 /* Check to see if they are checking for silence */ 00317 if (!strcasecmp(data, "spoke")) { 00318 if (ast_test_flag(speech, AST_SPEECH_SPOKE)) 00319 ast_copy_string(buf, "1", len); 00320 else 00321 ast_copy_string(buf, "0", len); 00322 } else if (!strcasecmp(data, "results")) { 00323 /* Count number of results */ 00324 result = speech->results; 00325 while (result) { 00326 results++; 00327 result = result->next; 00328 } 00329 snprintf(tmp, sizeof(tmp), "%d", results); 00330 ast_copy_string(buf, tmp, len); 00331 } else { 00332 buf[0] = '\0'; 00333 } 00334 00335 return 0; 00336 }
| static int speech_results_type_write | ( | struct ast_channel * | chan, | |
| char * | cmd, | |||
| char * | data, | |||
| const char * | value | |||
| ) | [static] |
SPEECH_RESULTS_TYPE() Dialplan Function.
Definition at line 268 of file app_speech_utils.c.
References ast_speech_change_results_type(), AST_SPEECH_RESULTS_TYPE_NBEST, AST_SPEECH_RESULTS_TYPE_NORMAL, and find_speech().
00269 { 00270 struct ast_speech *speech = find_speech(chan); 00271 00272 if (data == NULL || speech == NULL) 00273 return -1; 00274 00275 if (!strcasecmp(value, "normal")) 00276 ast_speech_change_results_type(speech, AST_SPEECH_RESULTS_TYPE_NORMAL); 00277 else if (!strcasecmp(value, "nbest")) 00278 ast_speech_change_results_type(speech, AST_SPEECH_RESULTS_TYPE_NBEST); 00279 00280 return 0; 00281 }
| static int speech_score | ( | struct ast_channel * | chan, | |
| char * | cmd, | |||
| char * | data, | |||
| char * | buf, | |||
| size_t | len | |||
| ) | [static] |
SPEECH_SCORE() Dialplan Function.
Definition at line 159 of file app_speech_utils.c.
References find_result(), find_speech(), ast_speech::results, and ast_speech_result::score.
00161 { 00162 struct ast_speech_result *result = NULL; 00163 struct ast_speech *speech = find_speech(chan); 00164 char tmp[128] = ""; 00165 00166 if (data == NULL || speech == NULL || !(result = find_result(speech->results, data))) 00167 return -1; 00168 00169 snprintf(tmp, sizeof(tmp), "%d", result->score); 00170 00171 ast_copy_string(buf, tmp, len); 00172 00173 return 0; 00174 }
| static int speech_start | ( | struct ast_channel * | chan, | |
| void * | data | |||
| ) | [static] |
SpeechStart() Dialplan Application.
Definition at line 487 of file app_speech_utils.c.
References ast_module_user_add, ast_module_user_remove, ast_speech_start(), and find_speech().
Referenced by load_module().
00488 { 00489 int res = 0; 00490 struct ast_module_user *u = NULL; 00491 struct ast_speech *speech = find_speech(chan); 00492 00493 u = ast_module_user_add(chan); 00494 00495 if (speech == NULL) { 00496 ast_module_user_remove(u); 00497 return -1; 00498 } 00499 00500 ast_speech_start(speech); 00501 00502 ast_module_user_remove(u); 00503 00504 return res; 00505 }
| static int speech_streamfile | ( | struct ast_channel * | chan, | |
| const char * | filename, | |||
| const char * | preflang | |||
| ) | [static] |
Helper function used by speech_background to playback a soundfile.
Definition at line 534 of file app_speech_utils.c.
References ast_applystream(), ast_openstream(), and ast_playstream().
Referenced by speech_background().
00535 { 00536 struct ast_filestream *fs = NULL; 00537 00538 if (!(fs = ast_openstream(chan, filename, preflang))) 00539 return -1; 00540 00541 if (ast_applystream(chan, fs)) 00542 return -1; 00543 00544 ast_playstream(fs); 00545 00546 return 0; 00547 }