#include "asterisk.h"
#include "asterisk/file.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"
Go to the source code of this file.
Enumerations | |
enum | { SB_OPT_NOANSWER = (1 << 0) } |
Functions | |
static void | __reg_module (void) |
static void | __unreg_module (void) |
ASTERISK_FILE_VERSION (__FILE__,"$Revision: 328209 $") | |
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, const char *data) |
SpeechActivateGrammar(Grammar Name) Dialplan Application. | |
static int | speech_background (struct ast_channel *chan, const char *data) |
SpeechBackground(Sound File,Timeout) Dialplan Application. | |
static int | speech_create (struct ast_channel *chan, const char *data) |
SpeechCreate() Dialplan Application. | |
static int | speech_deactivate (struct ast_channel *chan, const char *data) |
SpeechDeactivateGrammar(Grammar Name) Dialplan Application. | |
static int | speech_destroy (struct ast_channel *chan, const char *data) |
SpeechDestroy() Dialplan Application. | |
static int | speech_engine_write (struct ast_channel *chan, const char *cmd, char *data, const char *value) |
SPEECH_ENGINE() Dialplan Function. | |
static int | speech_grammar (struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len) |
SPEECH_GRAMMAR() Dialplan Function. | |
static int | speech_load (struct ast_channel *chan, const char *vdata) |
SpeechLoadGrammar(Grammar Name,Path) Dialplan Application. | |
static int | speech_processing_sound (struct ast_channel *chan, const char *data) |
SpeechProcessingSound(Sound File) Dialplan Application. | |
static int | speech_read (struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len) |
SPEECH() Dialplan Function. | |
static int | speech_results_type_write (struct ast_channel *chan, const char *cmd, char *data, const char *value) |
SPEECH_RESULTS_TYPE() Dialplan Function. | |
static int | speech_score (struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len) |
SPEECH_SCORE() Dialplan Function. | |
static int | speech_start (struct ast_channel *chan, const char *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, const char *cmd, char *data, char *buf, size_t len) |
SPEECH_TEXT() Dialplan Function. | |
static int | speech_unload (struct ast_channel *chan, const char *data) |
SpeechUnloadGrammar(Grammar Name) Dialplan Application. | |
static int | unload_module (void) |
Variables | |
static struct ast_module_info | __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT , .description = "Dialplan Speech Applications" , .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 = "88eaa8f5c1bd988bedd71113385e0886" , .load = load_module, .unload = unload_module, .nonoptreq = "res_speech", } |
static struct ast_module_info * | ast_module_info = &__mod_info |
static struct ast_app_option | speech_background_options [128] = { [ 'n' ] = { .flag = SB_OPT_NOANSWER }, } |
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 |
Definition in file app_speech_utils.c.
anonymous enum |
Definition at line 634 of file app_speech_utils.c.
00634 { 00635 SB_OPT_NOANSWER = (1 << 0), 00636 };
static void __reg_module | ( | void | ) | [static] |
Definition at line 966 of file app_speech_utils.c.
static void __unreg_module | ( | void | ) | [static] |
Definition at line 966 of file app_speech_utils.c.
ASTERISK_FILE_VERSION | ( | __FILE__ | , | |
"$Revision: 328209 $" | ||||
) |
static void destroy_callback | ( | void * | data | ) | [static] |
Helper function used by datastores to destroy the speech structure upon hangup.
Definition at line 253 of file app_speech_utils.c.
References ast_speech_destroy().
00254 { 00255 struct ast_speech *speech = (struct ast_speech*)data; 00256 00257 if (speech == NULL) { 00258 return; 00259 } 00260 00261 /* Deallocate now */ 00262 ast_speech_destroy(speech); 00263 00264 return; 00265 }
static struct ast_speech_result* find_result | ( | struct ast_speech_result * | results, | |
char * | result_num | |||
) | [static] |
Definition at line 289 of file app_speech_utils.c.
References AST_LIST_NEXT, and ast_speech_result::nbest_num.
Referenced by speech_grammar(), speech_score(), and speech_text().
00290 { 00291 struct ast_speech_result *result = results; 00292 char *tmp = NULL; 00293 int nbest_num = 0, wanted_num = 0, i = 0; 00294 00295 if (!result) { 00296 return NULL; 00297 } 00298 00299 if ((tmp = strchr(result_num, '/'))) { 00300 *tmp++ = '\0'; 00301 nbest_num = atoi(result_num); 00302 wanted_num = atoi(tmp); 00303 } else { 00304 wanted_num = atoi(result_num); 00305 } 00306 00307 do { 00308 if (result->nbest_num != nbest_num) 00309 continue; 00310 if (i == wanted_num) 00311 break; 00312 i++; 00313 } while ((result = AST_LIST_NEXT(result, list))); 00314 00315 return result; 00316 }
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 274 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().
00275 { 00276 struct ast_speech *speech = NULL; 00277 struct ast_datastore *datastore = NULL; 00278 00279 datastore = ast_channel_datastore_find(chan, &speech_datastore, NULL); 00280 if (datastore == NULL) { 00281 return NULL; 00282 } 00283 speech = datastore->data; 00284 00285 return speech; 00286 }
static int load_module | ( | void | ) | [static] |
Definition at line 939 of file app_speech_utils.c.
References ast_custom_function_register, ast_register_application_xml, 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, and speech_unload().
00940 { 00941 int res = 0; 00942 00943 res = ast_register_application_xml("SpeechCreate", speech_create); 00944 res |= ast_register_application_xml("SpeechLoadGrammar", speech_load); 00945 res |= ast_register_application_xml("SpeechUnloadGrammar", speech_unload); 00946 res |= ast_register_application_xml("SpeechActivateGrammar", speech_activate); 00947 res |= ast_register_application_xml("SpeechDeactivateGrammar", speech_deactivate); 00948 res |= ast_register_application_xml("SpeechStart", speech_start); 00949 res |= ast_register_application_xml("SpeechBackground", speech_background); 00950 res |= ast_register_application_xml("SpeechDestroy", speech_destroy); 00951 res |= ast_register_application_xml("SpeechProcessingSound", speech_processing_sound); 00952 res |= ast_custom_function_register(&speech_function); 00953 res |= ast_custom_function_register(&speech_score_function); 00954 res |= ast_custom_function_register(&speech_text_function); 00955 res |= ast_custom_function_register(&speech_grammar_function); 00956 res |= ast_custom_function_register(&speech_engine_function); 00957 res |= ast_custom_function_register(&speech_results_type_function); 00958 00959 return res; 00960 }
static int speech_activate | ( | struct ast_channel * | chan, | |
const char * | data | |||
) | [static] |
SpeechActivateGrammar(Grammar Name) Dialplan Application.
Definition at line 571 of file app_speech_utils.c.
References ast_speech_grammar_activate(), and find_speech().
Referenced by load_module().
00572 { 00573 int res = 0; 00574 struct ast_speech *speech = find_speech(chan); 00575 00576 if (speech == NULL) 00577 return -1; 00578 00579 /* Activate the grammar on the speech object */ 00580 res = ast_speech_grammar_activate(speech, data); 00581 00582 return res; 00583 }
static int speech_background | ( | struct ast_channel * | chan, | |
const char * | data | |||
) | [static] |
SpeechBackground(Sound File,Timeout) Dialplan Application.
Definition at line 643 of file app_speech_utils.c.
References ast_channel::_state, args, ast_answer(), AST_APP_ARG, ast_app_parse_options(), ast_calloc, ast_channel_datastore_find(), ast_channel_datastore_remove(), ast_channel_lock, ast_channel_unlock, ast_clear_flag, AST_CONTROL_HANGUP, AST_DECLARE_APP_ARGS, AST_FORMAT_SLINEAR, AST_FRAME_CONTROL, AST_FRAME_DTMF, AST_FRAME_VOICE, ast_frfree, AST_MAX_EXTENSION, 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_STANDARD_APP_ARGS, AST_STATE_UP, ast_stopstream(), ast_strdup, ast_strdupa, ast_strlen_zero(), ast_test_flag, ast_tvdiff_ms(), ast_tvnow(), ast_waitfor(), ast_pbx::dtimeoutms, f, find_speech(), ast_speech::format, ast_channel::language, ast_speech::lock, parse(), ast_channel::pbx, pbx_builtin_getvar_helper(), ast_speech::processing_sound, ast_channel::readformat, ast_speech::results, SB_OPT_NOANSWER, ast_channel::sched, speech_background_options, speech_datastore, speech_streamfile(), ast_speech::state, ast_channel::stream, ast_channel::streamid, strsep(), and ast_channel::timingfunc.
Referenced by load_module().
00644 { 00645 unsigned int timeout = 0; 00646 int res = 0, done = 0, started = 0, quieted = 0, max_dtmf_len = 0; 00647 struct ast_speech *speech = find_speech(chan); 00648 struct ast_frame *f = NULL; 00649 int oldreadformat = AST_FORMAT_SLINEAR; 00650 char dtmf[AST_MAX_EXTENSION] = ""; 00651 struct timeval start = { 0, 0 }, current; 00652 struct ast_datastore *datastore = NULL; 00653 char *parse, *filename_tmp = NULL, *filename = NULL, tmp[2] = "", dtmf_terminator = '#'; 00654 const char *tmp2 = NULL; 00655 struct ast_flags options = { 0 }; 00656 AST_DECLARE_APP_ARGS(args, 00657 AST_APP_ARG(soundfile); 00658 AST_APP_ARG(timeout); 00659 AST_APP_ARG(options); 00660 ); 00661 00662 parse = ast_strdupa(data); 00663 AST_STANDARD_APP_ARGS(args, parse); 00664 00665 if (speech == NULL) 00666 return -1; 00667 00668 if (!ast_strlen_zero(args.options)) { 00669 char *options_buf = ast_strdupa(args.options); 00670 ast_app_parse_options(speech_background_options, &options, NULL, options_buf); 00671 } 00672 00673 /* If channel is not already answered, then answer it */ 00674 if (chan->_state != AST_STATE_UP && !ast_test_flag(&options, SB_OPT_NOANSWER) 00675 && ast_answer(chan)) { 00676 return -1; 00677 } 00678 00679 /* Record old read format */ 00680 oldreadformat = chan->readformat; 00681 00682 /* Change read format to be signed linear */ 00683 if (ast_set_read_format(chan, speech->format)) 00684 return -1; 00685 00686 if (!ast_strlen_zero(args.soundfile)) { 00687 /* Yay sound file */ 00688 filename_tmp = ast_strdupa(args.soundfile); 00689 if (!ast_strlen_zero(args.timeout)) { 00690 if ((timeout = atof(args.timeout) * 1000.0) == 0) 00691 timeout = -1; 00692 } else 00693 timeout = 0; 00694 } 00695 00696 /* See if the maximum DTMF length variable is set... we use a variable in case they want to carry it through their entire dialplan */ 00697 ast_channel_lock(chan); 00698 if ((tmp2 = pbx_builtin_getvar_helper(chan, "SPEECH_DTMF_MAXLEN")) && !ast_strlen_zero(tmp2)) { 00699 max_dtmf_len = atoi(tmp2); 00700 } 00701 00702 /* See if a terminator is specified */ 00703 if ((tmp2 = pbx_builtin_getvar_helper(chan, "SPEECH_DTMF_TERMINATOR"))) { 00704 if (ast_strlen_zero(tmp2)) 00705 dtmf_terminator = '\0'; 00706 else 00707 dtmf_terminator = tmp2[0]; 00708 } 00709 ast_channel_unlock(chan); 00710 00711 /* Before we go into waiting for stuff... make sure the structure is ready, if not - start it again */ 00712 if (speech->state == AST_SPEECH_STATE_NOT_READY || speech->state == AST_SPEECH_STATE_DONE) { 00713 ast_speech_change_state(speech, AST_SPEECH_STATE_NOT_READY); 00714 ast_speech_start(speech); 00715 } 00716 00717 /* Ensure no streams are currently running */ 00718 ast_stopstream(chan); 00719 00720 /* Okay it's streaming so go into a loop grabbing frames! */ 00721 while (done == 0) { 00722 /* If the filename is null and stream is not running, start up a new sound file */ 00723 if (!quieted && (chan->streamid == -1 && chan->timingfunc == NULL) && (filename = strsep(&filename_tmp, "&"))) { 00724 /* Discard old stream information */ 00725 ast_stopstream(chan); 00726 /* Start new stream */ 00727 speech_streamfile(chan, filename, chan->language); 00728 } 00729 00730 /* Run scheduled stuff */ 00731 ast_sched_runq(chan->sched); 00732 00733 /* Yay scheduling */ 00734 res = ast_sched_wait(chan->sched); 00735 if (res < 0) 00736 res = 1000; 00737 00738 /* If there is a frame waiting, get it - if not - oh well */ 00739 if (ast_waitfor(chan, res) > 0) { 00740 f = ast_read(chan); 00741 if (f == NULL) { 00742 /* The channel has hung up most likely */ 00743 done = 3; 00744 break; 00745 } 00746 } 00747 00748 /* Do timeout check (shared between audio/dtmf) */ 00749 if ((!quieted || strlen(dtmf)) && started == 1) { 00750 current = ast_tvnow(); 00751 if ((ast_tvdiff_ms(current, start)) >= timeout) { 00752 done = 1; 00753 if (f) 00754 ast_frfree(f); 00755 break; 00756 } 00757 } 00758 00759 /* Do checks on speech structure to see if it's changed */ 00760 ast_mutex_lock(&speech->lock); 00761 if (ast_test_flag(speech, AST_SPEECH_QUIET)) { 00762 if (chan->stream) 00763 ast_stopstream(chan); 00764 ast_clear_flag(speech, AST_SPEECH_QUIET); 00765 quieted = 1; 00766 } 00767 /* Check state so we can see what to do */ 00768 switch (speech->state) { 00769 case AST_SPEECH_STATE_READY: 00770 /* If audio playback has stopped do a check for timeout purposes */ 00771 if (chan->streamid == -1 && chan->timingfunc == NULL) 00772 ast_stopstream(chan); 00773 if (!quieted && chan->stream == NULL && timeout && started == 0 && !filename_tmp) { 00774 if (timeout == -1) { 00775 done = 1; 00776 if (f) 00777 ast_frfree(f); 00778 break; 00779 } 00780 start = ast_tvnow(); 00781 started = 1; 00782 } 00783 /* Write audio frame out to speech engine if no DTMF has been received */ 00784 if (!strlen(dtmf) && f != NULL && f->frametype == AST_FRAME_VOICE) { 00785 ast_speech_write(speech, f->data.ptr, f->datalen); 00786 } 00787 break; 00788 case AST_SPEECH_STATE_WAIT: 00789 /* Cue up waiting sound if not already playing */ 00790 if (!strlen(dtmf)) { 00791 if (chan->stream == NULL) { 00792 if (speech->processing_sound != NULL) { 00793 if (strlen(speech->processing_sound) > 0 && strcasecmp(speech->processing_sound, "none")) { 00794 speech_streamfile(chan, speech->processing_sound, chan->language); 00795 } 00796 } 00797 } else if (chan->streamid == -1 && chan->timingfunc == NULL) { 00798 ast_stopstream(chan); 00799 if (speech->processing_sound != NULL) { 00800 if (strlen(speech->processing_sound) > 0 && strcasecmp(speech->processing_sound, "none")) { 00801 speech_streamfile(chan, speech->processing_sound, chan->language); 00802 } 00803 } 00804 } 00805 } 00806 break; 00807 case AST_SPEECH_STATE_DONE: 00808 /* Now that we are done... let's switch back to not ready state */ 00809 ast_speech_change_state(speech, AST_SPEECH_STATE_NOT_READY); 00810 if (!strlen(dtmf)) { 00811 /* Copy to speech structure the results, if available */ 00812 speech->results = ast_speech_results_get(speech); 00813 /* Break out of our background too */ 00814 done = 1; 00815 /* Stop audio playback */ 00816 if (chan->stream != NULL) { 00817 ast_stopstream(chan); 00818 } 00819 } 00820 break; 00821 default: 00822 break; 00823 } 00824 ast_mutex_unlock(&speech->lock); 00825 00826 /* Deal with other frame types */ 00827 if (f != NULL) { 00828 /* Free the frame we received */ 00829 switch (f->frametype) { 00830 case AST_FRAME_DTMF: 00831 if (dtmf_terminator != '\0' && f->subclass.integer == dtmf_terminator) { 00832 done = 1; 00833 } else { 00834 quieted = 1; 00835 if (chan->stream != NULL) { 00836 ast_stopstream(chan); 00837 } 00838 if (!started) { 00839 /* Change timeout to be 5 seconds for DTMF input */ 00840 timeout = (chan->pbx && chan->pbx->dtimeoutms) ? chan->pbx->dtimeoutms : 5000; 00841 started = 1; 00842 } 00843 start = ast_tvnow(); 00844 snprintf(tmp, sizeof(tmp), "%c", f->subclass.integer); 00845 strncat(dtmf, tmp, sizeof(dtmf) - strlen(dtmf) - 1); 00846 /* If the maximum length of the DTMF has been reached, stop now */ 00847 if (max_dtmf_len && strlen(dtmf) == max_dtmf_len) 00848 done = 1; 00849 } 00850 break; 00851 case AST_FRAME_CONTROL: 00852 switch (f->subclass.integer) { 00853 case AST_CONTROL_HANGUP: 00854 /* Since they hung up we should destroy the speech structure */ 00855 done = 3; 00856 default: 00857 break; 00858 } 00859 default: 00860 break; 00861 } 00862 ast_frfree(f); 00863 f = NULL; 00864 } 00865 } 00866 00867 if (!ast_strlen_zero(dtmf)) { 00868 /* We sort of make a results entry */ 00869 speech->results = ast_calloc(1, sizeof(*speech->results)); 00870 if (speech->results != NULL) { 00871 ast_speech_dtmf(speech, dtmf); 00872 speech->results->score = 1000; 00873 speech->results->text = ast_strdup(dtmf); 00874 speech->results->grammar = ast_strdup("dtmf"); 00875 } 00876 ast_speech_change_state(speech, AST_SPEECH_STATE_NOT_READY); 00877 } 00878 00879 /* See if it was because they hung up */ 00880 if (done == 3) { 00881 /* Destroy speech structure */ 00882 ast_speech_destroy(speech); 00883 datastore = ast_channel_datastore_find(chan, &speech_datastore, NULL); 00884 if (datastore != NULL) 00885 ast_channel_datastore_remove(chan, datastore); 00886 } else { 00887 /* Channel is okay so restore read format */ 00888 ast_set_read_format(chan, oldreadformat); 00889 } 00890 00891 return 0; 00892 }
static int speech_create | ( | struct ast_channel * | chan, | |
const char * | data | |||
) | [static] |
SpeechCreate() Dialplan Application.
Definition at line 488 of file app_speech_utils.c.
References ast_channel_datastore_add(), ast_datastore_alloc, ast_speech_destroy(), ast_speech_new(), ast_datastore::data, ast_channel::nativeformats, pbx_builtin_setvar_helper(), and speech_datastore.
Referenced by load_module().
00489 { 00490 struct ast_speech *speech = NULL; 00491 struct ast_datastore *datastore = NULL; 00492 00493 /* Request a speech object */ 00494 speech = ast_speech_new(data, chan->nativeformats); 00495 if (speech == NULL) { 00496 /* Not available */ 00497 pbx_builtin_setvar_helper(chan, "ERROR", "1"); 00498 return 0; 00499 } 00500 00501 datastore = ast_datastore_alloc(&speech_datastore, NULL); 00502 if (datastore == NULL) { 00503 ast_speech_destroy(speech); 00504 pbx_builtin_setvar_helper(chan, "ERROR", "1"); 00505 return 0; 00506 } 00507 pbx_builtin_setvar_helper(chan, "ERROR", NULL); 00508 datastore->data = speech; 00509 ast_channel_datastore_add(chan, datastore); 00510 00511 return 0; 00512 }
static int speech_deactivate | ( | struct ast_channel * | chan, | |
const char * | data | |||
) | [static] |
SpeechDeactivateGrammar(Grammar Name) Dialplan Application.
Definition at line 556 of file app_speech_utils.c.
References ast_speech_grammar_deactivate(), and find_speech().
Referenced by load_module().
00557 { 00558 int res = 0; 00559 struct ast_speech *speech = find_speech(chan); 00560 00561 if (speech == NULL) 00562 return -1; 00563 00564 /* Deactivate the grammar on the speech object */ 00565 res = ast_speech_grammar_deactivate(speech, data); 00566 00567 return res; 00568 }
static int speech_destroy | ( | struct ast_channel * | chan, | |
const char * | data | |||
) | [static] |
SpeechDestroy() Dialplan Application.
Definition at line 896 of file app_speech_utils.c.
References ast_channel_datastore_find(), ast_channel_datastore_remove(), ast_speech_destroy(), find_speech(), and speech_datastore.
Referenced by load_module().
00897 { 00898 int res = 0; 00899 struct ast_speech *speech = find_speech(chan); 00900 struct ast_datastore *datastore = NULL; 00901 00902 if (speech == NULL) 00903 return -1; 00904 00905 /* Destroy speech structure */ 00906 ast_speech_destroy(speech); 00907 00908 datastore = ast_channel_datastore_find(chan, &speech_datastore, NULL); 00909 if (datastore != NULL) { 00910 ast_channel_datastore_remove(chan, datastore); 00911 } 00912 00913 return res; 00914 }
static int speech_engine_write | ( | struct ast_channel * | chan, | |
const char * | cmd, | |||
char * | data, | |||
const char * | value | |||
) | [static] |
SPEECH_ENGINE() Dialplan Function.
Definition at line 396 of file app_speech_utils.c.
References ast_speech_change(), and find_speech().
00397 { 00398 struct ast_speech *speech = find_speech(chan); 00399 00400 if (data == NULL || speech == NULL) { 00401 return -1; 00402 } 00403 00404 ast_speech_change(speech, data, value); 00405 00406 return 0; 00407 }
static int speech_grammar | ( | struct ast_channel * | chan, | |
const char * | cmd, | |||
char * | data, | |||
char * | buf, | |||
size_t | len | |||
) | [static] |
SPEECH_GRAMMAR() Dialplan Function.
Definition at line 370 of file app_speech_utils.c.
References ast_copy_string(), find_result(), find_speech(), ast_speech_result::grammar, and ast_speech::results.
00372 { 00373 struct ast_speech_result *result = NULL; 00374 struct ast_speech *speech = find_speech(chan); 00375 00376 if (data == NULL || speech == NULL || !(result = find_result(speech->results, data))) { 00377 return -1; 00378 } 00379 00380 if (result->grammar != NULL) { 00381 ast_copy_string(buf, result->grammar, len); 00382 } else { 00383 buf[0] = '\0'; 00384 } 00385 00386 return 0; 00387 }
static int speech_load | ( | struct ast_channel * | chan, | |
const char * | vdata | |||
) | [static] |
SpeechLoadGrammar(Grammar Name,Path) Dialplan Application.
Definition at line 515 of file app_speech_utils.c.
References args, AST_APP_ARG, AST_DECLARE_APP_ARGS, ast_speech_grammar_load(), AST_STANDARD_APP_ARGS, ast_strdupa, ast_speech::data, and find_speech().
Referenced by load_module().
00516 { 00517 int res = 0; 00518 struct ast_speech *speech = find_speech(chan); 00519 char *data; 00520 AST_DECLARE_APP_ARGS(args, 00521 AST_APP_ARG(grammar); 00522 AST_APP_ARG(path); 00523 ); 00524 00525 data = ast_strdupa(vdata); 00526 AST_STANDARD_APP_ARGS(args, data); 00527 00528 if (speech == NULL) 00529 return -1; 00530 00531 if (args.argc != 2) 00532 return -1; 00533 00534 /* Load the grammar locally on the object */ 00535 res = ast_speech_grammar_load(speech, args.grammar, args.path); 00536 00537 return res; 00538 }
static int speech_processing_sound | ( | struct ast_channel * | chan, | |
const char * | data | |||
) | [static] |
SpeechProcessingSound(Sound File) Dialplan Application.
Definition at line 600 of file app_speech_utils.c.
References ast_free, ast_strdup, find_speech(), and ast_speech::processing_sound.
Referenced by load_module().
00601 { 00602 int res = 0; 00603 struct ast_speech *speech = find_speech(chan); 00604 00605 if (speech == NULL) 00606 return -1; 00607 00608 if (speech->processing_sound != NULL) { 00609 ast_free(speech->processing_sound); 00610 speech->processing_sound = NULL; 00611 } 00612 00613 speech->processing_sound = ast_strdup(data); 00614 00615 return res; 00616 }
static int speech_read | ( | struct ast_channel * | chan, | |
const char * | cmd, | |||
char * | data, | |||
char * | buf, | |||
size_t | len | |||
) | [static] |
SPEECH() Dialplan Function.
Definition at line 438 of file app_speech_utils.c.
References ast_copy_string(), AST_LIST_NEXT, AST_SPEECH_SPOKE, ast_test_flag, find_speech(), and ast_speech::results.
00440 { 00441 int results = 0; 00442 struct ast_speech_result *result = NULL; 00443 struct ast_speech *speech = find_speech(chan); 00444 char tmp[128] = ""; 00445 00446 /* Now go for the various options */ 00447 if (!strcasecmp(data, "status")) { 00448 if (speech != NULL) 00449 ast_copy_string(buf, "1", len); 00450 else 00451 ast_copy_string(buf, "0", len); 00452 return 0; 00453 } 00454 00455 /* Make sure we have a speech structure for everything else */ 00456 if (speech == NULL) { 00457 return -1; 00458 } 00459 00460 /* Check to see if they are checking for silence */ 00461 if (!strcasecmp(data, "spoke")) { 00462 if (ast_test_flag(speech, AST_SPEECH_SPOKE)) 00463 ast_copy_string(buf, "1", len); 00464 else 00465 ast_copy_string(buf, "0", len); 00466 } else if (!strcasecmp(data, "results")) { 00467 /* Count number of results */ 00468 for (result = speech->results; result; result = AST_LIST_NEXT(result, list)) 00469 results++; 00470 snprintf(tmp, sizeof(tmp), "%d", results); 00471 ast_copy_string(buf, tmp, len); 00472 } else { 00473 buf[0] = '\0'; 00474 } 00475 00476 return 0; 00477 }
static int speech_results_type_write | ( | struct ast_channel * | chan, | |
const char * | cmd, | |||
char * | data, | |||
const char * | value | |||
) | [static] |
SPEECH_RESULTS_TYPE() Dialplan Function.
Definition at line 416 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().
00417 { 00418 struct ast_speech *speech = find_speech(chan); 00419 00420 if (data == NULL || speech == NULL) 00421 return -1; 00422 00423 if (!strcasecmp(value, "normal")) 00424 ast_speech_change_results_type(speech, AST_SPEECH_RESULTS_TYPE_NORMAL); 00425 else if (!strcasecmp(value, "nbest")) 00426 ast_speech_change_results_type(speech, AST_SPEECH_RESULTS_TYPE_NBEST); 00427 00428 return 0; 00429 }
static int speech_score | ( | struct ast_channel * | chan, | |
const char * | cmd, | |||
char * | data, | |||
char * | buf, | |||
size_t | len | |||
) | [static] |
SPEECH_SCORE() Dialplan Function.
Definition at line 319 of file app_speech_utils.c.
References ast_copy_string(), find_result(), find_speech(), ast_speech::results, and ast_speech_result::score.
00321 { 00322 struct ast_speech_result *result = NULL; 00323 struct ast_speech *speech = find_speech(chan); 00324 char tmp[128] = ""; 00325 00326 if (data == NULL || speech == NULL || !(result = find_result(speech->results, data))) { 00327 return -1; 00328 } 00329 00330 snprintf(tmp, sizeof(tmp), "%d", result->score); 00331 00332 ast_copy_string(buf, tmp, len); 00333 00334 return 0; 00335 }
static int speech_start | ( | struct ast_channel * | chan, | |
const char * | data | |||
) | [static] |
SpeechStart() Dialplan Application.
Definition at line 586 of file app_speech_utils.c.
References ast_speech_start(), and find_speech().
Referenced by load_module().
00587 { 00588 int res = 0; 00589 struct ast_speech *speech = find_speech(chan); 00590 00591 if (speech == NULL) 00592 return -1; 00593 00594 ast_speech_start(speech); 00595 00596 return res; 00597 }
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 619 of file app_speech_utils.c.
References ast_applystream(), ast_openstream(), and ast_playstream().
Referenced by handle_speechrecognize(), and speech_background().
00620 { 00621 struct ast_filestream *fs = NULL; 00622 00623 if (!(fs = ast_openstream(chan, filename, preflang))) 00624 return -1; 00625 00626 if (ast_applystream(chan, fs)) 00627 return -1; 00628 00629 ast_playstream(fs); 00630 00631 return 0; 00632 }
static int speech_text | ( | struct ast_channel * | chan, | |
const char * | cmd, | |||
char * | data, | |||
char * | buf, | |||
size_t | len | |||
) | [static] |
SPEECH_TEXT() Dialplan Function.
Definition at line 344 of file app_speech_utils.c.
References ast_copy_string(), find_result(), find_speech(), ast_speech::results, and ast_speech_result::text.
00346 { 00347 struct ast_speech_result *result = NULL; 00348 struct ast_speech *speech = find_speech(chan); 00349 00350 if (data == NULL || speech == NULL || !(result = find_result(speech->results, data))) { 00351 return -1; 00352 } 00353 00354 if (result->text != NULL) { 00355 ast_copy_string(buf, result->text, len); 00356 } else { 00357 buf[0] = '\0'; 00358 } 00359 00360 return 0; 00361 }
static int speech_unload | ( | struct ast_channel * | chan, | |
const char * | data | |||
) | [static] |
SpeechUnloadGrammar(Grammar Name) Dialplan Application.
Definition at line 541 of file app_speech_utils.c.
References ast_speech_grammar_unload(), and find_speech().
Referenced by load_module().
00542 { 00543 int res = 0; 00544 struct ast_speech *speech = find_speech(chan); 00545 00546 if (speech == NULL) 00547 return -1; 00548 00549 /* Unload the grammar */ 00550 res = ast_speech_grammar_unload(speech, data); 00551 00552 return res; 00553 }
static int unload_module | ( | void | ) | [static] |
Definition at line 916 of file app_speech_utils.c.
References ast_custom_function_unregister(), ast_unregister_application(), speech_engine_function, speech_function, speech_grammar_function, speech_results_type_function, speech_score_function, and speech_text_function.
00917 { 00918 int res = 0; 00919 00920 res = ast_unregister_application("SpeechCreate"); 00921 res |= ast_unregister_application("SpeechLoadGrammar"); 00922 res |= ast_unregister_application("SpeechUnloadGrammar"); 00923 res |= ast_unregister_application("SpeechActivateGrammar"); 00924 res |= ast_unregister_application("SpeechDeactivateGrammar"); 00925 res |= ast_unregister_application("SpeechStart"); 00926 res |= ast_unregister_application("SpeechBackground"); 00927 res |= ast_unregister_application("SpeechDestroy"); 00928 res |= ast_unregister_application("SpeechProcessingSound"); 00929 res |= ast_custom_function_unregister(&speech_function); 00930 res |= ast_custom_function_unregister(&speech_score_function); 00931 res |= ast_custom_function_unregister(&speech_text_function); 00932 res |= ast_custom_function_unregister(&speech_grammar_function); 00933 res |= ast_custom_function_unregister(&speech_engine_function); 00934 res |= ast_custom_function_unregister(&speech_results_type_function); 00935 00936 return res; 00937 }
struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT , .description = "Dialplan Speech Applications" , .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 = "88eaa8f5c1bd988bedd71113385e0886" , .load = load_module, .unload = unload_module, .nonoptreq = "res_speech", } [static] |
Definition at line 966 of file app_speech_utils.c.
struct ast_module_info* ast_module_info = &__mod_info [static] |
Definition at line 966 of file app_speech_utils.c.
struct ast_app_option speech_background_options[128] = { [ 'n' ] = { .flag = SB_OPT_NOANSWER }, } [static] |
struct ast_datastore_info speech_datastore [static] |
Initial value:
{ .type = "speech", .destroy = destroy_callback }
Definition at line 268 of file app_speech_utils.c.
Referenced by find_speech(), speech_background(), speech_create(), and speech_destroy().
struct ast_custom_function speech_engine_function [static] |
Initial value:
{ .name = "SPEECH_ENGINE", .read = NULL, .write = speech_engine_write, }
Definition at line 409 of file app_speech_utils.c.
Referenced by load_module(), and unload_module().
struct ast_custom_function speech_function [static] |
Initial value:
{ .name = "SPEECH", .read = speech_read, .write = NULL, }
Definition at line 479 of file app_speech_utils.c.
Referenced by load_module(), and unload_module().
struct ast_custom_function speech_grammar_function [static] |
Initial value:
{ .name = "SPEECH_GRAMMAR", .read = speech_grammar, .write = NULL, }
Definition at line 389 of file app_speech_utils.c.
Referenced by load_module(), and unload_module().
struct ast_custom_function speech_results_type_function [static] |
Initial value:
{ .name = "SPEECH_RESULTS_TYPE", .read = NULL, .write = speech_results_type_write, }
Definition at line 431 of file app_speech_utils.c.
Referenced by load_module(), and unload_module().
struct ast_custom_function speech_score_function [static] |
Initial value:
{ .name = "SPEECH_SCORE", .read = speech_score, .write = NULL, }
Definition at line 337 of file app_speech_utils.c.
Referenced by load_module(), and unload_module().
struct ast_custom_function speech_text_function [static] |
Initial value:
{ .name = "SPEECH_TEXT", .read = speech_text, .write = NULL, }
Definition at line 363 of file app_speech_utils.c.
Referenced by load_module(), and unload_module().