]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
FS-7720 improve play_and_detect_speech to set current_application_response channel...
authorChris Rienzo <chris.rienzo@citrix.com>
Wed, 24 Jun 2015 15:50:53 +0000 (11:50 -0400)
committerChris Rienzo <chris.rienzo@citrix.com>
Wed, 24 Jun 2015 16:40:24 +0000 (12:40 -0400)
    "USAGE ERROR": bad application arguments
    "GRAMMAR ERROR": speech recognizer failed to load grammar
    "ASR INIT ERROR": speech recognizer failed to allocate a session
    "ERROR": any other errors

  This is useful for determining that play_and_detect_speech failed because the recognizer is out of licenses
  giving the developer a chance to fall back to traditional DTMF menu navigation.

src/mod/applications/mod_dptools/mod_dptools.c
src/switch_ivr_async.c

index a72a6b96af1724e10ffec92cd583a1150df1503b..0695b7e7c0c3665ab66690af62d01d46689068bb 100644 (file)
@@ -1,6 +1,6 @@
 /* 
  * FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
- * Copyright (C) 2005-2014, Anthony Minessale II <anthm@freeswitch.org>
+ * Copyright (C) 2005-2015, Anthony Minessale II <anthm@freeswitch.org>
  *
  * Version: MPL 1.1
  *
@@ -514,9 +514,17 @@ SWITCH_STANDARD_APP(play_and_detect_speech_function)
                char *engine = argv[0];
                char *grammar = argv[1];
                char *result = NULL;
-               switch_ivr_play_and_detect_speech(session, file, engine, grammar, &result, 0, NULL);
-               if (!zstr(result)) {
-                       switch_channel_set_variable(channel, "detect_speech_result", result);
+               switch_status_t status = switch_ivr_play_and_detect_speech(session, file, engine, grammar, &result, 0, NULL);
+               if (status == SWITCH_STATUS_SUCCESS) {
+                       if (!zstr(result)) {
+                               switch_channel_set_variable(channel, "detect_speech_result", result);
+                       }
+               } else if (status == SWITCH_STATUS_GENERR) {
+                       response = "GRAMMAR ERROR";
+               } else if (status == SWITCH_STATUS_NOT_INITALIZED) {
+                       response = "ASR INIT ERROR";
+               } else {
+                       response = "ERROR";
                }
        } else {
                /* bad input */
index 37f1168ea0b2e5bedd0278a0a71c4adfdba4456a..11b816b811362f6462a441cbbeec49a19b655042 100644 (file)
@@ -1,6 +1,6 @@
 /* 
  * FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
- * Copyright (C) 2005-2014, Anthony Minessale II <anthm@freeswitch.org>
+ * Copyright (C) 2005-2015, Anthony Minessale II <anthm@freeswitch.org>
  *
  * Version: MPL 1.1
  *
@@ -3950,7 +3950,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_play_and_detect_speech(switch_core_se
                                                                                                                                  uint32_t input_timeout,
                                                                                                                                  switch_input_args_t *args)
 {
-       switch_status_t status = SWITCH_STATUS_SUCCESS;
+       switch_status_t status = SWITCH_STATUS_FALSE;
        int recognizing = 0;
        switch_input_args_t myargs = { 0 };
        play_and_detect_speech_state_t state = { 0, "" };
@@ -3969,7 +3969,12 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_play_and_detect_speech(switch_core_se
        }
 
        /* start speech detection */
-       if (switch_ivr_detect_speech(session, mod_name, grammar, "", NULL, NULL) != SWITCH_STATUS_SUCCESS) {
+       if ((status = switch_ivr_detect_speech(session, mod_name, grammar, "", NULL, NULL)) != SWITCH_STATUS_SUCCESS) {
+               /* map SWITCH_STATUS_FALSE to SWITCH_STATUS_GENERR to indicate grammar load failed
+               SWITCH_STATUS_NOT_INITALIZED will be passed back to indicate ASR resource problem */
+               if (status == SWITCH_STATUS_FALSE) {
+                       status = SWITCH_STATUS_GENERR;
+               }
                goto done;
        }
        recognizing = 1;
@@ -3986,6 +3991,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_play_and_detect_speech(switch_core_se
        }
 
        if (status != SWITCH_STATUS_BREAK && status != SWITCH_STATUS_SUCCESS) {
+               status = SWITCH_STATUS_FALSE;
                goto done;
        }
 
@@ -4002,11 +4008,14 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_play_and_detect_speech(switch_core_se
                        }
 
                        if (status != SWITCH_STATUS_BREAK && status != SWITCH_STATUS_SUCCESS) {
+                               status = SWITCH_STATUS_FALSE;
                                goto done;
                        }
                }
        }
 
+
+
 done:
        if (recognizing && !(state.done & PLAY_AND_DETECT_DONE_RECOGNIZING)) {
                switch_ivr_pause_detect_speech(session);
@@ -4015,11 +4024,10 @@ done:
                switch_ivr_stop_detect_speech(session);
        }
 
-       *result = state.result;
-
-       if (!state.done) {
-               status = SWITCH_STATUS_FALSE;
+       if (state.done) {
+               status = SWITCH_STATUS_SUCCESS;
        }
+       *result = state.result;
 
        arg_recursion_check_stop(args);
 
@@ -4479,12 +4487,12 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_detect_speech(switch_core_session_t *
        if (!sth) {
                /* No speech thread handle available yet, init speech detection first. */
                if ((status = switch_ivr_detect_speech_init(session, mod_name, dest, ah)) != SWITCH_STATUS_SUCCESS) {
-                       return status;
+                       return SWITCH_STATUS_NOT_INITALIZED;
                }
 
                /* Fetch the new speech thread handle */
                if (!(sth = switch_channel_get_private(channel, SWITCH_SPEECH_KEY))) {
-                       return SWITCH_STATUS_FALSE;
+                       return SWITCH_STATUS_NOT_INITALIZED;
                }
        }