]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
add common for asr and tts FLAG_HAS_MESSAGE to indicate there is a mrcp message to...
authorArsen Chaloyan <achaloyan@yahoo.com>
Wed, 22 Aug 2007 19:15:11 +0000 (19:15 +0000)
committerArsen Chaloyan <achaloyan@yahoo.com>
Wed, 22 Aug 2007 19:15:11 +0000 (19:15 +0000)
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@5660 d0543943-73ff-0310-b7d9-9358b9ac24b2

src/mod/asr_tts/mod_openmrcp/mod_openmrcp.c

index 26e6e560a0cd7a1cbc108d46d4ee15ed9e87dc0a..4bb336c83766cabd52823b9585c088412b5df743 100644 (file)
 #include "mrcp_recognizer.h"\r
 #include "mrcp_synthesizer.h"\r
 #include "mrcp_generic_header.h"\r
-#include "mrcp_resource_set.h"\r
 \r
 #include <switch.h>\r
        \r
-#define OPENMRCP_WAIT_TIMEOUT 5000\r
-#define MY_BUF_LEN 1024 * 128\r
-#define MY_BLOCK_SIZE MY_BUF_LEN\r
-\r
 SWITCH_MODULE_LOAD_FUNCTION(mod_openmrcp_load);\r
 SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_openmrcp_shutdown);\r
 SWITCH_MODULE_DEFINITION(mod_openmrcp, mod_openmrcp_load, \r
@@ -95,12 +90,9 @@ typedef struct {
 } openmrcp_session_t;\r
 \r
 typedef enum {\r
-       FLAG_HAS_TEXT =       (1 << 0),\r
-       FLAG_BARGE =          (1 << 1),\r
-       FLAG_READY =          (1 << 2),\r
-       FLAG_SPEAK_COMPLETE = (1 << 3),\r
-       FLAG_FEED_STARTED =   (1 << 4),\r
-       FLAG_TERMINATING =    (1 << 5)\r
+       FLAG_HAS_MESSAGE =    (1 << 0),\r
+       FLAG_FEED_STARTED =   (1 << 1),\r
+       FLAG_TERMINATING =    (1 << 2)\r
 } mrcp_flag_t;\r
 \r
 typedef struct {\r
@@ -220,38 +212,19 @@ static mrcp_status_t openmrcp_on_channel_modify(mrcp_client_context_t *context,
                return MRCP_STATUS_FAILURE;\r
        }\r
 \r
-       if (mrcp_message->start_line.message_type != MRCP_MESSAGE_TYPE_EVENT) {\r
+       if (mrcp_message->start_line.message_type == MRCP_MESSAGE_TYPE_RESPONSE && mrcp_message->start_line.request_state == MRCP_REQUEST_STATE_INPROGRESS) {\r
                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "ignoring mrcp response\n");\r
                return MRCP_STATUS_SUCCESS;\r
        }\r
 \r
-       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "mrcp msg body: %s\n", mrcp_message->body);\r
-\r
-       if (mrcp_message->channel_id.resource_id == MRCP_RESOURCE_RECOGNIZER) {\r
-               if (mrcp_message->start_line.method_id == RECOGNIZER_RECOGNITION_COMPLETE) {\r
-                       openmrcp_session->mrcp_message_last_rcvd = mrcp_message;\r
-                       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "setting FLAG_HAS_TEXT\n");\r
-                       switch_set_flag_locked(openmrcp_session, FLAG_HAS_TEXT);\r
-               }\r
-               else if (mrcp_message->start_line.method_id == RECOGNIZER_START_OF_INPUT) {\r
-                       openmrcp_session->mrcp_message_last_rcvd = mrcp_message;\r
-                       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "setting FLAG_BARGE\n");\r
-                       switch_set_flag_locked(openmrcp_session, FLAG_BARGE);\r
-               }\r
-               else {\r
-                       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "ignoring event: %s\n", mrcp_message->start_line.method_name);\r
-               }\r
-       }\r
-       else if(mrcp_message->channel_id.resource_id == MRCP_RESOURCE_SYNTHESIZER) {\r
-               if (mrcp_message->start_line.method_id == SYNTHESIZER_SPEAK_COMPLETE) {\r
-                       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "setting FLAG_SPEAK_COMPLETE\n");\r
-                       switch_set_flag_locked(openmrcp_session, FLAG_SPEAK_COMPLETE);\r
-               }\r
-               else {\r
-                       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "ignoring event: %s\n", mrcp_message->start_line.method_name);\r
-               }\r
+       if (switch_test_flag(openmrcp_session, FLAG_HAS_MESSAGE)) {\r
+               switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "already has message\n");\r
+               return MRCP_STATUS_SUCCESS;\r
        }\r
-               \r
+\r
+       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "setting FLAG_HAS_MESSAGE\n");\r
+       openmrcp_session->mrcp_message_last_rcvd = mrcp_message;\r
+       switch_set_flag_locked(openmrcp_session, FLAG_HAS_MESSAGE);\r
        return MRCP_STATUS_SUCCESS;\r
 }\r
 \r
@@ -473,8 +446,8 @@ static switch_status_t openmrcp_asr_check_results(switch_asr_handle_t *ah, switc
 {\r
        openmrcp_session_t *asr_session = (openmrcp_session_t *) ah->private_info;\r
        \r
-       switch_status_t rv = (switch_test_flag(asr_session, FLAG_HAS_TEXT) || switch_test_flag(asr_session, FLAG_BARGE)) ? SWITCH_STATUS_SUCCESS : SWITCH_STATUS_FALSE;\r
-       \r
+       switch_status_t rv = (switch_test_flag(asr_session, FLAG_HAS_MESSAGE)) ? SWITCH_STATUS_SUCCESS : SWITCH_STATUS_FALSE;\r
+\r
        return rv;\r
 }\r
 \r
@@ -483,50 +456,61 @@ static switch_status_t openmrcp_asr_get_results(switch_asr_handle_t *ah, char **
 {\r
        openmrcp_session_t *asr_session = (openmrcp_session_t *) ah->private_info;\r
        switch_status_t ret = SWITCH_STATUS_SUCCESS;\r
+       mrcp_message_t *message;\r
        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "openmrcp_asr_get_results called\n");\r
 \r
-       if (switch_test_flag(asr_session, FLAG_BARGE)) {\r
-               switch_clear_flag_locked(asr_session, FLAG_BARGE);\r
-               ret = SWITCH_STATUS_BREAK;\r
-       }\r
-       \r
-       if (switch_test_flag(asr_session, FLAG_HAS_TEXT)) {\r
-               /*! \r
-                  we have to extract the XML but stripping off the <?xml version="1.0"?>\r
-                  header.  the body looks like:\r
-               \r
-                  Completion-Cause:001 no-match\r
-                  Content-Type: application/nlsml+xml\r
-                  Content-Length: 260\r
-                \r
-                 <?xml version="1.0"?>\r
-          <result xmlns="http://www.ietf.org/xml/ns/mrcpv2" xmlns:ex="http://www.example.com/example" score="100" grammar="session:request1@form-level.store">\r
-            <interpretation>             <input mode="speech">open a</input>\r
-            </interpretation>\r
-          </result>\r
-               */\r
-\r
-               if(asr_session->mrcp_message_last_rcvd && asr_session->mrcp_message_last_rcvd->body) {\r
-                       char *marker = "?>";  // FIXME -- lame and brittle way of doing this.  use regex or better.\r
-                       char *position = strstr(asr_session->mrcp_message_last_rcvd->body, marker);\r
-                       if (!position) {\r
-                               switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Bad result received from mrcp server: %s", asr_session->mrcp_message_last_rcvd->body);\r
-                               ret = SWITCH_STATUS_FALSE;\r
+       message = asr_session->mrcp_message_last_rcvd;\r
+       asr_session->mrcp_message_last_rcvd = NULL;\r
+       // since we are returning our result here, future calls to check_results\r
+       // should return False\r
+       switch_clear_flag_locked(asr_session, FLAG_HAS_MESSAGE);\r
+\r
+       if (message->start_line.message_type == MRCP_MESSAGE_TYPE_RESPONSE) {\r
+               if (message->start_line.status_code != MRCP_STATUS_CODE_SUCCESS && \r
+                       message->start_line.status_code != MRCP_STATUS_CODE_SUCCESS_WITH_IGNORE) {\r
+                       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "error code received [%d]\n", message->start_line.status_code);\r
+                       ret = SWITCH_STATUS_FALSE;\r
+               }\r
+       } \r
+       else if (message->start_line.message_type == MRCP_MESSAGE_TYPE_EVENT) {\r
+               if (message->start_line.method_id == RECOGNIZER_RECOGNITION_COMPLETE) {\r
+                       /*! \r
+                          we have to extract the XML but stripping off the <?xml version="1.0"?>\r
+                          header.  the body looks like:\r
+                       \r
+                          Completion-Cause:001 no-match\r
+                          Content-Type: application/nlsml+xml\r
+                          Content-Length: 260\r
+                        \r
+                         <?xml version="1.0"?>\r
+                         <result xmlns="http://www.ietf.org/xml/ns/mrcpv2" xmlns:ex="http://www.example.com/example" score="100" grammar="session:request1@form-level.store">\r
+                               <interpretation>             <input mode="speech">open a</input>\r
+                               </interpretation>\r
+                         </result>\r
+                       */\r
+\r
+                       if(message->body) {\r
+                               char *marker = "?>";  // FIXME -- lame and brittle way of doing this.  use regex or better.\r
+                               char *position = strstr(message->body, marker);\r
+                               if (!position) {\r
+                                       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Bad result received from mrcp server: %s", message->body);\r
+                                       ret = SWITCH_STATUS_FALSE;\r
+                               }\r
+                               else {\r
+                                       position += strlen(marker);\r
+                                       *xmlstr = strdup(position);\r
+                               }\r
                        }\r
                        else {\r
-                               position += strlen(marker);\r
-                               *xmlstr = strdup(position);\r
+                               switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "No result received from mrcp server\n");\r
+                               ret = SWITCH_STATUS_FALSE;\r
                        }\r
-               }\r
-               else {\r
-                       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "No result received from mrcp server\n");\r
-                       ret = SWITCH_STATUS_FALSE;\r
-               }\r
 \r
-               // since we are returning our result here, future calls to check_results\r
-               // should return False\r
-               switch_clear_flag_locked(asr_session, FLAG_HAS_TEXT);\r
-               ret = SWITCH_STATUS_SUCCESS;    \r
+                       ret = SWITCH_STATUS_SUCCESS;    \r
+               } \r
+               else if (message->start_line.method_id == RECOGNIZER_START_OF_INPUT) {\r
+                       ret = SWITCH_STATUS_BREAK;\r
+               }\r
        }\r
        return ret;\r
 }\r
@@ -658,10 +642,25 @@ static switch_status_t openmrcp_read_tts(switch_speech_handle_t *sh, void *data,
        media_frame_t media_frame;\r
        audio_source_t *audio_source;\r
 \r
-       if (switch_test_flag(tts_session, FLAG_SPEAK_COMPLETE)) {\r
-               /* tell fs we are done */\r
-               switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "FLAG_SPEAK_COMPLETE\n");\r
-               return SWITCH_STATUS_BREAK;\r
+       if (switch_test_flag(tts_session, FLAG_HAS_MESSAGE)) {\r
+               mrcp_message_t *message = tts_session->mrcp_message_last_rcvd;\r
+               tts_session->mrcp_message_last_rcvd = NULL;\r
+               switch_clear_flag_locked(tts_session, FLAG_HAS_MESSAGE);\r
+\r
+               if (message->start_line.message_type == MRCP_MESSAGE_TYPE_RESPONSE) {\r
+                       if (message->start_line.status_code != MRCP_STATUS_CODE_SUCCESS && \r
+                               message->start_line.status_code != MRCP_STATUS_CODE_SUCCESS_WITH_IGNORE) {\r
+                               switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "error code received [%d]\n", message->start_line.status_code);\r
+                               return SWITCH_STATUS_BREAK;\r
+                       }\r
+               } \r
+               else if (message->start_line.message_type == MRCP_MESSAGE_TYPE_EVENT) {\r
+                       if (message->start_line.method_id == SYNTHESIZER_SPEAK_COMPLETE) {\r
+                               /* tell fs we are done */\r
+                               switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "FLAG_SPEAK_COMPLETE\n");\r
+                               return SWITCH_STATUS_BREAK;\r
+                       }\r
+               }\r
        }\r
 \r
        audio_source = mrcp_client_audio_source_get(tts_session->audio_channel);\r