#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
} 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
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
{\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
{\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
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