Add the 'n' option to SpeechBackground, which has the application not answer the
authorRussell Bryant <russell@russellbryant.com>
Wed, 30 Jan 2008 00:04:17 +0000 (00:04 +0000)
committerRussell Bryant <russell@russellbryant.com>
Wed, 30 Jan 2008 00:04:17 +0000 (00:04 +0000)
channel if it has not already been answered.

(closes SPD-51)

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@101082 65c4cc65-6c06-0410-ace0-fbb531ad65f3

CHANGES
apps/app_speech_utils.c

diff --git a/CHANGES b/CHANGES
index c095f30..8d2ce86 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -467,6 +467,8 @@ Miscellaneous New Modules
      backend functionality.
   * Added a new module, res_config_ldap, which permits the use of an LDAP
      server for realtime data access.
+  * Added support for writing and running your dialplan in lua using the pgx_lua
+     module.  See configs/extensions.lua.sample for examples of how to do this.
 
 Miscellaneous 
 -------------
@@ -486,8 +488,6 @@ Miscellaneous
      will now be available in the failed extension using the REASON dialplan variable.
   * Added support for reading the TOUCH_MONITOR_PREFIX channel variable.
      It allows you to configure a prefix for auto-monitor recordings.
-  * Added support for writing and running your dialplan in lua.  See
-     configs/extensions.lua.sample for examples of how to do this.
   * A new extension pattern matching algorithm, based on a trie, is introduced
      here, that could noticeably speed up mid-sized to large dialplans.
      It is NOT used by default, as duplicating the behaviour of the old pattern
@@ -502,3 +502,5 @@ Miscellaneous
   * Added logging to 'make update' command.  See update.log
   * Added strictrtp option to rtp.conf. If enabled this will drop RTP packets that
      do not come from the remote party.
+  * Added the 'n' option to the SpeechBackground application to tell it to not
+     answer the channel if it has not already been answered.
index 327e792..2445955 100644 (file)
@@ -56,15 +56,17 @@ static char *speechstart_descrip =
 "fed to it. This has no arguments.\n";
 
 static char *speechbackground_descrip =
-"  SpeechBackground(Sound File,Timeout):\n"
+"  SpeechBackground(<Sound File>[,Timeout[,options]]):\n"
 "This application plays a sound file and waits for the person to speak. Once they start speaking playback\n"
 "of the file stops, and silence is heard. Once they stop talking the processing sound is played to indicate\n"
 "the speech recognition engine is working. Once results are available the application returns and results \n"
 "(score and text) are available using dialplan functions.\n"
-"The first text and score are ${SPEECH_TEXT(0)} AND ${SPEECH_SCORE(0)} while the second are ${SPEECH_TEXT(1)}\n"
+"  The first text and score are ${SPEECH_TEXT(0)} AND ${SPEECH_SCORE(0)} while the second are ${SPEECH_TEXT(1)}\n"
 "and ${SPEECH_SCORE(1)}.\n"
-"The first argument is the sound file and the second is the timeout integer in seconds. Note the timeout will\n"
-"only start once the sound file has stopped playing.\n";
+"  The first argument is the sound file and the second is the timeout integer in seconds. Note the timeout will\n"
+"only start once the sound file has stopped playing. The third argument specifies options:\n"
+"  Valid Options:\n"
+"    n - Don't answer the channel if it has not already been answered.\n";
 
 static char *speechdeactivategrammar_descrip =
 "  SpeechDeactivateGrammar(Grammar Name):\n"
@@ -487,6 +489,14 @@ static int speech_streamfile(struct ast_channel *chan, const char *filename, con
        return 0;
 }
 
+enum {
+       SB_OPT_NOANSWER = (1 << 0),
+};
+
+AST_APP_OPTIONS(speech_background_options, BEGIN_OPTIONS
+       AST_APP_OPTION('n', SB_OPT_NOANSWER),
+END_OPTIONS );
+
 /*! \brief SpeechBackground(Sound File,Timeout) Dialplan Application */
 static int speech_background(struct ast_channel *chan, void *data)
 {
@@ -500,9 +510,11 @@ static int speech_background(struct ast_channel *chan, void *data)
        struct ast_datastore *datastore = NULL;
        char *parse, *filename_tmp = NULL, *filename = NULL, tmp[2] = "", dtmf_terminator = '#';
        const char *tmp2 = NULL;
+       struct ast_flags options = { 0 };
        AST_DECLARE_APP_ARGS(args,
                AST_APP_ARG(soundfile);
                AST_APP_ARG(timeout);
+               AST_APP_ARG(options);
        );
 
        parse = ast_strdupa(data);
@@ -511,9 +523,16 @@ static int speech_background(struct ast_channel *chan, void *data)
        if (speech == NULL)
                return -1;
 
+       if (!ast_strlen_zero(args.options)) {
+               char *options_buf = ast_strdupa(args.options);
+               ast_app_parse_options(speech_background_options, &options, NULL, options_buf);
+       }
+
        /* If channel is not already answered, then answer it */
-       if (chan->_state != AST_STATE_UP && ast_answer(chan))
-               return -1;
+       if (chan->_state != AST_STATE_UP && !ast_test_flag(&options, SB_OPT_NOANSWER)
+               && ast_answer(chan)) {
+                       return -1;
+       }
 
        /* Record old read format */
        oldreadformat = chan->readformat;